最近看了一篇介紹Java內部類的文字,發現之前對內部類的理解還不完整,這裡重新總結一下對java內部類的理解
內部類的種類?
- 非靜態內部類(Non-static nested class)或者(inner class)
- 靜態內部類(Static nested class)
非靜態內部類(Non-static nested class)
非靜態內部類是指一個類巢狀了另外一個類,被巢狀的這個類可以訪問封閉類(outer class)的成員變數,因此通常也被稱為inner class
我們來看一個例項瞭解一下非靜態內部類
public class Animal {
private String getType(int type) {
if (type == 1) {
return "birds ";
} else {
return "mammal";
}
}
class Chicken {
String weigth;
public int getPrice() {
return 1000;
}
public String getType() {
return Animal.this.getType(1);
}
}
class Panda {
String gender;
public String getFrom() {
return "ChengDu";
}
public String getType() {
return Animal.this.getType(2);
}
}
}
複製程式碼
以上程式碼建立了一個Animal類,Animal裡面巢狀了Pig和Panda類,所以Pig和Panda屬於Animal的內部類,而Animal相對於Pig和Panda類屬於封閉類(也叫外部類),所以,在Pig和Panda可以呼叫Animal的成員變數以及成員方法,下面看一下內部類的呼叫
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Animal.Chicken pig = animal.new Chicken();
System.out.println(pig.getPrice());
System.out.println(pig.getType());
Animal.Panda panda = animal.new Panda();
System.out.println(panda.getFrom());
System.out.println(panda.getType());
}
}
複製程式碼
注意,內部類例項化必須要先例項化外部類。
靜態內部類(Static Inner Class)
靜態內部類是在內部類class前面用static宣告
接下來我們瞭解一下靜態內部類的建立
public class Animal {
private String getType(int type) {
if (type == 1) {
return "birds ";
} else {
return "mammal";
}
}
static class Chicken {
String weigth;
public int getPrice() {
return 1000;
}
}
static class Panda {
String gender;
public String getFrom() {
return "ChengDu";
}
}
}
複製程式碼
靜態內部類的例項方式與非靜態內部類不同,我們來看一下
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
Animal.Chicken pig = new Animal.Chicken();
System.out.println(pig.getPrice());
Animal.Panda panda = new Animal.Panda();
System.out.println(panda.getFrom());
}
}
複製程式碼
注意,與非靜態內部類不同,靜態內部類不能訪問外部類的成員變數以及成員方法,因為靜態內部類不需要建立外部類的例項
非靜態內部類與靜態內部類的異同?
- 靜態內部類需要通過static修飾,非靜態內部類這不需要
- 非靜態內部類可以訪問外部類的成員變數或成員方法,而靜態內部類則不能訪問
- 非靜態內部類例項化要先例項化外部類,而靜態內部類則不需要例項化外部類
- 非靜態內部類和靜態內部類可以使用pulic和protect修飾宣告
以上就是被人對Java中的內部類的一點理解,如果又不對的或者不完善的,歡迎在留言指正。