网上对this的描述很朦胧,有的说this表示的是当前对象自己,有的说this是当前对象的引用。
可是自己写了如下的测试代码,产生了几个问题:
1 public class T3AboutThis { 2 3 public static void main(String[] args) { 4 new SubT3().func(); 5 SuperT3 s = new SuperT3(); 6 System.out.println(s instanceof SubT3);//false 7 } 8 } 9 10 class SuperT3 { 11 protected String name = "Jack"; 12 13 protected void func() { 14 System.out.println(this.name);//Jack 15 System.out.println(this instanceof SuperT3);//true 16 System.out.println(this instanceof SubT3);//true 17 } 18 } 19 class SubT3 extends SuperT3 { 20 protected String name = "Peter"; 21 }
1.this表示的是指向一个实例吗。如果不是指向一个实例,那么为什么this可以参与instanceof运算或当作引用参数传进方法里,super为什么不能?
2.如果this表示当前对象,那么我在第4行new的SubT3的实例,在第14行为什么没有打印出peter呢。
3.如果在第14行时,this只表示SuperT3的引用(我也不知道到底引用什么),那为什么第16行没有打印出与第6行相同的结果呢?
我真的是有点绕晕了。
首先确认一个概念 this指的是实例
简单的说就是指向正在运行的代码的实例。
为什么没有打印peter呢?
先要明白一个问题:当你new 一个SubT3对象时,这个SubT3对象有几个name属性?
请在第四行打上断点,然后watch一下。
然后你需要明白另外一个问题:func()方法能访问到的name属性是哪一个?
如果想不明白,可以这样考虑:子类可以从超类继承"资产"(形象的说法),超类知道子类有什么资产吗?
最后回到定义
this指向的是当前对象,当前对象是什么类型,instanceof操作符是不会欺骗我们的。
谢谢你的回答,我找到问题所在了,三个问题其实是一个答案:
因为成员变量是不能被覆盖的。
我测试了一下,把两个类的name改成public,然后通过SuperT3 s2 = new SubT3();打印出的s2.name仍是Jack。
System.out.println(this instanceof SubT3);//true
System.out.println(s instanceof SubT3);//false
这里考虑到了转型的问题,可以说成SubT3是SuperT3 但不能说成SuperT3是SubT3 这里属于转型的问题,this同时也是表示调用该方法的实例
this表示当前对象