高級類特性----內部類
內部類
在Java中,允許一個類的定義位於另一個類的內部,前者稱為內部類。
內部類和外層封裝它的類之間存在邏輯上的所屬關系
Inner class一般用在定義它的類或語句塊之內,在外部引用它時必須給出完整的名稱。 Inner class的名字不能與包含它的類名相同;
Inner class可以使用包含它的類的靜態和實例成員變量,也可以使用它所在方法的局部變量。
內部類舉例
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();
}
}
public class A{
private int s = 111;
public class B {
private int s = 222;
public void mb(int s) {
System.out.println(s); // 局部變量s
System.out.println(this.s); // 內部類對象的屬性s
System.out.println(A.this.s); // 外層類對象屬性s
}
}
public static void main(String args[]){
A a = new A();
A.B b = a.new B();
b.mb(333);
}
}
內部類特性
Inner class可以聲明為抽象類 ,因此可以被其它的內部類繼承。也可以聲明為final的。
和外層類不同,Inner class可以聲明為private或protected;
Inner class 可以聲明為static的,但此時就不能再使用外層封裝類的非static的成員變量;
非static的內部類中的成員不能聲明為static的,只有在頂層類或static的內部類中才可聲明static成員。
1 public class OuterClass { 2 int age; 3 4 static class StaticInnerClass{ 5 void test(){ 6 //System.out.println(age); 7 } 8 } 9 10 static String name = "-1"; 11 12 //1. 在類的內部定義的類稱為內部類 13 //2. 內部類相當於類的一個成員, 可以修飾類的成員的, private, static, final, abstract 都可以修飾內部類 14 class InnerClass{ 15 String name = "0"; 16 17 public void test(){ 18 String name = "1"; 19 20 System.out.println(name); //1 21 System.out.println(this.name); //0 22 //5. 內部類引用外部類的成員 23 System.out.println(OuterClass.this.name); //-1 24 } 25 } 26 }
1 public class TestInnerClass { 2 public static void main(String[] args) { 3 4 //4. 靜態內部類的創建: 不再需要外部類的實例. 5 OuterClass.StaticInnerClass sic = new OuterClass.StaticInnerClass(); 6 7 //3. 非靜態內部類的創建, 先創建外部類的實例, 再通過 外部類名.new 創建內部類的實例. 8 OuterClass oc = new OuterClass(); 9 OuterClass.InnerClass in = oc.new InnerClass(); 10 in.test(); 11 12 //6. 匿名內部類對象: 使用某一個接口通常是 先創建接口的實現類, 再創建其實現類的對象. 13 Proxy.newProxyInstance(null, null, new InvocationHandler() { 14 15 @Override 16 public Object invoke(Object proxy, Method method, Object[] args) 17 throws Throwable { 18 // TODO Auto-generated method stub 19 return null; 20 } 21 }); 22 // 還可以, 直接創建其實現類對象. 23 InvocationHandler invocationHandler = new InvocationHandler() { 24 @Override 25 public Object invoke(Object proxy, Method method, Object[] args) 26 throws Throwable { 27 return null; 28 } 29 }; 30 } 31 }
高級類特性----內部類