【问题标题】:Does each instance of an enclosing class have its own copy of an inner/nonstatic-nested class? [duplicate]封闭类的每个实例是否都有自己的内部/非静态嵌套类的副本? [复制]
【发布时间】:2016-05-16 16:28:04
【问题描述】:

我们说嵌套类是封闭类的成员

这是否意味着封闭类的每个实例都有自己的一个(n)内部/非静态嵌套的副本,就像一个类的每个实例都有自己的非静态副本一样/实例方法?


我的问题与我的问题上方横幅中链接的 question 不重复。

该问题讨论了内部类是否会自动保留对封闭类的引用(即使从未使用过该引用)。

我的问题是,由于类的所有实例都有自己的所有非静态成员字段(和方法?-我不确定方法)的副本-与只有一个的静态成员相反可用于类的所有实例的副本;既然我们说嵌套类是封闭类的成员,那么内部类就会成为封闭类的nonstatic/instance-members,对吧?

那么可以得出结论,封闭类的每个实例都有每个内部类的副本吗?

我什至没有发现这两个问题相似,更不用说重复了。我真的很想知道我的问题的哪一部分与持有对封闭类的引用的内部类有关。

我的问题在接受的答案中得到了完美的回答。

【问题讨论】:

  • 何不试试看呢?
  • “就像类的每个实例都有自己的非静态/实例方法副本一样?”但他们没有。
  • 一个 [single] 封闭类可以有 多个 内部类:这些多重性可能意味着什么?
  • @Turing85 到底试试什么?我的脑海里混杂了许多概念,这个问题对他们来说至关重要。尝试这样的事情时会出现这些问题和困惑。如果你能告诉我我应该写什么样的程序,我会告诉我为什么尝试它不会帮助我澄清我的困惑。
  • @Downvoter:我能知道被否决的原因,以便我以后改进吗?

标签: java oop instance inner-classes


【解决方案1】:

我根据您提供的描述创建了一个小示例。如果我没有正确理解您,请纠正我,但这是我从您的描述中读出的内容。

public class Outer {
    class Inner {

    }

    public Inner inner = new Inner();

    public static void main(String... args) {
        Outer o1 = new Outer();
        Outer o2 = new Outer();

        System.out.println(o1.inner == o2.inner);
        System.out.println(o1.inner.getClass() == o2.inner.getClass());
    }

}

当你执行程序时,你可能会看到Inner的实例不相等,但内部实例的类是相等的。希望这能回答您的问题。

【讨论】:

  • 由此我可以得出结论,每个封闭类实例的 inner-class 总是相同的;但是封闭类的每个实例都有自己的其内部类的每个实例的副本 - 对吗?
  • 是的,没错。
  • 非常感谢,当您说“为什么不简单地尝试一下”时,您是对的(这就是我赞成该评论的原因),但我根本没想到要检查它像这样。我还没有学过反射(getClass())。
  • @Solace 这不是反射。反射解释here
  • @Turing85 / 同意反射。如果我们用返回的Class 一些事情(例如枚举它的方法,动态加载/卸载它等) - 这可能是一个反射操作;然而仅使用getClass() 并比较结果并不比typeof/RTTI 更具反射性;它实际上是 introspection 而不是 reflection
【解决方案2】:

这是否意味着封闭类的每个实例都有自己的一个(n)内部/非静态嵌套类的副本,

封闭类的每个实例都可以被内部类的零个或多个实例引用。

内部类的每个实例都有一个对封闭类的一个实例的隐式引用。

顺便说一下,内部类是一个没有声明为静态的嵌套类。 “内部类”包括匿名和非静态嵌套类。

【讨论】:

  • @vaxquis - 这是对我早期宽松语言的有效批评。外部实例不会隐式连接到内部实例。用动词“has”来表示“被引用”有点牵强。
  • @AndyThomas 这延伸,真的。尽管如此,它们在参考图(GC 等)中是隐式连接的,但我当然同意你不能简单地获取所有内部实例 without heavy VM magic 或没有某种显式跟踪。
猜你喜欢
  • 2018-07-13
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多