1. 程式人生 > >高級類特性----內部類

高級類特性----內部類

[] hand stat 類名 外部 靜態內部類 throwable handle int

內部類


在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 }

高級類特性----內部類