您的位置:首页 > 编程语言 > Java开发

在java多态中,this问题 解释

2016-12-27 11:13 190 查看

https://www.zhihu.com/question/37115952

在java多态中,this到底是代表什么?不是当前对象吗?

问题:

public class Demo {

public static void main(String [] args){

Fu f = new Zi();
f.show();

}

}

class Fu{

int num = 1;

void show(){

System.out.println(this.num);

}

}

class Zi extends Fu{

int num = 2;

}

输出:1

当前不是只有一个zi类对象吗?为什么父类指向子类对象而调用的是fu类的变量呢?

1.Java中只有Method有多态的特征,可以被覆盖,而Field不可以被覆盖,如果Field重名,具体调用哪个,与引用类型有关。因为Java的这个特性,所以Java才推广JavaBean,即使用Getter/Setter代替Field,除了可以规避上述问题之外,还可以有选择的分别控制设置和读取的权限。

 

2.没错,当前是只有一个对象,那就是

new Zi();
[/code]

对象,他是Zi类型的,就是在堆当中有这么一个对象。但是他是继承Fu。在Java,方法可以被覆盖,凡是Field就不行。

比如,你在Fu有一个可以被继承的play()方法,在Zi类Override了这个方法,当使用fu引用调用Zi对象的时候就是调用Zi的play()方法。当时,加入Zi和Fu有一个同名的变量,那么,在Fu的内存空间,这两个变量都会存在,比如Fu有一个int a。Zi也有一个int a,那么堆空间就是都有了这两个变量的内存,这时候,是声明时类型起作用,就是声明属于那个那个类的Field就是调用那个类的Field。

关于this,你可以打印this.getClass()看一下,在这里应该是Zi。为什么?因为他是运行时候的对象,现在是new Zi(),父类对应被调用的方法传入的就是Zi的对象了。所以,他会调用Zi的方法,而不会父类的。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: