在看《Think in Java》时看到有讲.this的知识,以前只用过this这个关键字,对于.this很是陌生。
书中是这样写的’如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟原点和this‘,开始没有看懂。先看书中的代码:
public class DotThis {
void f() {
System.out.println("DotThis.f()!");
}
public class Inner {
public DotThis outer() {
return DotThis.this;
}
}
public Inner inner() {
return new Inner();
}
}
看到这些代码,我有些疑惑,DotThis.this是直接返回一个DotThis对象吗?和new DotThis()有什么区别?只是这么看,干思考是没多大用,那就实践见分晓。之后我改了代码,改的代码:
package innerclassses;
/**
* @Auther Dongqiang
* @Date 2018/1/23 11:23
*/
public class DotThis {
void f() {
System.out.println("DotThis.f()!");
}
public class Inner {
public DotThis outer1() {
return new DotThis();
}
public DotThis outer2() {
return DotThis.this;
}
}
public Inner inner1() {
return new DotThis.Inner();
}
public Inner inner2() {
return new Inner();
}
}
package innerclassses;
/**
* @Auther Dongqiang
* @Date 2018/1/23 11:30
*/
public class DotThisTest {
public static void main(String[] args) {
DotThis dotThis = new DotThis();
DotThis.Inner inner1 = dotThis.inner1();
DotThis.Inner inner2 = dotThis.inner2();
System.out.println(inner1.equals(inner2));//false
System.out.println(dotThis.equals(inner1.outer1()));//false
System.out.println(dotThis.equals(inner1.outer2()));//true
System.out.println(dotThis.equals(inner2.outer1()));//false
System.out.println(dotThis.equals(inner2.outer2()));//true
}
}
结果是outer2()返回的DotThis.this对象和开始创建的doThis是同一个,所以现在我就可以理解书中的那句话”如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟原点和this“,关键在对外部类对象的应用,我们写全了来看dotThis.inner1().outer2()和dotThis,就可以看到DoThis.this就是调用这个方法的对象。可以通过如下的图来理解
也就是外部类生命内部类,而内部类使用声明他的外部类。这就是我的理解,如果有什么不对的地方请留言。谢谢!