为什么子类对象可以赋值给父类,而父类对象不可以赋值给子类呢?

为什么子类对象可以赋值给父类,而父类对象不可以赋值给子类呢?
标签: 多态 向上转型 向下转型 父类引用指向子类对象 子类引用指向父类对象
假设现在有两个类:父类Parent和子类Children1。

通常我们会看到这样子的写法:

Parent p=new Children1();

或是:

Parent p=new Parent();

Children1 c=new Children1();

p=c;

问题1:这样子写有什么作用?
问题2:为什么不能写成“Children1 c=new Parent( )”?

解答问题1:
体现面向对象编程的多态性。

看一个例子:

package com.hubu.basic;

public class Test {
public static void main(String[] args) {
Parent p=new Children1(); //向上转型,只能访问父类中子类继承的方法,如果有重写,输出的是子类的方法,如show( )
p.show();

Childred1 c=(Childred1)p; //向下转型,可以访问子类的所有非private方法,如play( )

c.play();

p=new Children2();
p.show();
}

}
class Parent{
public void show(){
System.out.println(“Parent”);
}
}
class Children1 extends Parent{
public void show(){
System.out.println(“Children1”);
}

public void play(){
System.out.println(“Children1—play”);
}

}
class Children2 extends Parent{
public void show(){
System.out.println(“Children2”);
}
}

输出的结果是:

Children1

Children1—play
Children2

通过父类发出的指令p.show( ),得到的是不同子类响应,体现的就是多态的特性,而且代码得到了重复使用。

解答问题2:
也可以用面向对象编程的多态性来解释。多态,说白了,就是父类发出一个指令,得到不同的响应罢了,具体实现就是Parent p,然后分别指向不同的子类对象,之所以会有不同的响应是因为子类重写了该方法,即多态机制;但是,反过来就不行,因为子类可以有很多其他的方法,这是父类没有的,所以会报错。通俗点,老师是人,但人不一定是老师。

附加:
当父类引用f指向其子类的对象的时候,通过f无法访问专属于子类对象的成员。
为什么这样不可以?LZ有没有想过,因为f是FatherClass,所以编译器只知道f拥有FatherClass.class的信息,FatherClass.class以外的信息,编译器不知道,而子类的对象成员是在SonClass.class里,也就是说在FatherClass.class以外,所以f无法访问子类的对象成员

假如子类中有对父类方法的重写,那么根据多态机制,通过f访问这个方法的时候实际访问的是子类中重写的方法。
为什么这样可以?上面说了,f只能访问FatherClass.class的信息(注意这里指的是编译期编译器只知道f是FatherClass类型,不知道f具体指向什么对象,运行期才知道指向什么对象),而子类重写的方法,父类中也存在,即SonClass.class重写的方法,FatherClass.class里也有(如果SonClass.class里有但是FatherClass.class里没有的方法,f也不能直接调用),所以f可以访问,但是调用的时候(注意这里指的是运行期),f实际指向的是SonClass对象,所以调用的是SonClass对象的方法。

问题是如果子类重写的方法中访问了专属于子类的成员变量,这时候通过父类引用f还可以调用那个被重写的方法吗?
可以,要分清编译期和运行期,编译期是编译器检查语法和类型,运行期是解析器解析伪代码为机器指令而执行,编译期编译器会检查f的访问范围,也就是f的访问不超过FatherClass.class的信息就不会出错,运行期解析器会解析方法的代码指令,因为f指向子类对象,所以会解析子类重写的方法代码指令,而子类对象的内存空间是包含子类的成员变量的空间的,所以也不存在子类成员变量没有分配内存的问题,所以可以调用。

原文链接:http://blog.sina.com.cn/s/blog_d6ccf0b00102uzc7.html

猜你喜欢

转载自blog.csdn.net/Captain_Aaron/article/details/111663789