Person stu=new Student();
Person是超类 Student是子类
stu和new Student()是一致的吗?而且stu属于Person类还是Student类?
我用程序测试的结果:
stu和new Student()不一致 不是同一个对象
stu是Person类而不属于Student类求高人指点!!!
Person是超类 Student是子类
stu和new Student()是一致的吗?而且stu属于Person类还是Student类?
我用程序测试的结果:
stu和new Student()不一致 不是同一个对象
stu是Person类而不属于Student类求高人指点!!!
stu是超类的引用,不属于子类,但可以指向子类的对象
2.stu是父类Person的引用,但是真正在堆中是Student类型的,stu.getClass()拿到。
3.stu这时候只能看到Person的那部分,看不到Student独用的那部分。
下面来说说灵活性:比如这次要调用Student中重写的Person的一些方法而下次又要调用Teacher中重写的Person的一些方法!这样只需要把原代码Person stu=new Student();改成Person stu=new Teacher();
就行了其他的都可以不变!这就是这样写的好处!
为什么呢?
还有,Student继续Person类,那么Student is a Person.
如
Person p = new Student();
Person 是声明类型,Student是实际类型。p只能调用声明类型(Person)的方法和属性。Student特有的属性和方法被隐藏(隐藏,不是消失)
但因为它实际类型是Student。所以,调用p的方法时,会去检查Student里有没有该方法,有的话,====================================
这种理解对不对:编译期和运行期
1、在编译期,声明类型起作用。p声明为Person类型,所以编译的时候,会检查p调用的属性,方法是不是p的,如果Person中不存在,报错。
2、运行期,实际类型起作用。因为p的实际类型是Student。编译成class时的时候,p已经变成Student类型了。