java複習第3天---3.2---內部類
目錄
內容
1、概念和分類
生活中常見一個事物包含另外一個事物,比如汽車和發動機,人和心臟等等。
- 概念:java中當一個類定義在 另外一個類中時,稱這個類爲內部類。
- 分類
- 成員內部類
- 局部內部類(包含匿名內部類)
2、成員內部類
-
格式
[修飾符] class 外部類 { [修飾符] class 內部類 {...} ... }
-
示例2-1:
public class Outer { ... public class Inner { ... } ... }
-
訪問方式
-
間接訪問:通過外部類的成員方法訪問內部類成員
[修飾符] class 外部類 { ... [修飾符] class 內部類 {...} ... [修飾符] 返回值類型 方法名(參數類別) { ... 內部類 對象名 = new 內部類(); 對象名.成員 ... } }
-
直接訪問:通過定義內部類的對象,訪問內部類的成員
[修飾符] class 外部類 { [修飾符] class 內部類 {...} ... } 測試類 public class 測試類{ public static void main(String[] args) { 外部類.內部類 對象名 = new 外部類().new 內部類(); 對象名.成員 } }
-
-
示例2-2:
package inherited.innerClass; public class Outer1 { public class Inner { public void show() { System.out.println("內部類"); } } public void show() { System.out.println("外部類"); Inner i1 = new Inner(); i1.show(); } } package inherited.innerClass; public class TestOuter2 { public static void main(String[] args) { Outer1 o1 = new Outer1(); o1.show(); System.out.println("=========="); Outer1.Inner i1 = new Outer1().new Inner(); i1.show(); } } 結果: 外部類 內部類 ========== 內部類
3、局部內部類
- 格式:
-
方法中的局部內部類
[修飾符] class 外部類 { ... [修飾符] 返回值類型 方法名(參數列表) { ... [修飾符] class 類名 { ... } ... } }
-
匿名內部類
new 接口名稱() { ... }
-
- 局部內部類訪問局部變量
- 注意:該局部變量必須要用final 修飾
- 解釋:
- 局部變量,隨方法訪問創建,存放在棧中,隨方法調用結束死亡
- 對象一旦new 存放在堆中,所以局部變量需要聲明爲final ,同new的對象具有相同的生命週期。
4、同名成員變量訪問
-
示例4-1:
package inherited.innerClass; public class Outer { int num = 10; public class Inner { int num = 20; public void show() { int num = 30; System.out.println(num); // 局部變量 System.out.println(this.num); // 內部類的成員變量 System.out.println(Outer.this.num); // 局部變量 } } public void test() { Inner i1 = new Inner(); i1.show(); } } package inherited.innerClass; public class TestOuter1 { public static void main(String[] args) { new Outer().new Inner().show();; } } 結果: 30 20 10
-
規則:
- 就近原則,有局部變量優先調用局部變量
- 內部類的方法調用需要加this
- 調用外部類的成員變量需要加 外部類.this.成員變量
5、匿名內部類和匿名對象
-
適用情況:如果接口的實現類或者子類只需要使用唯一的一次,這種情況下可以省略掉類的定義,使用[匿名內部類]
-
示例5-1:
package inherited.innerClass; public interface InterfaceInner { void method(); } package inherited.innerClass; public class TestOuter3 { public static void main(String[] args) { // 匿名內部類 InterfaceInner ii = new InterfaceInner() { @Override public void method() { System.out.println("重寫了方法111"); } }; ii.method(); // 匿名對象 new InterfaceInner() { @Override public void method() { System.out.println("重寫了方法222"); } }.method();; } }
-
結論
- 由匿名內部類生成對象,只能使用一次。如果想要生成多個內容相同的對象,需要單獨定義實現類。
- 匿名對象調用成員,只能使用唯一一次,如果想要調用多次,必須給對象起名字。
6、接口作爲成員變量或者參數
接口作爲成員變量,接口成員變量使用時,實際指向的是其實現類的對象。作爲參數,效果等同。多態的體現。
後記 :
本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785
前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA