1. 程式人生 > 其它 >Java內部類概述

Java內部類概述

Java內部類概述

成員內部類

  1. 就像外部類總的一個成員,可以訪問外部類中的所有引數和方法,但是外部類不能直接訪問內部類的引數和方法

  2. 成員內部類也可以設定訪問許可權修飾符,private、public、protected,預設

  3. 在成員內部類中不能有靜態引數和靜態方法

  4. 成員內部類的例項化需要藉助外部類的例項來例項,即

    Outer.Inner inner=new Outer().new Inner();
    

區域性內部類

  1. 顧名思義,這是在方法或者作用域中的類,所以不能有public、private等訪問控制符修飾

匿名內部類

  1. 匿名內部類是一種沒有具體類名的類,但是是一種用的較多的內部類

  2. 匿名內部類可以用於實現介面,繼承類,並且實現其中的方法,例如

    public class Outter3 {
        public static void main(String[] args) {
            Animal animal = new Animal() {   //實現了介面Animal的匿名內部類
                @Override
                public String xiaoLaoFu() {
                    return "dai";
                }
            };
            System.out.println(animal.xiaoLaoFu());
    
            Temp2 temp2 = new Temp2() {    //匿名內部類繼承Temp2
                @Override
                public String method3() {
                    return "被重寫了的方法";
                }
            };
            System.out.println(temp2.method3());
        }
    }
    
    interface Animal {
        String xiaoLaoFu();
    }
    
    class Temp2 {
        public String method3() {
            return "temp2中的方法";
        }
    }
    
    1. 匿名內部類是唯一一種沒有構造器的類。正因為其沒有構造器,所以匿名內部類的使用範圍非常有限,大部分匿名內部類用於介面回撥。匿名內部類在編譯的時候由系統自動起名為 Outter$1.class。一般來說,匿名內部類用於繼承其他類或是實現介面,並不需要增加額外的方法,只是對繼承類和實現的介面中的方法重寫。

靜態內部類

  1. 靜態內部類與成員內部類類似,但是其是static修飾的,所以同樣的,靜態內部類類似於外部類中的靜態變數一樣,可以直接訪問外類類中的靜態屬性

  2. 靜態內部類的例項化不需要藉助於外部類例項:

    class Outter4 {
        static String dabenxiang = "快跑呀";
    
        String dazhuzhu = "白花花";
    
        //靜態內部類
        static class Inner4 {
    
            public void method() {
                System.out.println("靜態內部類可以直接訪問外部類中的靜態變數:" + dabenxiang);
                //  System.out.println(dazhuzhu);  // 訪問不到
                System.out.println("靜態內部類中的方法!");
            }
        }
    
        public static void main(String[] args) {
            //靜態內部類的例項化
            Inner4 inner4 = new Inner4();
            inner4.method();
            Outter4.Inner4 inner41 = new Outter4.Inner4();
        }
    }
    
    //    在其他類中例項化靜態內部類
    class Temp {
        public static void main(String[] args) {
            Outter4.Inner4 inner4 = new Outter4.Inner4();
            inner4.method();
    
        }
    }
    

內部類的使用場景和好處

  1. 使得多繼承的解決方案變得完整,每個內部類都能獨立的繼承和實現介面,並且無論外部類是否已經繼承或實現介面
  2. 可以將存在一定邏輯關係的類組織在一起,同時可以對外界隱藏,例如事件驅動程式,執行緒執行
成員內部類也可以被繼承,當成員內部類被繼承的時候,其引用方式必須為 Outter.Inner,並且構造器中必須有指向外部類物件的引用,並通過這個引用呼叫super() :
class WithInner {
    class Inner{
         
    }
}
class InheritInner extends WithInner.Inner {
      
    // InheritInner() 是不能通過編譯的,一定要加上形參
    InheritInner(WithInner wi) {
        wi.super(); //必須有這句呼叫
    }
  
    public static void main(String[] args) {
        WithInner wi = new WithInner();
        InheritInner obj = new InheritInner(wi);
    }
}