我目前正在内部类部分阅读Oracle的Java教程。
请参阅this link
本教程中有一些我不理解的代码。
有人可以向我解释下面DataStructure
课程中的代码是如何工作的吗?
DataStructureIterator iterator = this.new EvenIterator();
外部课程不应该在DataStructureIterator iterator
和this.new EvenIterator()
之前,如下所示:
DataStructure.DataStructureIterator iterator = DataStructure.this.new EvenIterator();
我已经搜索了一段时间,但我没有找到任何答案。
答案 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 */
}
}
所以这是个问题。
让我们看看我们有什么:
具有非静态方法DataStructure
的类printEven
。此类中的this
关键字始终表示此类的当前实例/对象:DataStructure
。
内部类,即私有。这意味着此课程在外面不可见。它不是静态的,意味着你需要一个外部类的实例才能实现这个类成员(也就是内部类)。
所以,我们要创建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类,其中出现关键字。