Java——內部類1詳解

這是我參與更文挑戰的第6天,活動詳情查看: 更文挑戰web

什麼是內部類?內部類和外部類有什麼區別和聯繫?markdown

讓咱們帶着這兩個問題來學習本期內容,首先是第一個問題。app

什麼是內部類?

把一個類定義在另外一個類中,這樣的類叫作內部類,也叫做嵌套類。而包含內部類的類叫作 外部類或宿主類。svg

例如:post

public calss A{
     class B{
     }
}
複製代碼

A就是宿主類,B就是內部類。 內部類又分爲靜態內部類和非靜態內部類。和名字同樣,靜態內部類就是在class前加上 static關鍵字,非靜態內部類就是不加static關鍵字。 內部類中還有一種很重要的類叫作匿名類。 所謂匿名類顧名思義就是沒有名字的內部類。學習

下期我會詳細說靜態內部類和非靜態內部類的區別,還有匿名類的建立及使用。url

第一個問題是否是很簡單? 那咱們來看第二個問題。spa

內部類和外部類有什麼區別和聯繫?

  1. 內部類僅供它的宿主類使用,其餘類不能使用某個類的內部類來聲明對象。
  2. 內部類成員能夠訪問外部類的私有數據,但外部類不能訪問內部類的成員
  3. 外部類可使用使用內部類來建立對象做爲外部類的成員
  4. 內部類比外部類多了三個修飾符,分別是private,protected,static
  5. 非靜態內部類不能擁有靜態成員

下面咱們經過具體例子來理解上面內容code

public class Test {
	private int no;
	private String name;
	TestA testA = new TestA();//外部類可使用內部類來建立對象做爲本身的成員
	private class TestA{//內部類可使用private來修飾
		int a=0;
		//static int num=0; //error   非靜態內部類不能擁有靜態成員
		public void Show(){
			//內部類訪問外部類的私有成員
			System.out.println(no+name);
		}
	}
	public void Speak(){
		//System.out.println("內部類中的a是"+a); //error  內部類不能訪問外部類的成員
	}
}
複製代碼

不難發現,在外部類中使用非靜態內部類和普通類的建立沒有什麼太大的區別。orm

那麼非靜態內部類建立的對象和外部類對象有什麼關係呢?

非靜態內部類建立的對象必需要依賴於外部類對象,簡單的說若是存在一個非靜態內部類創 建的對象,那麼必定有一個外部類建立的對象被它所寄生。

public static void main(String[] args) {
		//new TestA(); //error  不能在外部類的靜態成員中直接使用非靜態內部類
		//如要要使用應該依賴於外部類來建立對象
		Test A =new Test();
		TestA a=A.new TestA();
		
	}
複製代碼

靜態內部類又有什麼不一樣呢?

static修飾的成員屬於整個類,因此靜態內部類是類相關而不是實例相關。 靜態內部類中能夠包含靜態成員,可是靜態內部類中不能訪問外部類的實例成員,只能訪問 外部類的靜態成員。 外部類依然不能直接訪問內部類的成員,但能夠經過靜態類的類名來訪問靜態內部類的成員。

public class Test {
	private int no;
	private String name;
	private static String shape;
	private static class TestA{
		int a=0;
		static int num=0;    //非靜態內部類能夠擁有靜態成員
		public void Show(){
			//System.out.println(no+name);// error 靜態內部類不能訪問外部類的非靜態成員
		}
	}
	public void Speak(){
		//System.out.println("內部類中的a是"+a); //error  內部類不能訪問外部類的成員
		System.out.println(TestA.num);//能夠經過類名來訪問靜態內部類的靜態成員
	}
	public static void main(String[] args) {
		//TestA a=A.new TestA();//error 靜態類不依賴於外部類對象
		//應該這樣來建立對象
		Test.TestA a=new Test.TestA();
	}
}
複製代碼
相關文章
相關標籤/搜索