Java 的內部類
在Java中,允許一個類的定義位于另一個類的內部,前者稱為內部類,后者稱為外部類。
Inner class一般用在定義它的類或語句塊之內,在外部引用它時必須給出完整的名稱。
Inner class的名字不能與包含它的類名相同;
lInner class可以使用外部類的私有數據,因為它是外部類的成員,同一個類的成員之間可相互訪問。而外部類要訪問內部類中的成員需要:內部類.成員或者內部類對象.成員。
分類:成員內部類(static成員內部類和非static成員內部類)
局部內部類(不談修飾符)、匿名內部類
class A {private int s;public class B{public void mb() {s = 100; System.out.println("在內部類B中s=" + s);} }public void ma() {B i = new B();i.mb();}
}public class Test { public static void main(String args[]){A o = new A();o.ma();}
}
內部類特性
- Inner class作為類的成員:
- 可以聲明為final的
- 和外部類不同,Innerclass可聲明為private或protected;
- Innerclass 可以聲明為static的,但此時就不能再使用外層類的非static的成員變量;
- lInner class作為類:
- 可以聲明為abstract類,因此可以被其它的內部類繼承
- 【注意】非static的內部類中的成員不能聲明為static的,只有在外部類或static的內部類中才可聲明static成員。
匿名內部類
匿名內部類不能定義任何靜態成員、方法和類,只能創建匿名內部類的一個實例。一個匿名內部類一定是在new的后面,用其隱含實現一個接口或實現一個類。
new 父類構造器(實參列表)|實現接口(){
? //匿名內部類的類體部分
}
interface A{public abstract void fun1();
}
public class Outer{public static void main(String[] args) {new Outer().callInner(new A(){//接口是不能new但此處比較特殊是子類對象實現接口,只不過沒有為對象取名public void fun1() {System.out.println(“implement for fun1");}});// 兩步寫成一步了}public void callInner(A a) {a.fun1();}
}