Oracle Java SE教程的另一个例子。它工作正常,但我不确定是否/为什么'这个'在创建内部类的实例时是必需的。无论我是否把它取出,结果似乎都是一样的。
要说清楚,我指的是: InnerEvenIterator iterator = this.new InnerEvenIterator(); //不确定为什么要使用'这个'
public class DataStructure {
// create an array
private final static int SIZE = 15;
private int[] arrayOfInts = new int[SIZE];
public DataStructure() {
// fill the array with ascending integer values
for (int i = 0; i < SIZE; i++) {
arrayOfInts[i] = i;
}
}
public void printEven() {
// prints out the value of even indices in the array
InnerEvenIterator iterator = this.new InnerEvenIterator(); // not sure why using 'this'
while (iterator.hasNext()) {
System.out.println(iterator.getNext() + " ");
}
}
// inner class implements the Iterator pattern
private class InnerEvenIterator {
// start stepping through the array from the beginning
private int next = 0;
public boolean hasNext() {
// check if a current element is the last in the array
return (next <= SIZE - 1); // -1 b/c dealing with array's length.
}
public int getNext() {
// record a value of an even index of the array
int retValue = arrayOfInts[next];
// get the next even element
next += 2;
return retValue;
}
}
public static void main(String s[]) {
// fill the array with integer values and print out only
// values of even indices
DataStructure ds = new DataStructure();
ds.printEven();
}
}
答案 0 :(得分:10)
在这种情况下,您不需要this.
。但是,必须始终使用封闭实例构造内部类,因此this.
只是让读者明白这一点。
如果你不在DataStructure
的非静态方法内(即如果this
不存在,或者不是DataStructure
的实例),那么在创建DataStructure
时,您必须实际指定InnerEvenIterator
的实例:
InnerEvenIterator iterator = dataStructure.new InnerEvenIterator();
答案 1 :(得分:1)
只需添加一点来纠正上述答案:
当你有一个功能时,让我们说setInnerEvenIterator(InnerEvenIterator)
,如下
class DataStructure {
InnerEvenIterator iterator;
public void setInnerEvenIterator(InnerEvenIterator iterator) {
this.iterator = iterator;
}
}
然后您需要指定this
关键字来纠正由于相同的参数和实例名称而可能出现的冲突。所以this.someThing
表示类的实例变量。如果你没有明确地提供一个,只要不存在冲突的情况就可以了。
答案 2 :(得分:0)
非静态内部类绑定到封闭外部类的实例。
扩展了内部类依赖于外部类的想法。
静态内部类与所有其他静态资源一样,属于外部类。
非静态内部类与所有其他非静态资源一样,属于外部类的“this”实例。
现在,如果您决定使用'this',以防止Outer Class的实例默认可用,那么它只是为了可读性。
示例:
OuterClass.InnerClass in = new OuterClass.InnerClass(); //static inner
OuterClass.InnerClass in = outerClass.new InnerClass(); //non- static inner
// outerClass is an instance of OuterClass