name的作用域只在本类中,父类中的getName方法只能调用父类的name先找子类有有没有getName方法没有父类找,父类不能调用子类的成员
Java继承中的转型及其内存分配
看书的时
候被一段代码能凌乱啦,代码是这样的:
package 继承; abstract class People { public String tag = "疯狂Java讲义"; //① public String name = "Parent"; String getName(){ return name; } } class Student extends People { //定义一个私有的tag实例变量来隐藏父类的tag实例变量 String tag = "轻量级Java EE企业应用实战"; //② public String name = "Student"; } public class HideTest2 { public static void main(String[] args) { Student d = new Student(); //将d变量显式地向上转型为Parent后,即可访问tag实例变量 //程序将输出:“疯狂Java讲义” System.out.println(((People)d).tag); //④ System.out.println(d.getName()); //parent } }
运行结果:
疯狂Java讲义
Parent
在这个代码中,抽象父类People定义了两个变量和一个getName()方法,子类student也定义了两个和父类同名的变量,把父类的隐藏。
关于这段代码的两个困惑:1.子类实例化时必须首先实例化父类对象,而父类是抽象类,不能有对象。那到底子类实例化时产不产生父类对象???
2.d.getName();//返回的是parent,而不是student.不应该把父类的隐藏么??
书中是这么解释的:
Student对象会保存两份实例变量,一份是people中定义的实例变量,一份是Student中定义的实例变量,d变量引用一个Student对象,内存示意图如下:
将d向上转型为Parent对象,在通过它访问name变量是允许的,也就是输出“parent”。
但看着他的解释还是有点不明白,说的不是很清楚,又去网上搜了下:
java 子类实例化时是否同时存在一个父类对象.
2011-10-14 19:53
提问者: luoyuehao89 | 浏览次数:602次
java 子类实例化时是否同时存在一个父类对象.
假如父类A中有个int a = 1;
子类B继承A,同时B中覆盖个int a = 2;
运行:
A test = new B();
system.out.println(test.a);
结果是1,是父类中的属性.这个时候是否存在父类对象,我的理解是存在的.
我又试,把父类用抽象abstract修饰,按理说abstract累不能实例化吧,肯定不能得到父类中的a属性,结果还是一样的.
怎么理解.
问题补充:
是不是创建子类对象,肯定会出现一个父类的对象?
精彩回答
动态绑定定义
静态绑定与动态绑定
如果您觉得阅读本文对您有帮助,请点一下�?推荐”按钮,您的“推荐�?将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利�?