靜態內部類和非靜態內部類的區別


案例:

package com.devin;

public class MyMain{
private static String name = "woobo";
private String num = "X001";

// 靜態內部類可以用public,protected,private修飾
static class Person {
// 靜態內部類中可以定義靜態或者非靜態的成員
private String address = "China";

private static String x = "as";
public String mail = "kongbowoo@yahoo.com.cn";// 內部類公有成員

public void display() {
// System.out.println(num);//不能直接訪問外部類的非靜態成員

// 靜態內部類不能訪問外部類的非靜態成員(包括非靜態變量和非靜態方法)
System.out.println(name);// 只能直接訪問外部類的靜態成員

// 靜態內部類只能訪問外部類的靜態成員(包括靜態變量和靜態方法)
System.out.println("Inner " + address);// 訪問本內部類成員。
}
}

public void printInfo() {
Person person = new Person();

// 外部類訪問內部類的非靜態成員:實例化內部類即可
person.display();

// System.out.println(mail);//不可訪問
// System.out.println(address);//不可訪問
System.out.println(person.address);// 可以訪問內部類的私有成員

System.out.println(Person.x);// 外部類訪問內部類的靜態成員:內部類.靜態成員
System.out.println(person.mail);// 可以訪問內部類的公有成員
}

public static void main(String[] args) {
MyMain staticTest = new MyMain();
staticTest.printInfo();
}
}

1. 嵌套類的對象,並不需要其外圍類的對象。 即它可以不依賴於外部類實例被實例化。

2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。 這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定

3. 外部類訪問內部類的的成員有些特別, 不能直接訪問, 但可以通過內部類實例來訪問, 這是因為靜態嵌套內的所有成員和方法默認為靜態的了.同時注意, 內部靜態類Person只在類StaticTest 范圍內可見, 若在其它類中引用或初始化, 均是錯誤的.
4 . 靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。 
5. 靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;

6 . 非靜態內部類的非靜態成員可以訪問外部類的非靜態變量。

    生成一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類(正常情況下,你不能在接口內部放置任何代碼,但嵌套類可以作為接口的一部分,因為它是static 的。只是將嵌套類置於接口的命名空間內,這並不違反接口的規則)

--------------------------------------------------------------------

PS: 歡迎關注公眾號"Devin說",會不定期更新Java相關技術知識。

--------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM