靜態內部類的作用只是爲了降低包的深度,方便類的使用,靜態內部類適用於包含類當中,但又不依賴與外在的類,不用使用外在類的非靜態屬性和方法,只是爲了方便管理類結構而定義。在創建靜態內部類的時候,不需要外部類對象的引用。而且靜態內部類可以聲明靜態成員。
內部類一個很大的特點就是可以自由的使用外部類的所有變量的方法。內部類不能聲明靜態成員。
靜態嵌套類
由於是static的,意味着:
1. 要創建靜態嵌套類的對象,並不需要其外圍類的對象;
2. 不能夠從靜態內部類的對象中訪問外部類的非靜態成員。
public class Invoice {
private static class Item{
String description;
int quantity;
}
public static void main(String[] args){
Invoice.Item item = new Invoice.Item(); //實例化一個靜態內部類
}
}
Item類定義爲private,所以只有Invoice才能夠訪問到它,所以不需要操心Item內部的實例變量改爲private。
內部類
內部類不能聲明靜態成員,如果內部類有靜態成員,那麼static的含義將變得模糊,將意味着虛擬機中只有一個實例,還是每個外部對象只有一個實例?
public class Network {
public class Member{
private String name;
private ArrayList<Member> friends;
public Member(String name){
this.name = name;
friends = new ArrayList<>();
}
public void leave(){
members.remove(this); //訪問了外部的實例變量
}
}
private ArrayList<Member> members;
public Member enroll(String name){
Member newMember = new Member(name); //這裏可以是因爲enroll不是static的
members.add(newMember);
return newMember;
}
public static void main(String[] args){
Network network = new Network();
Network.Member fred = network.enroll("fred");
Network.Member tom = network.new Member("tom"); //實例化一個內部類需要先生成一個外部類的實例對象,通過外部類的實例對象生成內部類對象
}
}