首页 新闻 会员 周边

关于JAVA的this关键字

0
悬赏园豆:10 [已解决问题] 解决于 2013-12-28 19:57

网上对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行相同的结果呢?

我真的是有点绕晕了。

Yancey.Han的主页 Yancey.Han | 初学一级 | 园豆:197
提问于:2013-12-27 01:04
< >
分享
最佳答案
0

首先确认一个概念 this指的是实例 

简单的说就是指向正在运行的代码的实例。

为什么没有打印peter呢?

   先要明白一个问题:当你new 一个SubT3对象时,这个SubT3对象有几个name属性?

         请在第四行打上断点,然后watch一下。

   然后你需要明白另外一个问题:func()方法能访问到的name属性是哪一个?

         如果想不明白,可以这样考虑:子类可以从超类继承"资产"(形象的说法),超类知道子类有什么资产吗?

  最后回到定义

         this指向的是当前对象,当前对象是什么类型,instanceof操作符是不会欺骗我们的。

       

收获园豆:10
F远方 | 菜鸟二级 |园豆:212 | 2013-12-27 17:24

谢谢你的回答,我找到问题所在了,三个问题其实是一个答案:

因为成员变量是不能被覆盖的。

我测试了一下,把两个类的name改成public,然后通过SuperT3 s2 = new SubT3();打印出的s2.name仍是Jack。

Yancey.Han | 园豆:197 (初学一级) | 2013-12-28 19:48
其他回答(2)
0

System.out.println(this instanceof SubT3);//true

System.out.println(s instanceof SubT3);//false

这里考虑到了转型的问题,可以说成SubT3是SuperT3 但不能说成SuperT3是SubT3 这里属于转型的问题,this同时也是表示调用该方法的实例

Crazy Lee | 园豆:211 (菜鸟二级) | 2013-12-28 00:15
0

this表示当前对象

java小农 | 园豆:204 (菜鸟二级) | 2013-12-28 00:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册