5

Oracle Java SE 教程中的另一个示例。它工作正常,但我不确定在创建内部类的实例时是否/为什么需要“this”。无论我是否取出它,结果似乎都是一样的。

为了清楚起见,我指的是:InnerEvenIterator iterator = this.new InnerEvenIterator(); // 不知道为什么使用 'this'

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();
    }
}
4

3 回答 3

10

this.在这种情况下,您不需要, 。但是,内部类必须始终使用封闭的实例来构造,因此this.读者可以清楚地了解这一点。

如果您不在 的非静态方法中DataStructure(即,如果this不存在,或者不是 的实例),那么您必须在创建 时DataStructure实际指定 的实例:DataStructureInnerEvenIterator

InnerEvenIterator iterator = dataStructure.new InnerEvenIterator();
于 2013-08-19T03:34:48.943 回答
1

只是为上述正确答案添加一点:

当你有一个功能,让我们说setInnerEvenIterator(InnerEvenIterator),如下

class DataStructure {

    InnerEvenIterator iterator;

    public void setInnerEvenIterator(InnerEvenIterator iterator) {
        this.iterator = iterator;
    }
}

那么您需要指定this关键字来纠正由于相同的参数和实例名称而可能出现的冲突。所以this.someThing代表类的实例变量。如果您没有明确提供一个,只要没有由此产生的冲突情况就可以。

于 2013-08-19T04:31:01.927 回答
0

非静态内部类绑定到封闭的外部类的实例。

扩展内部类依赖于外部类的想法。

  • 静态内部类,就像所有其他静态资源一样,属于外部类。

  • 非静态内部类,就像所有其他非静态资源一样,属于外部类的“this”实例。

现在它只是为了便于阅读,如果您决定使用“this”以防外部类的实例默认可用。

例子:

OuterClass.InnerClass in = new OuterClass.InnerClass(); //static inner
OuterClass.InnerClass in = outerClass.new InnerClass(); //non- static inner
// outerClass is an instance of OuterClass
于 2013-08-19T03:51:43.153 回答