【问题标题】:this keyword in javajava中的this关键字
【发布时间】:2014-04-10 04:47:13
【问题描述】:

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

请参考this link

教程中有一些我看不懂的代码。

有人可以向我解释一下DataStructure 类中的这段代码是如何工作的吗?

DataStructureIterator iterator = this.new EvenIterator();

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

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

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

【问题讨论】:

  • @Ɍ.Ɉ:我不确定我是否买了那个……是的,它使用的是this,但它以一种非常规的方式使用它。我什至没有意识到你可以使用this做到
  • 执行该行的代码在哪里? this 是创建内部类实例所需的封闭实例。
  • 哇,你搜索整个互联网花了多长时间?您必须先将其下载到软盘吗?
  • @Ɍ.Ɉ - 这不可能是重复的。

标签: java this keyword


【解决方案1】:

声明 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();

将参考RunnableEvenIterator。要指向DataStructureEvenIterator,您可能需要编写

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

也就是说,我希望在DataStructure当前实例上创建EvenIterator,而不是Runnable 的当前实例

【讨论】:

    【解决方案2】:

    “this 关键字”指的是对象类的作用域:

    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
            }
         }
    }
    

    现在看看这个例子中的“这个关键字”:

    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
            }
         }
    }
    

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

    public class Test {
    
        public Test() {
            this(0);
        }
    
        public Test(int r) {
            // Do Something Here
        }
    }
    

    结论:

    “this”关键字的作用类似于指向类范围的指针,使用“this”您可以指向特定的类并做任何您想做的事情。

    您也可以使用“this”关键字来链接类构造函数

    【讨论】:

      【解决方案3】:
      public class DataStructure {
          /** omitted */
      
          public void printEven() {
             //#1
             DataStructureIterator iterator = this.new EvenIterator();
             /** Omitted */
          }
      
          //#2
          private class EvenIterator implements DataStructureIterator {
            /** Omitted */
          }
      }
      

      所以这是最基本的问题。

      让我们看看我们有什么:

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

      2. 一个内部类,它是私有的。这意味着这个类在外面是不可见的。这不是静态的,这意味着您需要一个外部类的实例才能实例化这个类成员(也称为内部类)。

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

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

      DataStructure 中执行DataStructure.this 是多余的。因为我们知道我们在DataStructure 的范围内,所以只需this 就可以了。 但是,如果您在内部类EvenIterator 中,并且想要显式访问外部类的实例,则必须执行DataStructure.this,因为在内部类中this 将表示EvenIterator 的实例。

      【讨论】:

        【解决方案4】:

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

        根据Java Language Specification 15.8.3-

        this 的类型是关键字 this 所在的 C 类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 2014-12-03
          • 1970-01-01
          • 1970-01-01
          • 2012-12-15
          • 1970-01-01
          • 2011-04-30
          相关资源
          最近更新 更多