java中的这个关键字

时间:2014-03-07 06:38:28

标签: java this keyword

我目前正在内部类部分阅读Oracle的Java教程。

请参阅this link

本教程中有一些我不理解的代码。

有人可以向我解释下面DataStructure课程中的代码是如何工作的吗?

DataStructureIterator iterator = this.new EvenIterator();

外部课程不应该在DataStructureIterator iteratorthis.new EvenIterator()之前,如下所示:

DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator();

我已经搜索了一段时间,但我没有找到任何答案。

4 个答案:

答案 0 :(得分:6)

声明DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator();有效,但在该方法的上下文中是多余的。

考虑这种情况,其中存在冲突的内部类

public void printEven() {
    Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            //Makes EvenIterator point to DataStructure's implementation
            DataStructureIterator itr = DataStructure.this.new EvenIterator();
        }

        class EvenIterator implements DataStructureIterator {

            @Override
            public boolean hasNext() {
                return false;
            }

            @Override
            public Integer next() {
                return null;
            }

            @Override
            public void remove() {
            }

        }
    });
}

正如您所看到的,匿名类Runnable具有名为EvenIterator的内部类(其名称与外部类的内部类相同)。所以只写

DataStructureIterator itr = this.new EvenIterator(); //OR DataStructureIterator itr = new EvenIterator();

将引用Runnable的{​​{1}}。要指向EvenIterator的{​​{1}},您可能需要编写

DataStructure

其中说,我希望在EvenIterator 当前实例 上创建DataStructureIterator itr = DataStructure.this.new EvenIterator(); ,而不是EvenIterator的当前实例< / p>

答案 1 :(得分:2)

“this keyword”指的是对象类的范围:

public class Test {
     public void method1(){
         this. //this in here refer to "Test" class
     }

     public class InnerTest {
        public void method2(){
           this. //this in here refer to "InnerTest" class
        }
     }
}

现在看一下这个例子中的“this keyword”:

public class Test {
     public void method1(){

         InnerTest innerTest = this.new InnerTest(); //within the scope of Test class, there's a inner class call InnerTest. create an instance of it !
         //OR
         TestInterface innerTest2 = this.new InnerTest(); //within the scope of Test class, there's a inner class call InnerTest. create an instance of it !
     }

     public class InnerTest implements TestInterface{
        public void method2(){
           Test.this.method1(); //within the scope of "Test" class call the method method1
        }
     }
}

请注意,您也可以使用此关键字来链接类的构造函数。看一下这个例子:

public class Test {

    public Test() {
        this(0);
    }

    public Test(int r) {
        // Do Something Here
    }
}

<强>结论:

“this”关键字就像指向类范围的指针,使用“this”可以指向特定的类并执行任何操作。

您也可以将“this”关键字用于链类构造函数

答案 2 :(得分:1)

public class DataStructure {
    /** omitted */

    public void printEven() {
       //#1
       DataStructureIterator iterator = this.new EvenIterator();
       /** Omitted */
    }

    //#2
    private class EvenIterator implements DataStructureIterator {
      /** Omitted */
    }
}

所以这是个问题。

让我们看看我们有什么:

  1. 具有非静态方法DataStructure的类printEven。此类中的this关键字始终表示此类的当前实例/对象:DataStructure

  2. 内部类,即私有。这意味着此课程在外面不可见。它不是静态的,意味着你需要一个外部类的实例才能实现这个类成员(也就是内部类)。

  3. 所以,我们要创建EvenIterator的实例,我们需要一个。外类的一个实例,b。调用内部类的构造函数。

      DataStructureIterator iterator = this.new EvenIterator();
                                         |        `---- Call to constructor
                                         `-------------- instance of outer class 
    

    DataStructure.this中执行DataStructure是多余的。因为我们知道我们属于DataStructure的范围所以只有this才会这样做。 但是,如果您在内部类EvenIterator中,并且想要明确访问外部类的实例,则必须执行DataStructure.this,因为在内部类this中将表示EvenIterator的实例。

答案 3 :(得分:1)

在您的具体示例中,关键字this实际上是在外部类中编写的,而不是内部类。因此,它不以任何方式模糊 - 它只能引用DataStructure实例。因此,在这种情况下,将其限定为DataStructure.this是不必要的(但是合法的)。如果您在内部类中使用了this,并且您希望它引用DataStructure实例,则必须编写DataStructure.this

根据Java Language Specification 15.8.3 -

  

这个类型是C类,其中出现关键字。