C語言中文網 目錄

Java內部類:Java實例內部類

實例內部類是指沒有用 static 修飾的內部類。示例代碼如下:
public class Outer
{
    class Inner
    {
        //實例內部類
    }
}

上述示例中的 Inner 類就是實例內部類。實例內部類有如下特點。

(1) 在外部類的靜態方法和外部類以外的其他類中,必須通過外部類的實例創建內部類的實例。
public class Outer
{
    class Inner1{}
    Inner1 i=new Inner1();    //不需要創建外部類實例
    public void method1()
    {
        Inner1 i=new Inner1();    //不需要創建外部類實例
    }
    public static void method2()
    {
        Inner1 i=new Outer().new inner1();    //需要創建外部類實例
    }
    class Inner2
    {
        Inner1 i=new Inner1();    //不需要創建外部類實例
    }
}
class OtherClass
{
    Outer.Inner i=new Outer().new Inner();    //需要創建外部類實例
}

(2) 在實例內部類中,可以訪問外部類的所有成員。
public class Outer
{
    public int a=100;
    static int b=100;
    final int c=100;
    private int d=100;
    public String method1()
    {
        return "實例方法1";
    }
    public static String method2()
    {
        return "靜態方法2";
    }
    class Inner
    {
        int a2=a+1;    //訪問public的a
        int b2=b+1;    //訪問static的b
        int c2=c+1;    //訪問final的c
        int d2=d+1;    //訪問private的d
        String str1=method1();    //訪問實例方法method1
        String str2=method2();    //訪問靜態方法method2
    }
    public static void main(String[] args)
    {
        Inner i=new Outer().new Inner();    //創建內部類實例
        System.out.println(i.a2);    //輸出101
        System.out.println(i.b2);    //輸出101
        System.out.println(i.c2);    //輸出101
        System.out.println(i.d2);    //輸出101
        System.out.println(i.strl);    //輸出實例方法1
        System.out.println(i.str2);    //輸出靜態方法2
    }
}

提示:如果有多層嵌套,則內部類可以訪問所有外部類的成員。

(3) 在外部類中不能直接訪問內部類的成員,而必須通過內部類的實例去訪問。如果類 A 包含內部類 B,類 B 中包含內部類 C,則在類 A 中不能直接訪問類 C,而應該通過類 B 的實例去訪問類 C。

(4) 外部類實例與內部類實例是一對多的關系,也就是說一個內部類實例只對應一個外部類實例,而一個外部類實例則可以對應多個內部類實例。

如果實例內部類 B 與外部類 A 包含有同名的成員 t,則在類 B 中 t 和 this.t 都表示 B 中的成員 t,而 A.this.t 表示 A 中的成員 t。
public class Outer
{
    int a=10;
    class Inner
    {
        int a=20;
        int b1=a;
        int b2=this.a;
        int b3=Outer.this.a;
    }
    public static void main(String[] args)
    {
        Inner i=new Outer().new Inner();
        System.out.println(i.b1);    //輸出20
        System.out.println(i.b2);    //輸出20
        System.out.println(i.b3);    //輸出10
    }
}

(5) 在實例內部類中不能定義 static 成員,除非同時使用 final 和 static 修飾。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo