內部類

嵌套類

定義: 定義在另一個類、接口裏的類。
包括: 內部類(非靜態嵌套類)、靜態嵌套類

內部類(非靜態嵌套類)

包括: 成員內部類、局部內部類、匿名內部類

成員內部類

定義: 定義在另一個類成員位置的內部類

注意:
靜態成員的加載早於成員內部類
必須先創建外部類對象才能創建成員內部類對象
使用成員內部類:

//外部類
public class Outer {
      //成員內部類
	  public class Inner{
		  
	  }
}
//測試類
import com.liuhao.neibulei.Outer.Inner;

public class Test {
	public static void main(String[] args) {
	   //在其它類中創建成員內部類的實例
		Outer outer = new Outer();
		//必須創建外部類對象才能創建成員內部類
		Inner inner = outer.new Inner();
	}
}

成員內部類中訪問外部類的成員
1.當內部類訪問外部類成員時,可直接訪問。
2.當內部類和外部類有相同名稱的變量時,優先訪問內部類的變量

//外部類
public class Outer {
	  private String str1 = "Outer類的str1";
	  private String str = "Outer類的str";
	  public void print(){
	        System.out.println("Outer類的print方法");
	    }

      //成員內部類
	  public class Inner{
		  private String str1 = "Inner類的str1";
		  
		  public void print(){
		      System.out.println("Inner類的print方法");
		  }

		  public void visitOuter(){
			    System.out.println(str);    
			    System.out.println(str1);
			    System.out.println(Outer.this.str1);
			    print();
			}
	  }
}
public class Test {
   public static void main(String[] args) {
	////在其它類中創建成員內部類的實例
		Outer outer = new Outer();
		//必須創建外部類對象才能創建成員內部類
		Inner inner = outer.new Inner();
		inner.visitOuter();
	}
}

在這裏插入圖片描述
成員內部類中訪問外部類中同名的成員
方法: 外部類名.this.成員

  public void visitOuter(){
			    System.out.println(str);    
			    System.out.println(str1);
			    System.out.println("----------------"+Outer.this.str1);
		    print();
			}

在這裏插入圖片描述
編譯後的.class文件爲:
在這裏插入圖片描述

外部類中調用成員內部類
1.靜態的可使用 類名.變量名 調取
2.非靜態先實例化內部類再調用。

public class Outer {
      //成員內部類
	  public class Inner{
		  private String str1 = "Inner類的str1";
		  private static final String str2 = "Inner類的str2";
		  public void print(){
		      System.out.println("Inner類的print方法");
		  }
	  }
		  public void visitInner(){
			    System.out.println(new Inner().str1);    
			    System.out.println(Inner.str2);
			    new Inner().print();
			}
}

在這裏插入圖片描述

局部內部類

定義: 定義在方法或代碼塊裏的內部類
不能含有靜態變量、靜態代碼塊、靜態方法(靜態常量除外)
靜態成員的加載早於局部內部類
使用:
代碼塊內、方法內、

	static {
		class Inner1{
			
		}
	}
	
	public void method() {
		class Inner2{
			
		}
		
		if(true) {
			//只能使用abstract、final修飾不能與外部類重名
			class Inner3{}
		}
		
	}
	

編譯後的.class文件爲:
在這裏插入圖片描述
注意事項:
局部內部類只可以用abstract、final修飾且不能與外部類同名
只可以在定義它的方法或代碼塊中使用

局部內部類訪問外部類
注意:
內部類成員優先於外部類成員
直接訪問外部類成員
定義在靜態塊或方法時,只能訪問外部類的靜態成員!!!

public class Outer {
	   private String str1 = "Outer類中的str1";
	    private String str2 = "Outer類中的str2";
	    public void print(){
	        System.out.println("Outer類中的print方法");
	    }
	    public void method(){
	    	class Inner{
	    	    private String str1 = "Inner類中的str1";
	    	    public void visitOuter (){
	    	        System.out.println(str1);
	    	        System.out.println(str2);
	    	        print();
	    	    }
	    	}
	        new Inner(). visitOuter();
	    }
}
         Outer outer = new Outer();
		//必須創建外部類對象才能創建成員內部類
		outer.method();

局部內部類訪問外部類同名的成員
方法: 外部類名.this.成員
注: 在靜態塊或靜態方法中無法使用“外部類名.this”
局部內部類訪問所在方法的成員
注: 內部類成員優先於包含它的方法中的變量

匿名內部類

定義: 直接使用接口或父類實例化對象時創建的沒有名字的內部類。
使用

public interface Father {
	public void print();
	
}
public class Outer{
   //匿名內部類
  Father father = new Father() {
		@Override
		public void print() {			
		}		
	};	
}

編譯後的.class文件爲:
在這裏插入圖片描述
注意:

  1. 必須且僅能繼承一個父類或實現一個接口
  2. 沒有class關鍵字,沒有類名
  3. 僅能使用一次
  4. 不能定義構造方法
  5. 匿名類不能是抽象類
  6. 靜態成員的加載早於匿名內部類
  7. 匿名內部類中訪問外部類的成員: 使用外部類名.this.變量名訪問外部類同名成員
  8. 匿名內部類訪問它所在方法的局部變量: 直接訪問。當存在同名時,內部類成員優先於包含它的方法中的變量

靜態嵌套類

定義: 定義在另一個類成員位置使用static修飾的或定義在另一個接口成員位置的嵌套類
使用

public class Outer {
	public static class Inner {
	}
}
public class Test {
   public static void main(String[] args){
	//在其它類中創建成員內部類的實例
	      Inner inner = new Outer.Inner();
	}
}

編譯後的.class文件爲:
在這裏插入圖片描述
注意:

  1. 只能定義在類的成員位置不能定義在方法或代碼塊中
  2. 不需要通過生成外部類對象來生成靜態嵌套類對象
  3. 靜態嵌套類中可以聲明靜態成員
  4. 靜態嵌套類中訪問外部類:可以直接訪問外部類的靜態成員不能直接訪問外部類的非靜態成員
  5. 外部類可通過靜態嵌套類的對象調用其成員(包括實例成員和靜態成員)

內部類和靜態嵌套類的區別

在這裏插入圖片描述

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