內部類和外部類的區別和聯系


其實外部類和內部類是一個相對的定義
類A中有類B,那么類A自然就是外部類了,類B就是內部類。


外部類的訪問權限只有兩種:public和(default)。
但是內部類因類型不同所以對應的訪問權限也不一樣。


內部類可以使用外部類的任何變量和方法,但是外部類必須要實例化內部類才可以使用內部類。
而且在實例化之前必須先創建一個外部類的實例。

不過也可以使用this來調用外部類和內部類的元素。


內部類分為成員內部類,匿名內部類、局部內部類和靜態內部類。

  ① 成員內部類

  成員內部類其實就是最簡簡單單的那種內部類了,定義在一個類的內部。

public class MemInner {
    int num = 10;
    public static void main(String[] args) {
        MemInner mi = new MemInner();
        Inner in = mi.new Inner();
        System.out.println(in.num);
        in.systemOut();
    }
    public class Inner{
        int num = 9;
        public void systemOut(){
            System.out.println(num);
            System.out.println(MemInner.this.num);
        }
    }
}

  如果外部類想要調用內部類,先要實例化內部類相對的外部類,然后再實例化目標內部類,然后才能訪問里面的成員變量和方法。

  並且如果想要訪問內部類和外部類同名的成員變量或成員方法,需要按照以下格式訪問:

外部類.this.成員變量

外部類.this.成員方法

  而且無論外部類的成員變量或成員方法的訪問權限是什么,內部類統統都可以訪問。

 

  ② 局部內部類

  局部內部類是定義在方法或者是一個作用域上面的類,它和成員內部類的區別就在於局部內部類的訪問權限僅在定義它的這個方法或者作用域里面(訪問范圍縮小)。

public class AreaInner {
    int num = 9;
    public static void main(String[] args) {
        AreaInner ai = new AreaInner();
        ai.Inner();
    }
    public void Inner(){
        String name = "黃花大閨女";
        class AInner{
            void call(){
                System.out.println(num);
                System.out.println(name);
            }
        }
        AInner an = new AInner();
        an.call();
    }
}

  就像是main()函數調用不了方法中的局部變量一樣,如果想要在外部類實例化局部內部類,首先要在這個方法或者作用域里面提前實例化此內部類,然后在外部類調用其方法或者作用域的時候,就可以真正為這個內部類提供資源空間。

 

  ③ 匿名內部類

  匿名內部類在用作監聽器的時候是一個非常方便的寫法,而且匿名內部類有兩個特點:無構造器,不可使用static等限定詞。

buttons[0].addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
              
     });

  使用匿名內部類之后就不需要在外部類重新實例化了,方便好用。

 

  ④ 靜態內部類

  靜態內部類跟成員內部類的區別就在於有沒有"static"修飾,然后因為是靜態類,所以要能訪問的只有外部類中被static修飾過的成員變量或者方法。

public class StaticInner {
    int num = 9;
    static String name = "黃花大閨女";
    Inner i = new Inner();
    static class Inner{
        void call(){
            System.out.println(num);  //會報錯
            System.out.println(name);
        }
    }
}

  在沒有外部類的情況下是可以直接創建靜態內部類實例的,但是如果要使用外部類的非靜態成員變量或成員方法,還是需要創建外部類實例才可以使用。

 

  補充:內部類小結(參考自https://www.nowcoder.com/test/question/done?tid=17994589&qid=112853#summary)

-|內部類

  -|靜態內部類:不可訪問外部的非靜態資源

    -|但是可以有public static abstract class Demo

  -|成員內部類:可以訪問外部所有資源,但是本身內部不可有靜態屬性(因為自己本身就需要依靠外部類的實例化)

  -|局部內部類:不可被訪問修飾符和static修飾,只能訪問final變量和形參

    -|局部靜態內部類:在外部類的靜態方法中

    -|局部內部類:在外部類的一般方法中

  -|匿名內部類:沒有構造器,沒有靜態資源,無法被訪問修飾符、static修飾;只能創建匿名內部類的一個實例;創建的時候一定是在new的后面

 

 

本人的這篇文章只是很片面的說一下而且,十分推薦這一篇文章:https://www.cnblogs.com/dolphin0520/p/3811445.html

參考:

https://www.cnblogs.com/wcyBlog/p/3918753.html

https://www.cnblogs.com/dolphin0520/p/3811445.html

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM