静态嵌套类 - 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 类内部声明)。

“今天到此为止。”

“所以只是一个额外的名字,仅此而已?”

“是的。”

“这比一开始看起来更容易。”