日期:2014-05-20  浏览次数:20702 次

继承的问题
Person stu=new Student();
Person是超类 Student是子类
stu和new Student()是一致的吗?而且stu属于Person类还是Student类?
我用程序测试的结果:
stu和new Student()不一致 不是同一个对象
stu是Person类而不属于Student类

求高人指点!!!

------解决方案--------------------
stu是超类的引用,但是如果子类中覆盖超类中的方法,stu会调用子类中的方法
------解决方案--------------------
1.stu就是指向new Student。
2.stu是父类Person的引用,但是真正在堆中是Student类型的,stu.getClass()拿到。
3.stu这时候只能看到Person的那部分,看不到Student独用的那部分。
------解决方案--------------------
这好像有点像想多肽了吧!这样做可以使程序有最大的灵活性!当我们访问stu时只能访问Student中的重写Person的哪些方法对Person特有的方法通过stu是访问不了的!
下面来说说灵活性:比如这次要调用Student中重写的Person的一些方法而下次又要调用Teacher中重写的Person的一些方法!这样只需要把原代码Person stu=new Student();改成Person stu=new Teacher();
就行了其他的都可以不变!这就是这样写的好处!
------解决方案--------------------
java变量有两种类型,一种是声明类型,一种是实际类型。

Person p = new Student();
Person 是声明类型,Student是实际类型。

p只能调用声明类型(Person)的方法和属性。Student特有的属性和方法被隐藏(隐藏,不是消失)
但因为它实际类型是Student。所以,调用p的方法时,会去检查Student里有没有该方法,有的话,。。。

====================================
这种理解对不对:编译期和运行期
1、在编译期,声明类型起作用。p声明为Person类型,所以编译的时候,会检查p调用的属性,方法是不是p的,如果Person中不存在,报错。
2、运行期,实际类型起作用。因为p的实际类型是Student。编译成class时的时候,p已经变成Student类型了。