在我学习多态的过程中,我碰见父类对象引用指向子类对象实体的情况,
为此,我对于其调用哪些方法以及的其具体的结构产生的一些疑问,
下面是我的一些看法。
一般的创建对象是是这样的
这两段代码唯一的区别就是new 后面的代码不同。
下面是我的一些看法:
一般的创建对象,是在栈空间中声明一个变量,这和普通基本数据类型变量相似,
第二段代码:
“=”左边:在栈空间中声明一个Class类型的变量,变量名是obj,变量所记录的的是首地址,
“=”右边:变量的首地址指向了它 的实例化,内容是Class类的成员。
用obj对象调用方法,其实是调用Class类的成员方法。
接下类看第一段代码:
“=”左边:在栈空间中声明一个Father类型的变量,变量名是obj,变量所记录的的是首地址,
“=”右边:变量的首地址却是指向子类的实体对象。
那么问题来了,调用的方法是谁的呢?我做了一些测试
- class Parent {
- String name;
- int age;
-
- public void print(){
- System.out.println("parent");
- }
- }
- class Son extends Parent{
- int a = 1;
- public void print(){
- System.out.println("son");
- }
- public void show(){
- System.out.println("sonshow");
- }
- }
- class Goon{
- public static void main(String[] args) {
- Parent p = new Son();
- p.print();
- }
- }
复制代码
运行的结果:子类的方法结果
但是把子类重写的方法注释掉呢:
那么结果是父类的。那么试下调用子类特有的方法,结果是编译报错。
这样我就有思路了:
在父类对象引用指向子类对象实体的时候,调用的是子类的成员,
因为子类继承了父类的成员,所以才能调用。
但是因为变量的父类类型的,所以只能调用子类继承的父类的成员,而不能调用子类所特有的成员
那么又有一个问题了——为什么调用print()方法时候结果显示子类的结果呢?是不是调用子类的的方法呢?
答案是:是的。
这是为什么呢?
那是因为子类重写了父类的print()方法,当试图调用子类所继承的父类的print()方法时,,它被“挡住了“。
子类重写父类方法时,其实已经覆盖了父类被重写的方法
所以,在这种多态的情况下,
对象引用只能调用子类中父类已经声明的成员。
|
|