实例化一个新的内部类时是否需要关键字“this”?

时间:2013-08-19 03:32:38

标签: java

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

3 个答案:

答案 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