在java多态中,this问题 解释
来源:互联网 发布:网络女胖子图片搞笑 编辑:程序博客网 时间:2024/06/06 09:39
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.没错,当前是只有一个对象,那就是
对象,他是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的方法,而不会父类的。
new Zi();
比如,你在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的方法,而不会父类的。
0 0
- 在java多态中,this问题 解释
- this解释
- this 在Java中的应用
- This在java中的运用
- Java中this的问题
- this用法解释
- jquery $(this)的解释
- this在Java中的具体应用
- This关键字在Java语言中的应用
- This关键字在Java语言中的应用
- java this 在构造方法中的使用
- 在Java中,关于this和super
- 在java中解释执行javascript命令
- Java内部类的this问题
- Java并发编程之this逃逸问题
- java中多态的this指向问题
- 关于 Java synchronized(this) 的问题?
- Java中有关this的一个问题
- Ffprobe查看媒体元数据
- linux编程之系统调用
- 各种距离
- iptables对请求的URL作IP访问控制
- Mysql命令alter add:增加表的字段
- 在java多态中,this问题 解释
- MVC Html.DropDownList 和DropDownListFor 的常用方法
- Android资源文件strings实现特殊字符转义
- 渗透测试演练平台RedTigers Hackit通关writeup以及wechall平台介绍
- LACP学习笔记
- 03_10Pandas_数据合并concat
- javaScript之数组(一)
- Google推荐的图片加载库Glide介绍
- opencv笔记:图像与数据的相互转换