內部類

內部類(nested classes),面向對象程式設計中,可以在一個類的內部定義另一個類。嵌套類分為兩種,即靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為內部類(inner)。內部類是JAVA語言的主要附加部分。內部類幾乎可以處於一個類內部任何位置,可以與實例變數處於同一級,或處於方法之內,甚至是一個表達式的一部分。

定義,表現形式,優點,訪問類型,訪問內容,

定義

內部類是JAVA語言的主要附加部分。嵌套類從JDK1.1開始引入。其中inner類又可分為三種:
其一、在一個類(外部類)中直接定義的內部類;
其二、在一個方法(外部類的方法)中定義的內部類;
其三、匿名內部類。

表現形式

⒊局部內部類
⒋匿名內部類

優點

⒈ 內部類對象可以訪問創建它的對象的實現,包括私有數據;
⒉ 內部類不為同一包的其他類所見,具有很好的封裝性;
⒊ 使用內部類可以很方便的編寫事件驅動程式;
⒋ 匿名內部類可以方便的定義運行時回調
5.內部類可以方便的定義
public class InnerTest {    private String tan = "實例變數";    private static String weizheng = "靜態變數";    private static String niubi = "外部類的類變數";    public void test() {        /**非靜態方法裡的內部類 */        class MethodInnerClass {            @Override            public String toString() {                // 非靜態方法裡無法訪問實例的外部變數                System.out.println("非靜態方法的內部類可以訪問外部類的實例變數:" + instAtt);                System.out.println("非靜態方法的內部類可以訪問外部類的靜態變數:" + staticAtt);                // 非靜態方法裡無法訪問方法的非final的變數//                 System.out.println(methodAtt);                System.out.println("非靜態方法的內部類可以訪問方法的final變數:" + methodFinalAtt);                return "my nick name is white";            }        }        new MethodInnerClass().toString();        System.out.println("-------------我是007的分隔設定-------------");        /**非靜態方法的匿名內部類*/        new Object() {            @Override            public String toString() {                System.out.println("非靜態方法的匿名內部類可以訪問外部類的實例變數:" + instAtt);                System.out.println("非靜態方法的匿名內部類可以訪問外部類的靜態變數:" + staticAtt);                // 非靜態方法裡匿名內部類無法訪問方法的非final的變數                // System.out.println(methodAtt);                System.out.println("非靜態方法的匿名內部類可以訪問方法的final變數:" + methodFinalAtt);                return "我是匿名內部類";            }        }.toString();    }    public static void main(String[] args) {        int methodAtt = 1;        final int methodFinalAtt = 2;        /**靜態方法裡的內部類*/        class MethodInnerClass {            @Override            public String toString() {                // 靜態方法裡無法訪問實例的外部變數                // System.out.println(instAtt);                System.out.println("靜態方法的內部類可以訪問外部類的靜態變數:" + staticAtt);                // 靜態方法裡無法訪問方法的非final的變數                // System.out.println(methodAtt);                System.out.println("靜態方法的內部類可以訪問方法的final變數:" + methodFinalAtt);                return "my nick name is white";            }        }        new MethodInnerClass().toString();        /**靜態方法的匿名內部類*/        new Object() {            @Override            public String toString() {                // 靜態方法的匿名內部類不能訪問外部類的非靜態變數                // System.out.println("非靜態方法的匿名內部類可以訪問外部類的非靜態變數:"+instAtt);                System.out.println("非靜態方法的匿名內部類可以訪問外部類的靜態變數:" + staticAtt);                // 靜態方法裡匿名內部類無法訪問方法的非final的變數                // System.out.println(methodAtt);                System.out.println("非靜態方法的匿名內部類可以訪問方法的final變數:" + methodFinalAtt);                return "我是匿名內部類";            }        }.toString();        new InnerTest().test();        // 建立靜態內部類(staticInnerClass)的對象        ImOutClass.StaticInnerClass staticIC = new ImOutClass.StaticInnerClass();        staticIC.access();        /**         * 建立非靜態內部類(non-staticInnerClass)的對象.         * 注意這種建立對象的格式首先創建外部類的對象然後使用對象.new來創建。         */        ImOutClass outC = new ImOutClass();        ImOutClass.InstInnerClass inC = outC.new InstInnerClass();        inC.access();    }}class ImOutClass {    private static String staticAtt = "外部類的類變數";    private String instAtt = "外部類的實例變數";    private static String xx = "外部靜態變數";    // privateStringxx="外部類的實例變數";    // 外部類的非靜態方法    public void instanMethod() {        System.out.println("和外部類實例方法");    }    // 外部類的靜態方法    public static void staticMethod() {        System.out.println("和外部類靜態方法");    }    /** 靜態內部類(staticInnerClass)*/    public static class StaticInnerClass {        public static void InnerClass() {            System.out.println("我是靜態內部類");        }        public void access() {            System.out.println("我可以訪問" + staticAtt);            staticMethod();            System.out.println("我可以訪問外部的靜態變數" + xx);            // 非靜態的方法instanMethod()無法從靜態的地方使用            // instanMethod();        }    }    /** 非靜態內部類(non-staticInnerClass)*/    public class InstInnerClass {        public InstInnerClass() {            System.out.println("我是成員級內部類,非靜態內部類");        }        public void access() {            System.out.println("我可以訪問" + instAtt);            instanMethod();            staticMethod();            System.out.println("我可以訪問外部的靜態變數" + xx);        }    }}

訪問類型

靜態方法的內部類可以訪問外部類的靜態變數:靜態變數
靜態方法的內部類可以訪問方法的final變數:2
靜態方法的匿名內部類可以訪問外部類的靜態變數:靜態變數
靜態方法的匿名內部類可以訪問方法的final變數:2
靜態方法的內部類可以訪問外部類的實例變數:實例變數
非靜態方法的內部類可以訪問外部類的靜態變數:靜態變數
非靜態方法的內部類可以訪問方法的final變數:2
非靜態方法的匿名內部類可以訪問外部類的實例變數:實例變數
非靜態方法的匿名內部類可以訪問外部類的靜態變數:靜態變數
非靜態方法的匿名內部類可以訪問方法的final變數:2

訪問內容

我可以訪問 外部類的類的靜態成員
我是成員級內部類,非靜態內部類
我可以訪問外部類的實例變數靜態變數和常量

相關詞條

熱門詞條

聯絡我們