在阅读java Doc时,我得到了以下东西。
所以如果我写信
public class O{
class Inner1{
//
}
class Inner2{
}
}
我的问题是在这两个内部类中,哪一个是O的直接内部类?
我也有一些观点。
2.如果类O是C的第n-1个词汇封闭类的直接封闭类,则它是C的第n个词汇封闭类。
3.类O的直接内部类C的实例i与O的实例关联,称为i的直接封闭实例。对象的直接封闭实例(如果有)在创建对象时确定。
4.对象o是其自身的第0个词汇封闭实例。
5.对象o是实例i的第n个词汇封闭实例,如果它是实例i的第n-1个词汇封闭实例的直接封闭实例。
6.在静态上下文中声明的内部类I的实例没有词汇封闭实例。但是,如果我是在静态方法或静态初始值设定项中立即声明的,那么我确实有一个封闭块,它是在词汇上封闭I声明的最内层块语句。
7.对于C的每个超类S,它本身是类SO的直接内部类,都有一个与i相关的SO实例,称为i关于S的立即封闭实例。对象关于它的立即封闭实例类的直接超类(如果有)是在通过显式构造函数调用语句调用超类构造函数时确定的。
8.当内部类(其声明不出现在静态上下文中)引用作为词汇封闭类成员的实例变量时,将使用相应词汇封闭实例的变量。
请解释我这些事情在简单的术语,因为它已经似乎很混乱,而阅读这些
它们都是因为O
是Inner1
和Inner2
的直接词汇封闭类。
注意“a”
如果O是C的直接词汇封闭类,且C的声明不在静态上下文中出现,则内部类C是O类的直接内部类
不一定只有一个。可以有很多。
(我一直在重读那个问题标题,思考它看起来有多荒谬,但我向你保证,这是对问题的最佳描述,我有一个实际的应用程序,其中这是最好的结构。我发誓我没有疯。) 考虑以下内容。每个块都是一个单独的文件: 注意,enclosinstance业务是为了解决涉及中间构造函数调用的问题。请参阅“为什么外部类不能扩展内部类?”。 我希望输出为“2”。但是相反,我在System.out.println(a.this.I)
问题内容: 我正在扩展ArrayList来创建一个自定义ArrayList,可以在迭代它的同时使用常规ArrayList方法进行修改。为此,我还要创建一个迭代器。 在我的hasNext()和next()方法期间,我需要确保列表没有被修改(可以在任何其他时间修改)。因此,我需要在我的shared()块中引用我的封闭类型。 问题答案: 。因此,在您的情况下,它将为。
我知道如果我想扩展内部类,我应该这样做: 但是在这种情况下,我不明白该怎么办?如何获取内部对象的封闭实例? 此变体不编译:
问题内容: 我有一个内部类(非静态),该类在初始化时使用对封闭类的引用。内部类现在会保留对封闭类的引用吗? 更新 我非常清楚, 可以使用 引用外部类。 但是,如果该类不使用引用, 必须 参考是编译之后呢?即使仅在初始化中使用引用也有必要吗? 它在哪里说内部类 总是 持有对外部类的引用? 问题答案: 非静态嵌套类 始终 包含对封闭类的引用。在你的榜样,你可以从引用封闭类的。 JLS 8.1.3“内部
我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。 有什么建议吗?
问题内容: 术语“ 内部类” 通常被认为是“需要一个封闭实例的嵌套类”。但是,JLS声明如下: 8.1.3。内部类和封闭实例 […] 内部类包括本地(第14.3节),匿名(第15.9.5节)和非静态成员类(第8.5节)。 […] 内部类的声明发生在静态上下文中的实例没有词法包围的实例。 也, 15.9.5。匿名类声明 […] 匿名类始终是内部类(第8.1.3节);从来没有(§8.1.1,§8.5.