我对以下内容缺乏了解:如果我使用“速记”创建内部类的实例,那么访问外部类是一个坏主意,即使我没有创建它的显式实例吗?
例如,请考虑以下代码:
class OuterClass
{
int i;
OuterClass() { i = 2; }
class InnerClass
{
int get_parent_i() { return (OuterClass.this.i); }
}
}
以下编译并返回预期结果(2):
OuterClass.InnerClass ic = new OuterClass().new InnerClass();
System.out.println(ic.get_parent_i());
我的困惑源于这样一个事实:我没有显式创建一个OuterClass对象来实例化一个InnerClass对象,尽管似乎无论如何都存在。有人可以告诉我发生了什么,以及我是否应该以任何理由访问或忘记虚拟实例?
非常感谢你!
答案 0 :(得分:7)
如果没有明确创建它的实例,您认为new OuterClass()
做了什么? :)
您没有明确存储对它的引用,但这是另一回事。无论您对结果执行什么操作,调用构造函数都会生成一个实例。内部类有一个内置的$this
引用,返回外部类,所以只要保留内部类,就会始终存在对它的引用。
使用内部类是永远一个好主意是一个历史上有争议的话题,但这个特定用法并没有特别的错误。
答案 1 :(得分:-1)
您的代码的第一个块是100%可接受且正确的。然而,这种模式通常被用作巨大的外类(例如内部工厂)的内部机制。
关于代码的第二个块。如果您将(内部和外部类)公共可见,则无需创建OuterClass的对象。这样,在不触及OuterClass的情况下,InnerClass对其余包可见。
然而,如果你在你的例子中这样做,你会有一个NullPointerException,因为你正在使用Outerclass的部分(i)。
此外,如果你有。
public class OuterClass
{
static int i;
static {
i = 3;
}
OuterClass() { i = 2; }
public class InnerClass
{
int get_parent_i() { return (OuterClass.this.i); }
}
}
“i”将等于3,除非您将来启动OuterClass并将其值更改为2.
希望我帮忙!