天天看點

内部類 - Java

文章目錄

  • ​​一、内部類的多種形式​​
  • ​​二、成員内部類​​
  • ​​三、局部内部類​​
  • ​​四、匿名内部類​​
  • ​​五、内部類的調用方式總結​​

一、内部類的多種形式

  • 靜态内部類, ​

    ​static class StaticInnerClass{ };​

  • 成員内部類, ​

    ​private class InstanceInnerClass{ };​

  • 局部内部類, 定義在方法或表達式内部
  • 匿名内部類, ​

    ​(new Thread() { }).start​

package top.clearlight.book.efficientcode.insideclass;

public class InnerClassTest1 {

    // 成員内部類
    private class InstanceInnerClass {

    }

    // 靜态内部類
    static class StaticInnerClass {

    }

    static int a = 1;

    public static void main(String[] args) {
        // 兩個匿名内部類
        (new Thread() {}).start();
        (new Thread() {}).start();

        // 兩個方法内部類
        class MethodClass {
        }
        class MethodClass2 {
        }
    }
}      
源出處 : < Easy Coding >

二、成員内部類

将一個類直接定義在類的裡面, 作為類中成員, 與屬性或方法層次一緻
  1. 内部類既可以通路自身的資料域,也可以通路建立它的外圍類對象的資料域(包括私有的)
  2. 正常類的修飾符可以為​

    ​public或default​

    ​, 成員内部類可以使用不同的修飾符來修飾.
  3. 内部類與外部類出現相同的變量名,想要引用外部類的域 -> ​

    ​外部類.this.外部成員​

    ​​. (其中 ​

    ​OuterClass.this​

    ​表示外圍類的引用
  4. 内部類中聲明的所有靜态域必須用​

    ​final​

    ​修飾.
  5. 内部類不能有static方法
  6. 源碼進行編譯後,産生一個位元組碼:​

    ​外部類$内部類.class​

三、局部内部類

将一個類定義在方法/塊裡面,作為方法的内部結構,與臨時的局部變量一個層次
  1. 局部類不能用public或private通路符聲明.隻能用abstract或final修飾.
  2. 局部類可以對外部完全隐藏,隻有方法之外的代碼,都不能通路它. 是以需要在内部類裡面完成對象的定義和引用.
  3. 局部内部類通路外部類的成員使用 : ​

    ​外部類名.this.成員名​

    ​.
  4. 從内部類引用本地變量必須用​

    ​final​

    ​修飾或者實際上的最終變量. 内部類通路的局部變量必須事實上為final,一旦指派就絕對不會改變!
public void testDemo() {
        System.out.println("這是外部類中的方法");
        int b = 1;
        // 定義一個局部内部類
        class LocalClass {
            private String name;
            int aa = 1;
            public void test1() {
                aa++;
                // 報錯,因為調用的本地變量jdk8預設添加了final修飾符不可變
                // b++;
            }
            public void test() {
                System.out.println(InnerClassTest.this.name);
            }
        }
        LocalClass lc = new LocalClass();
        lc.test();
        lc.test1();
    }      
public void testDemo() {
        System.out.println("這是外部類中的方法");
        int b = 1;
        System.out.println(++b); // 此處做了自增,是以變量b不會預設添加final修飾符
        // 定義一個局部内部類
        class LocalClass {
            private String name;
            int aa = 1;
            public void test1() {
                aa++;
             
                System.out.println(b); // 報錯, 因為局部内部類通路方法内的變量,需要使用final修飾.
            }
        }

        LocalClass lc = new LocalClass();
        lc.test1();
        System.out.println(lc.aa);
    }      
内部類 - Java

四、匿名内部類

  1. 格式 : new 抽象類|接口(構造參數) {

       實作的抽象方法 或 重寫方法;

    };

  2. 如果抽象類被使用一次,可以使用匿名内部類建立該類執行個體實作抽象方法,但是多次使用,建議重新定義類!
  3. 使用匿名内部類時,我們必須是繼承一個類或者實作一個接口,但是兩者不可兼得,同時也隻能繼承一個類或者實作一個接口。
  4. 匿名内部類中是不能定義構造函數的。
  5. 匿名内部類中不能存在任何的靜态成員變量和靜态方法。
  6. 匿名内部類為局部内部類,是以局部内部類的所有限制同樣對匿名内部類生效。
  7. 匿名内部類不能是抽象的,它必須要實作繼承的類或者實作的接口的所有抽象方法。

3 - 7 引用優秀部落格第二篇

五、内部類的調用方式總結