我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。
public class RandomQueue<Item> implements Iteralbe<Item>
{
public RandomQueue() {}
public Iterator<Item> iterator() // iterator() method
{
return new ShuffleIterator();
}
// inner class implementing iterator
private class ShuffleIterator implements Iterator<Item>
{
private int i; // private data field in inner class.
.......
public boolean hasNext() {...}
public Item next() {...}
public void remove() {...}
}
public void doSomething()
{
// Compile time error. "i cannot be resolved or is not a field"
int j = iterator().i;
}
}
有什么建议吗?
你的方法迭代器
public Iterator<Item> iterator() // iterator() method
声明为返回类型为迭代器的值
类型
迭代器
没有名为i
的可访问字段。
你的ShuffleIterator可以。转换返回的值或更改返回类型。
因为你的方法iterator()
的返回类型是Iterator
如果你的方法是:
public ShuffleIterator iterator() // iterator() method
{
return new ShuffleIterator();
}
然后您将不会有任何编译错误,因为
i
存在于ShuffleIterator
类中。
我知道如果我想扩展内部类,我应该这样做: 但是在这种情况下,我不明白该怎么办?如何获取内部对象的封闭实例? 此变体不编译:
问题内容: 如何从匿名类的方法内部访问? 问题答案: 如何从匿名类的方法内部访问? 您只需要访问它们即可: 更重要的是:为什么这对您不起作用?
问题内容: 在Java中,内部类可以访问封闭类的私有成员。但是外层可以访问内层的私有成员吗?这与内部类是否静态无关。我认为这是不正确的,但是以下代码似乎可以编译并正常工作。 问题答案: 是的,没关系。从JLS,第6.6.1节中: 否则,如果声明了成员或构造函数,则仅当访问发生在封装成员或构造函数的声明的顶级类(第7.6节)的主体内时,才允许访问。 您甚至可以在另一个嵌套类型Y中引用嵌套类型X的私有
问题内容: 在下面显示的代码片段中,内部类本身继承了外部类。 方法中的唯一语句(最后一个片段)将值分配给类的私有字段,然后调用该方法。 该方法会导致另一个字符串- 要设置的私人领域中的类调用之前的方法延长。 因此,方法中的以下两个语句: 应该显示 另一个价值 另一个价值 但是他们显示 初始值 初始值 为什么会这样? 问题答案: 方法和领域都是。因此,其他子类(包括子类)均无法访问它们。它们不是继承
问题内容: 我正在扩展ArrayList来创建一个自定义ArrayList,可以在迭代它的同时使用常规ArrayList方法进行修改。为此,我还要创建一个迭代器。 在我的hasNext()和next()方法期间,我需要确保列表没有被修改(可以在任何其他时间修改)。因此,我需要在我的shared()块中引用我的封闭类型。 问题答案: 。因此,在您的情况下,它将为。
(我一直在重读那个问题标题,思考它看起来有多荒谬,但我向你保证,这是对问题的最佳描述,我有一个实际的应用程序,其中这是最好的结构。我发誓我没有疯。) 考虑以下内容。每个块都是一个单独的文件: 注意,enclosinstance业务是为了解决涉及中间构造函数调用的问题。请参阅“为什么外部类不能扩展内部类?”。 我希望输出为“2”。但是相反,我在System.out.println(a.this.I)