這是我參與更文挑戰的第6天,活動詳情查看: 更文挑戰web
什麼是內部類?內部類和外部類有什麼區別和聯繫?markdown
讓咱們帶着這兩個問題來學習本期內容,首先是第一個問題。app
把一個類定義在另外一個類中,這樣的類叫作內部類,也叫做嵌套類。而包含內部類的類叫作 外部類或宿主類。svg
例如:post
public calss A{
class B{
}
}
複製代碼
A就是宿主類,B就是內部類。 內部類又分爲靜態內部類和非靜態內部類。和名字同樣,靜態內部類就是在class前加上 static關鍵字,非靜態內部類就是不加static關鍵字。 內部類中還有一種很重要的類叫作匿名類。 所謂匿名類顧名思義就是沒有名字的內部類。學習
下期我會詳細說靜態內部類和非靜態內部類的區別,還有匿名類的建立及使用。url
第一個問題是否是很簡單? 那咱們來看第二個問題。spa
下面咱們經過具體例子來理解上面內容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();
}
}
複製代碼