內部類是指在一個外部類的內部再定義一個類。內部類是一個編譯時的概念,一旦編譯成功,就會成爲完全不同的兩類。對於一個名爲outer的外部類和其內部定義的名爲inner的內部類。編譯完成後出現outer.class和outer$inner.class兩類。所以內部類的成員變量/方法名可以和外部類的相同。
一,成員內部類:
成員內部類,就是作爲外部類的成員,可以直接使用外部類的所有成員和方法,即使是private的。同時外部類要訪問內部類的所有成員變量/方法,則需要通過內部類的對象來獲取。要注意的是,成員內部類不能含有static的變量和方法。因爲成員內部類需要先創建了外部類,才能創建它自己的。創建內部類對象,可以使用outer.inner obj = outerobj.new inner();
public class Outer {
public class Inner {
public void print(String str) {
System.out.println(str);
}
}
public Inner getInner() {
return new Inner();
}
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print("Outer.new");
inner = outer.getInner();
inner.print("Outer.get");
}
}
運行結果:
Outer.new
Outer.get
二,局部內部類:
局部內部類是定義在一個方法或者一個作用域裏面的類,它和成員內部類的區別在於局部內部類的訪問僅限於方法內或者該作用域內。
class People{
public People() {
}
}
class Man{
public Man(){
}
public People getWoman(){
class Woman extends People{ //局部內部類
int age =0;
}
return new Woman();
}
}
三、靜態內部類
靜態內部類也是定義在另一個類裏面的類,只不過在類的前面多了一個關鍵字static。靜態內部類是不需要依賴於外部類的,這點和類的靜態成員屬性有點類似,並且它不能使用外部類的非static成員變量或者方法,這點很好理解,因爲在沒有外部類的對象的情況下,可以創建靜態內部類的對象,如果允許訪問外部類的非static成員就會產生矛盾,因爲外部類的非static成員必須依附於具體的對象。
class Outter {
public Outter() {
System.out.println("Outter constructor.");
}
static class Inner {
public Inner() {
System.out.println("Inner constructor.");
}
}
}
public class Test {
public static void main(String[] args) {
Outter.Inner inner = new Outter.Inner();
}
}
運行結果:
Inner constructor.
四、匿名內部類
顧名思義,匿名內部類是沒有名字的內部類。因爲沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫。使用匿名內部類有個前提條件:必須繼承一個父類或實現一個接口。
abstract class Person {
public abstract void eat();
}
public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}