2 lendofworld lendofworld 于 2013.12.27 12:30 提问

关于JAVA的this关键字

网上对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个回答

cjopengler
cjopengler   2013.12.27 18:31
已采纳

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 会产生不可预知的结果。如果想改变基类的行为 重载他的函数 重新定义新的行为。

希望能帮到你

lendofworld
lendofworld 我测试了一下,把两个类的name改成public,然后通过SuperT3 s2 = new SubT3();打印出的s2.name仍是Jack。再次感谢。
大约 4 年之前 回复
lendofworld
lendofworld “成员变量是不会被重载的”这句我就豁然开朗了,其实三个问题都在于这句,谢谢。
大约 4 年之前 回复
u013277967
u013277967   2013.12.27 13:21

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

YangRuiHong
YangRuiHong   2013.12.27 16:21

this的确确表示指向自身的一个实例。为什么this可以参与instanceof运算或当作引用参数传进方法里,super为什么不能?因为this是一个instance(实例),所以可以参与instanceof运算或当作引用参数传进方法里。super在java里面只是一个关键字。具体用法:1.用户构造方法中。2.super.成员变量,super.成员方法。
new SubT3().func();这行代码,生成SubT3实例,func()方法是SubT3从其父类继承而来,执行时func()方法中的this指的是SubT3的实例。为什么没有打印出peter呢?我觉得是因为父类中this.name在编译时就确定是Jack了。至于你问题的第三点,this指的是subT3,这下第6行,16行的结果你明白了吧。

lendofworld
lendofworld 谢谢。
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!