为了账号安全,请及时绑定邮箱和手机立即绑定

关于JAVA的this关键字

关于JAVA的this关键字

潇湘沐 2019-04-18 14:15:35
网上对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行相同的结果呢?我真的是有点绕晕了。
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

1.this表示的是指向一个实例吗。如果不是指向一个实例,那么为什么this可以参与instanceof运算或当作引用参数传进方法里,super为什么不能?
-- this表示的是指向一个实例。 System.out.println(s instanceof SubT3);//false 这个地方之所以返回false 是因为 s的类型是 SuperT3 所以 “s instanceof SubT3” 是返回false

2.如果this表示当前对象,那么我在第4行new的SubT3的实例,在第14行为什么没有打印出peter呢。
--首先说this的类型是SubT3 这是确定的,所以this instanceof SuperT3 和 this instanceof SubT3都是true. 第14行打印出Jack是正确的。要从内存结构看,子类是无法覆盖父类的成员变量的,所以对于SubT3 来说里面有两个 name, 一个是Jack 一个是peter。那么究竟是调用哪个name呢?是调用基类的name,因为成员变量是不能重载的,也就是说 调用成员变量的函数在基类中 则使用基类的成员变量 调用成员变量的函数在子类中则使用子类中的成员变量。 如果想要 输出peter,只需要在SubT3 重载func 也就是将func的代码复制在SubT3中 就会输出peter. 记住:成员变量是不会被重载的 只有 函数会被重载。

3.如果在第14行时,this只表示SuperT3的引用(我也不知道到底引用什么),那为什么第16行没有打印出与第6行相同的结果呢?
--看第2条的回答 this不是superT3 是 subT3 只是因为成员变量是无法重载的 依赖于调用它的函数所在类。

另外说明一下,如果基类的成员变量可以被同名的子类中成员变量替换,那会产生灾难的后果。比如基类中有个数组 里面存储了一些 标识 比如 0 1 2 而在子类中 声明了同样一个名字的数组 里面是 3 4 5 那么基类运行到基类的方法的时候 本来处理 0 1 2 现在却处理 3 4 5 会产生不可预知的结果。如果想改变基类的行为 重载他的函数 重新定义新的行为。

希望能帮到你


查看完整回答
反对 回复 2019-05-06
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我也在学JAVA 这两天做课设 做的头都大了啊


查看完整回答
反对 回复 2019-05-06
  • 3 回答
  • 0 关注
  • 415 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号