下面的代码是工作程序。这里的主要内容:评论//НАЧАЛО СОЗДАНИЯ КОЛЛЕКЦИИ和//КОНЕЦ СОЗДАНИЯ КОЛЛЕКЦИИ. 很明显,我们使用匿名类创建了一个集合,实现了抽象类AbsctractCollection。
问题:如何在不注释掉array位于迭代器实现内部的数组声明(该位置标有注释// Роковая строка (*))的情况下引用数组array:实现本身内部的字段AbstractCollection?调用本身发生在行中:// ЗДЕСЬ (1),// И ЗДЕСЬ (2)。
import java.util.*;
public class Main {
public static void main(String[] args) {
// НАЧАЛО СОЗДАНИЯ КОЛЛЕКЦИИ
Collection<Object> coll = new AbstractCollection<Object>() {
private final int SIZE = 10;
private Object[] array = new Object[SIZE];
@Override
public boolean add(Object o) {
int i = 0;
while (i != SIZE && array[i] != null)
i++;
if (i == SIZE)
return false;
array[i] = o;
return true;
}
@Override
public Iterator<Object> iterator() {
Object[] array = {10,20,22,33,48,"Hi People", // Роковая строка (*)
"Кислотный диджей хэй!",
2.0d, 0, null};
return new Iterator<Object>() {
int k = 0;
@Override
public boolean hasNext() {
return k != SIZE;
}
@Override
public Object next() {
return array[k++]; // ЗДЕСЬ (1)
}
@Override
public void remove() {
if (k == 0)
return;
array[k - 1] = null; // И ЗДЕСЬ (2)
}
};
}
@Override
public int size() {
return SIZE;
}
};
// КОНЕЦ СОЗДАНИЯ КОЛЛЕКЦИИ
for (int i = 34; i < 88; i++)
coll.add(i);
coll.remove(40);
System.out.println(coll);
}
}
//Output:
//[10, 20, 22, 33, 48, Hi People, Кислотный диджей хэй!, 2.0, 0, null]
我想达到的效果也是通过注释掉“致命线”来实现的。相同代码的结果,带有覆盖注释:
Output:
[34, 35, 36, 37, 38, 39, null, 41, 42, 43]
问题伪代码:
Аноним: {
Поле P //(1)
Аноним: {
Поле P //(2)
Вызов(P) // вызывается (2)
}
}
// Как вызвать P (1) ?
这是我想为我的任务获得的解决方案(给出了一个没有匿名类的示例):
public class Test{
private String s = "Hello World!";
public void f(){
String s = "Strange string";
class A{
String s = "You have a small *ick";
{System.out.println(Test.this.s);} // Примерно этого хочется.
}
new A();
}
public static void main(String[] args){
new Test().f();
}
}
//Output:
//HelloWorld!
另外:如何String s = "Strange string";在{}类A?
我求求你,不要告诉我你可以做这个,你可以做那个,但是不要调用所需的字段,或者求助于万能的重命名。这个问题很有趣也很复杂。是的,异国情调的需求,但希望了解 Java 语言的工作原理。
如果主要问题或附加问题的答案是“不可能”,那么请解释原因,或参考任何能够得到严格证明的信息来源。
理论上,您可以通过在其中创建返回它的方法来获取对外部类实例的引用。这将替代通过名称获取对外部类的引用,因为匿名类没有名称。
在您的特定情况下,您需要以某种方式在外部类中声明一个方法:
然后,在内部类中,不是通过名称引用变量,而是调用返回它的方法。
PS 我自己想出了解决方案,然后(3 秒后,在了解将哪个查询驱动到 Google 之后)我找到了从哪里复制代码,因为我自己懒得写 -如何访问“this”参考java中的匿名外部类