Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个关键字是java中的_Java_This_Keyword - Fatal编程技术网

这个关键字是java中的

这个关键字是java中的,java,this,keyword,Java,This,Keyword,我正在阅读Oracle内部类部分的java教程 请参阅 在教程中有一些代码我不理解 有人能给我解释一下DataStructure类中下面的代码是如何工作的吗 DataStructureIterator iterator = this.new EvenIterator(); 外部类是否不应位于数据结构迭代器迭代器和this.new EvenIterator()之前,如下所示: DataStructure.DataStructureIterator iterator = DataStructure

我正在阅读Oracle内部类部分的java教程

请参阅

在教程中有一些代码我不理解

有人能给我解释一下
DataStructure
类中下面的代码是如何工作的吗

DataStructureIterator iterator = this.new EvenIterator();
外部类是否不应位于
数据结构迭代器迭代器
this.new EvenIterator()
之前,如下所示:

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

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

声明
DataStructure.DataStructure迭代器iterator=DataStructure.this.new eventirator()
有效,但在该方法的上下文中是多余的

考虑这个场景,其中存在冲突的内部类

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
EvenIterator
。要指向
数据结构
甚至迭代器
,您可能需要编写

DataStructureIterator itr = DataStructure.this.new EvenIterator();
也就是说,我希望在
DataStructure
当前实例上创建
EvenIterator
,而不是在
Runnable的当前实例上创建

public class DataStructure {
    /** omitted */

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

    //#2
    private class EvenIterator implements DataStructureIterator {
      /** Omitted */
    }
}
这就是赤裸裸的问题

让我们看看我们有什么:

  • 一个类
    数据结构
    ,它有一个非静态方法
    print偶数
    。此类中的
    this
    关键字将始终表示此类的当前实例/对象:
    DataStructure

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

  • 因此,我们想要创建一个
    eventirator
    的实例,我们需要一个。外部类b的实例。调用内部类的构造函数

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

    执行
    DataStructure。这在
    DataStructure
    中是冗余的。因为我们知道我们在
    数据结构
    的范围内,所以只要
    这个
    就行了但是,如果您在内部类
    甚至迭代器中,并且希望明确地访问外部类的实例,则必须执行
    数据结构,因为在内部类
    中,这个
    将意味着
    甚至迭代器的实例

    在您的特定示例中,关键字
    这个
    实际上是在外部类中编写的,而不是在内部类中编写的。因此,它在任何方面都不含糊-它只能引用
    数据结构
    实例。因此,没有必要(但合法)将其限定为
    数据结构。如果在内部类中使用了
    this
    ,并且希望它引用
    DataStructure
    实例,则必须编写
    DataStructure.this

    根据-

    这是发生此关键字的类C

    “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
            }
         }
    }
    
    请注意,您也可以使用此关键字来链接类的构造函数。看看这个例子:

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

    “this”关键字的作用类似于指向类范围的指针,使用“this”可以指向特定类并执行任何您想要的操作


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

    @Ɍ.Ɉ:我还不确定我是否买了……是的,它用的是
    这个
    ,但它用的是一种非传统的方式。我甚至没有意识到你可以用
    这个
    。执行该行的代码在哪里
    这个
    是创建内部类实例所需的封闭实例。哇,你花了多长时间搜索整个Internet?你必须先把它下载到软盘上吗?@Ɍ。Ɉ-这不可能是重复的。