內部類的介紹,個人總結!

內部類分爲:成員內部類,局部內部類,靜態內部類,匿名內部類

下面分別介紹這幾種類的禁忌

 

成員內部類:

一個類中直接定義的內部類,成員內部類與普通類的成員沒什麼區別,可以與普通成員一樣進行修飾和限制

不能的點:1.不能含有static的變量和方法

                   2.可以訪問外部類的所有成員

                   3.內部類和外部類的實例變量可以共存

package com.test;

public class Outer {
    private static int number = 100;
    private int j= 20;//共存的變量
    private String name = "Java";

    public static void outer_funOne(){
        System.out.println("外部類Outer的靜態方法:outer_funOne");
    }

    public void outer_funTwo(){
        System.out.println("外部類的普通方法:outer_funTwo");
    }

    //成員內部類,可以訪問外部類的所有成員
    class Demo{
        //內部類不允許定義靜態變量
        //static int demo_i = 100;
        //內部類和外部類的實例變量可以共存        
        int j =50; 

        //成員內部類中的方法定義
        public void demo_funOne(){
            //內部類中訪問內部類自己的變量直接用變量名
            //也可以用  this.j
            System.out.println(j);

            //內部類中訪問外部類的成員變量語法:外部類類名.this.變量名
            System.out.println("內部類訪問外部類變量:"+Outer.this.j);

            //如果內部類中沒有與外部類中有相同的變量,則可以直接用變量名使用
            System.out.println(name);

            //內部類調用外部類方法
            outer_funOne();  //靜態方法
            outer_funTwo();  //非靜態方法

        }

    }


    public static void outer_funThree(){
        //外部類靜態方法訪問成員內部類
        // 1、建立外部類對象
        Outer out = new Outer();
        //  2、根據外部類建立內部類對象
        Demo demo = out.new Demo();
        // 訪問內部類方法
        demo.demo_funOne();
        //訪問內部類字段
        System.out.println("內部類成員字段:"+demo.j);
    }

    public static void main(String[] args) {
        //調用內部類的方法
        // 1、創建外部類對象
        Outer out = new Outer();
        // 2、通過外部類對象創建內部類對象
        Outer.Demo demo = out.new Demo();

        // 1、2步簡寫
        // Outer.Demo demo1 = new Outer().new Demo();

        //方法調用
        demo.demo_funOne();

    }

}

 局部內部類:

方法中定義的內部類,稱爲局部內部類。

禁忌點:

1.不能有訪問說明符(public,protected,private)

2.只能在定義該內部類的方法內實例化

3.局部內部類對象不能用該內部類所在的方法的final局部變量

package com.test;

public class Outer {
    private static int number = 100;
    private int j = 20;
    private String name = "Java";

    //定義外部類方法
    public void outer_funOne(int k){
        final int number = 100;
        int j = 50;

        //方法內部的類(局部內部類)
        class Demo{
            public Demo(int k){
                demo_funOne(k);
            }

            //可以定義與外部類同名的變量
            int number = 300; 
            //不可以定義靜態變量
            // static int j = 10;  

            //內部類的方法
            public void demo_funOne(int k){
                System.out.println("內部類方法:demo_funOne");
                //訪問外部類的變量,如果沒有與內部類同名的變量,則可直接用變量名
                System.out.println(name);
                //訪問外部類與內部類同名的變量
                System.out.println(Outer.this.number);
                System.out.println("內部類方法傳入的參數是:"+k);
            }
        }

        new Demo(k);
    }




    public static void main(String[] args) {
        //訪問內部類必須要先有外部類對象
        Outer out = new Outer();
        out.outer_funOne(11);
    }

}

靜態內部類:

顧名思義,在內部類加上static。不需要內部類對象外圍類對象之間有聯繫,則用靜態內部類。

禁忌點:

1.不用外圍類的對象

2.不可訪問非靜態的外圍類對象。

package com.test;

public class Outer {
    private static int number = 100;
    private int j = 20;
    private String name = "Java";

    public static void outer_funOne(){
        System.out.println("外部類靜態方法:outer_funOne");
    }

    public void outer_funTwo(){

    }

    //靜態內部類可以用public、protected、private修飾
    //靜態內部類可以定義靜態類或非靜態內部類
    private static class Demo{
        static int j = 100;
        String name = "C#";

        //靜態內部類裏的靜態方法
        static void demo_funOne(){
            //靜態內部類只能訪問外部類的靜態成員(靜態變量、靜態方法)
            System.out.println("靜態內部類訪問外部類靜態變量:"+number);
            //訪問外部類靜態方法
            outer_funOne();

        }

        //靜態內部類非靜態方法
        void demo_funTwo(){

        }

    }

    public void outer_funThree(){
        //外部類訪問內部類靜態成員:內部類.靜態成員
        System.out.println(Demo.j);
        //訪問靜態方法
        Demo.demo_funOne();
        //訪問靜態內部類的非靜態成員,實例化內部類即可
        Demo demo = new Demo();
        //訪問非靜態變量
        System.out.println(demo.name);
        //訪問非靜態方法
        demo.demo_funTwo();

    }


    public static void main(String[] args) {
        new Outer().outer_funThree();
    }

}

匿名內部類:

沒有名字內部類就叫匿名內部類。

適用條件:

1.只用到類的一個實例。

2.類在定義後馬上用到

3.類很小

禁忌點:

1.匿名內部類中不能有構造方法

2.不能定義任何靜態成員/方法/類

3.匿名內部類不能是 public,protected,private,static

4.只能創建匿名內部類的一個實例

5.局部內部類的限制都對其有效

6.匿名內部類一定是在new的後面,用其實現一個接口或一個類。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章