靜態嵌套類 - 1

“因此,第二個主題是靜態嵌套類。請記住,非靜態嵌套類稱為內部類

“讓我們圍繞嵌套類聲明上下文中靜態這個詞的含義進行思考。你怎麼看?”

“如果一個變量被聲明為靜態的,那麼該變量只存在一個副本。那麼,如果一個嵌套類是靜態的,那麼是否意味著你只能創建該類的一個對象?”

“不要讓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 類內部聲明)。

“今天到此為止。”

“所以只是一個額外的名字,僅此而已?”

“是的。”

“這比一開始看起來更容易。”