关于继承时子类重写父类方法和覆盖父类变量的若干问题 (待进一步研究)
来源:互联网 发布:长岛顶级快网络 编辑:程序博客网 时间:2024/05/17 22:45
假设,子类重载父类的方法,并将子类的成员覆盖。
创建子类对象实例,将其上转型成父类。
例子1
public class Parent {public void init() {System.out.println("1 init parent");this.demo();}public void demo() {System.out.println("2 demo parent");}}
public class Son extends Parent {public void init(){super.init();System.out.println("3 init son");this.demo();}public void demo() {System.out.println("4 demo Son");}public static void main(String[] args) {//Parent p = new Son();//1Son son = new Son();//2son.init(); // init(son)}}
当执行1时结果为:
1 init parent
4 demo Son
3 init son
4 demo Son
当执行2时结果为:
1 init parent
4 demo Son
3 init son
4 demo Son
情况1和情况2其实是相似的,由于使用new Son()创建实例,上转型之后,访问的也是子类重载的方法而Parent中的init()方法中的this也被认为是指向堆区域中son的实例化对象,故this.demo()访问的仍然是子类中重载的方法。
例子2
public class Parent {public String name="tom";public void init() {System.out.println(this.name);}}
public class Son extends Parent {public String name="jack";public void init(){super.init();System.out.println(this.name);}public static void main(String[] args) {//1 当前运行类 Son Son son = new Son(); son.init(); //init(son)System.out.println("## " + son.name);//2 当前运行类Parent Parent p = new Son();p.init();System.out.println("** " + p.name);}}
当代码运行1时 我猜测结果应该是:
jack
jack
##jack
但实际结果却是:
tom
jack
## jack
此时Parent类中this.name指向的是父类中的name值
只有几种情况可以解释这种结果
1.this并不指向son在堆中创建的实例
2.创建对象时内存中使用了其他机制来保证这种结果的生成。
翻看了一下《深入理解Java虚拟机 JVM高级特性与最佳实践》这本书 似乎得出了一些端倪
由此可见当访问成员变量时,检测到父类的成员变量之后程序停止继续寻找。
对于方法,由于其内容存放在方法区内,每个对象的发放应该是通过其自身的this即引用唯一绑定。故就差不多解释的通了。
《深入理解Java虚拟机 JVM高级特性与最佳实践》一书的下载地址:
http://www.jb51.net/books/163531.html#down
上面只是个人的一点点猜测 ,不吝赐教。
1 0
- 关于继承时子类重写父类方法和覆盖父类变量的若干问题 (待进一步研究)
- Java 子类继承父类方法的重写(或者覆盖,override)
- java 子类继承父类 -- 重写、覆盖
- 关于Java中子类能否继承和重写父类的静态方法问题
- 继承的顺序,子类覆盖继承父类的方法
- 继承 子类对父类成员变量的覆盖
- java 子类继承父类 -- 重写、覆盖与多态
- 子类不能继承或覆盖父类的private方法
- 【Java笔记】继承父类的方法可以调用子类的方法(子类必须在重写相应方法)
- 关于子类重写父类方法override
- 子类继承父类(重写父类的静态方法,子类方法必须也是静态的)
- 子类覆盖父类的成员变量
- java 子类可以继承父类中的什么,子类中方法覆盖,final关键字的含义
- 继承 子类对父类方法的覆盖 构造方法的继承 super
- Java 继承 父类变量, 方法 与子类的关系:
- 当两个类构成继承关系时,子类是否必须重写父类的所有方法?
- 子类继承父类,new 一个子类对象的过程(待完善)
- Java子类继承(二):隐藏成员变量和方法重写的理解
- 学习日记之大话设计模式和Effective C++大结局
- java——zip解压
- 模拟鼠标、键盘事件
- UVALive 5691 二分图匹配||陈老师的多校联合20140818 J题
- Strust2 属性异常
- 关于继承时子类重写父类方法和覆盖父类变量的若干问题 (待进一步研究)
- 1408182100-hd-ASCII.cpp
- uva 1563 - SETI(高斯消元+逆元)
- Count Color+POJ+线段树区间更新+位运算(lazy标志的运用)
- 好东西 来看看 http://hsndaihu.isitestar.cn/
- 查看Android虚拟机上的文件
- 黑马程序员 【】java学习之路——集合Collecton
- Julia科学记数法格式输出问题
- 数据结构学习13——递归运用