
“因此,第二個主題是靜態嵌套類。請記住,非靜態嵌套類稱為內部類。
“讓我們圍繞嵌套類聲明上下文中靜態這個詞的含義進行思考。你怎麼看?”
“如果一個變量被聲明為靜態的,那麼該變量只存在一個副本。那麼,如果一個嵌套類是靜態的,那麼是否意味著你只能創建該類的一個對象?”
“不要讓static這個詞在這裡混淆了你。確實,如果一個變量聲明為static,那麼該變量只有一個副本。但是靜態嵌套類在這方面更像是一個靜態方法。”類聲明前的單詞 static 表示該類不存儲對其外部類對象的引用。”
“啊。普通方法會隱式存儲一個對象引用,但靜態方法不會。靜態類也一樣,我說得對嗎,Ellie?”
“當然。你的快速理解值得稱讚。靜態嵌套類沒有對其外部類對象的隱藏引用。”
class Zoo
{
private static int count = 7;
private int mouseCount = 1;
public static int getAnimalCount()
{
return count;
}
public int getMouseCount()
{
return mouseCount;
}
public static class Mouse { public Mouse() { } public int getTotalCount() { return count + mouseCount; // Compilation error. } }
}
“讓我們仔細回顧一下這個例子。”
“靜態 getAnimalCount 方法可以訪問哪些變量?”
“只有靜態的。因為它是靜態方法。”
“getMouseCount 方法可以訪問哪些變量?”
“靜態和非靜態的。它有一個對 Zoo 對象的隱藏引用 (this)。”
“沒錯。所以,靜態嵌套的Mouse類,和靜態方法一樣,可以訪問Zoo類的靜態變量,但不能訪問非靜態變量。”
“我們可以安全地創建 Mouse 對象,即使沒有創建一個 Zoo 對象。以下是您可以如何做到這一點:”
class Home
{
public static void main(String[] args)
{
Zoo.Mouse mouse = new Zoo.Mouse();
}
}
“Mouse 類實際上是一個非常普通的類。它在 Zoo 類內部聲明的事實賦予它兩個特殊功能。”
1)在外部類之外創建嵌套類(如Mouse類)的對象時,還必須使用點運算符來指定外部類的名稱。
“像這樣,例如:Zoo.Mouse。”
2) Zoo.Mouse 類及其對象可以訪問 Zoo 類的私有靜態變量和方法(因為 Mouse 類也在 Zoo 類內部聲明)。
“今天到此為止。”
“所以只是一個額外的名字,僅此而已?”
“是的。”
“這比一開始看起來更容易。”
GO TO FULL VERSION