java複習第3天---3.2---內部類

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

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