Java語法——內部類(JDK 1.1)

Java語法——內部類(JDK 1.1)

內部類概念

  Java類中的組成有:構造器、字段(成員變量)、方法(成員方法)、內部類(成員內部類、匿名內部類和局部內部類)、語句塊。除了構造器外,其他四種組成都有靜態的(又稱“類的”)和非靜態的(又稱“實例的”)兩類。相應地,使用一個類的成員有兩種方式,一是類名.靜態成員(操作類),二是new 構造器().實例成員(操作對象)。
  類的成員(member)指成員變量(memberVariable)、成員方法(memberMethod)和成員內部類(memberInner)。靜態成員是對類的初始化,構造器是對類的對象的初始化。實例成員中可以使用靜態成員,但靜態成員中不可以直接使用實例成員(通過構造器new出對象後纔可使用)。
  Java類之間的交互:
  一個類中使用到其他類的地方有:構造器、成員方法、語句塊。
  一個類中可以被其他類使用的組成有:成員變量、成員方法、成員內部類。

  一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的內部定義,稱爲內部類(innerclasses)。內部類具體分爲成員內部類(非靜態內部類、靜態內部類)、匿名內部類、局部內部類。成員內部類是靜態的還是實例的,取決於外部類以外的地方使用成員內部類時,是否需要通過外部類對象,若需要則是實例的,若不需要則是靜態的。

  內部類可以使用public、default、protected 、private以及static修飾。而外部頂級類(我們以前接觸的類)只能使用public和default修飾。

  內部類只是一個編譯時概念,一旦我們編譯成功,就會成爲完全不同的兩個類。對於一個名爲Outer的外部類和其內部定義的名爲Inner的內部類。編譯完成後會出現Outer.class和Outer$Inner.class兩個類的字節碼文件。

代碼說明

非靜態內部類

/**
 * 外部類以外的類
 */
class Test{
    public static void main(String[] args) {
        // 外部類以外的地方 訪問 非靜態內部類的實例成員
        Outer.Inner inner = new Outer().new Inner();
        inner.innerInstanceMethod();
        int a = inner.innerInstanceField;
    }
}


/**
 * 外部類
 */
class Outer {
    private int outerInstanceField;
    private static int outerStaticField;

    public void outerInstanceMethod(){
        // 外部類實例成員中 訪問 非靜態內部類的實例成員
        Inner inner = new Inner();
        inner.innerInstanceMethod();
        int b = inner.innerInstanceField;
    }

    public static void outerStaticMethod(){
        // 外部類靜態成員中 不能訪問 非靜態內部類的實例成員!
        // 非靜態內部類對象的創建,依賴外部類的對象,因此非靜態內部類的對象不能在外部類的靜態成員中創建
//        Inner inner = new Inner();
//        inner.innerInstanceMethod();
//        int b = inner.innerInstanceField;
    }


    /**
     * 非靜態內部類
     */
    public class Inner {
        public int innerInstanceField;

        public void innerInstanceMethod(){
            // 非靜態內部類實例成員中 訪問 外部類靜態成員
            outerStaticMethod();
            int a = outerStaticField;

            // 非靜態內部類實例成員中 訪問 外部類實例成員
            Outer outer = new Outer();
            outer.outerInstanceMethod();
            int b = outer.outerInstanceField;
        }

    }  // end Inner{}

}  // end Outer{}

靜態內部類

/**
 * 外部類以外的類
 */
class Test{
    public static void main(String[] args) {
        // 外部類以外的地方 訪問 靜態內部類的靜態成員
        Outer.Inner.innerStaticMethod();
        int b = Outer.Inner.innerStaticField;

        // 外部類以外的地方 訪問 靜態內部類的實例成員
        Outer.Inner inner = new Outer.Inner();
        inner.innerInstanceMethod();
        int a = inner.innerInstanceField;
    }
}

/**
 * 外部類
 */
class Outer {
    private int outerInstanceField;
    private static int outerStaticField;

    public void outerInstanceMethod(){
        // 外部類實例成員中 訪問 靜態內部類的靜態成員
        Inner.innerStaticMethod();
        int a = Inner.innerStaticField;

        // 外部類實例成員中 訪問 靜態內部類的實例成員
        Inner inner = new Inner();
        inner.innerInstanceMethod();
        int b = inner.innerInstanceField;
    }

    public static void outerStaticMethod(){
        // 外部類靜態成員中 訪問 靜態內部類的靜態成員
        Inner.innerStaticMethod();
        int a = Inner.innerStaticField;

        // 外部類靜態成員中 訪問 靜態內部類的實例成員
        Inner inner = new Inner();
        inner.innerInstanceMethod();
        int b = inner.innerInstanceField;
    }

    /**
     * 靜態內部類
     */
    public static class Inner {
        public int innerInstanceField;
        public static int innerStaticField;

        public void innerInstanceMethod(){
            // 靜態內部類實例成員中 訪問 外部類靜態成員
            outerStaticMethod();
            int a = outerStaticField;

            // 靜態內部類實例成員中 訪問 外部類實例成員
            Outer outer = new Outer();
            outer.outerInstanceMethod();
            int b = outer.outerInstanceField;
        }

        public static void innerStaticMethod(){
            // 靜態內部類靜態成員中 訪問 外部類靜態成員
            outerStaticMethod();
            int a = outerStaticField;

            // 靜態內部類靜態成員中 訪問 外部類實例成員
            Outer outer = new Outer();
            outer.outerInstanceMethod();
            int b = outer.outerInstanceField;
        }
    }  // end Inner{}

}  // end Outer{}

匿名內部類

/**
 * 外部類以外的類
 */
class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.inner.greet();
        outer.inner.greetSomeone("cty");
    }
}  // end Test{}


/**
 * 匿名內部類接口
 */
interface HelloWorld {
    void greet();
    void greetSomeone(String name);
}  // end HelloWorld{}

/**
 * 外部類
 */
class Outer {

    /**
     * 匿名內部類
     *      通過實現接口來創建,適用於類只使用一次的場景
	 *      匿名內部類沒有訪問修飾符,沒有構造方法(類名都沒有,何來構造方法)
     */
    HelloWorld inner = new HelloWorld() {
        String name = "world";

        @Override
        public void greet() {
            greetSomeone(name);
        }

        @Override
        public void greetSomeone(String name) {
            this.name = name;
            System.out.println("Hello " + name);
        }
    };  // 不要忘記分號!

}  // end Outer{}

/**
 * Hello world
 * Hello cty
 */

局部內部類

/**
 * 外部類以外的類
 */
class Test {
    public static void main(String[] args) {
        new Outer().greet();
    }
}  // end Test{}

/**
 * Hello World
 */


/**
 * 外部類
 */
class Outer {

    public void greet(){

        /**
         * 局部內部類
         *      僅在greet方法的作用域下有效
         */
        class Inner {
            public void helloWorld(){
                System.out.println("Hello World");
            }
        }  // end Inner{}

        new Inner().helloWorld();
    }  // end greet()

}  // end Outer{}

運行環境

  1. jdk-1.7
  2. Intellij IDEA 2019.3

參考

[1] 內部類的分類

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