兩種內部類web
Java的內部類有兩種,一種是靜態內部類,另外一種是普通內部類,普通內部類能夠得到外部對象的引用,函數
因此在普通內部類可以訪問外部對象的成員變量 ,也就可以使用外部類的資源,能夠說普通內部類依賴spa
於外部類,普通內部類與外部類是共生共死的,建立普通內部類的對象以前,必須先建立外部類的對象。orm
建立普通內部類的代碼以下:對象
Outer o = new Outer();資源
Outer.Inner inner = o.new Inner();get
Outer.Inner inner = new o.Inner(); /* 錯誤 */it
Outer.Inner inner = new Outer.Inner(); /* 錯誤 */class
靜態內部類沒有外部對象的引用,因此它沒法得到外部對象的資源,固然好處是,靜態內部類無需依賴於變量
外部類,它能夠獨立於外部對象而存在。建立靜態內部類的代碼以下:
Outer.Inner inner = new Outer.Inner();
靜態類的使用場景
在如下場合可使用靜態內部類:
(1) 外部類須要使用內部類,而內部類無需使用外部類的資源
(2) 內部類能夠獨立外部類建立對象
使用靜態內部類的好處是增強了代碼的封裝性以及提升了代碼的可讀性,舉個例子:
public class Person{
//姓名
private String name;
//家庭
private Home home;
//構造函數設置屬性值
public Person(String _name){
name = _name;
}
/* home、name的getter/setter方法省略 */
public static class Home{
//家庭地址
private String address;
//家庭電話
private String tel;
public Home(String _address,String _tel){
address = _address;
tel = _tel;
}
/* address、tel的getter/setter方法省略 */
}
}
把Home放在Person內部,一看便知道Home是Person的一個屬性。使用的時候也很方便,以下代碼:
public static void main(String[] args) {
Home home = new Person.Home("上海", "021");
Person p1 = new Person("張三");
Person p2 = new Person("李四");
p1.setHome(home);
p2.setHome(home);
}
這裏建立一個home對象,p1和p2都使用這個home對象,p1和p2共享同一個home對象。
若是把Home換成普通內部類,狀況就不一樣了,這時代碼變成:
public static void main(String[] args) {
Person p1 = new Person("張三");
Home home = p1.new Home("上海", "021");
p1.setHome(home);
Person p2 = new Person("李四");
p2.setHome(home);
}
這裏p1和p2依然共享同一個home對象,但此時home對象和p1是同生共死的,若是p1對象消亡,那麼p2就沒有
家了,這對p2來講實在不公平,而若是爲p1和p2都建立一個Home對象,又浪費資源。因此在這個例子中,
使用靜態內部類比普通內部類要合適。
靜態內部類和普通內部類的區別
(1)普通內部類不能聲明static的方法和變量
普通內部類不能聲明static的方法和變量,注意這裏說的是變量,常量(也就是final static修飾的屬性)
仍是能夠的,而靜態內部類形似外部類,沒有任何限制。
(2)使用靜態內部類,多個外部類的對象能夠共享同一個內部類的對象。
使用普通內部類,每一個外部類的對象都有本身的內部類對象,外部對象之間不能共享內部類的對象