“因此,第二个主题是静态嵌套类。请记住,非静态嵌套类称为内部类。
“让我们围绕嵌套类声明上下文中静态这个词的含义进行思考。你怎么看?”
“如果一个变量被声明为静态的,那么该变量只存在一个副本。那么,如果一个嵌套类是静态的,那么是否意味着你只能创建该类的一个对象?”
“不要让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