繁体   English   中英

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

[英]Is the keyword 'this' needed when instantiating a new inner class?

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

要清楚,我指的是: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();
    }
}

你不需要this. , 在这种情况下。 但是,必须始终使用封闭实例构造内部类,因此这样this. 简单地向读者说清楚。

如果你的非静态方法里面不是DataStructure (即,如果this不存在的,要不然不是一个实例DataStructure ),那么你实际上必须指定的实例DataStructure创建时InnerEvenIterator

InnerEvenIterator iterator = dataStructure.new InnerEvenIterator();

只是添加一点来纠正上面提到的答案:

当你有一个函数时,让我们说setInnerEvenIterator(InnerEvenIterator) ,如下所示

class DataStructure {

    InnerEvenIterator iterator;

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

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

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

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

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

  • 与所有其他非静态资源一样,非静态内部类属于外部类的“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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM