向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。
class Animal {
String name="动物";
public void run(){
System.out.println("动物在奔跑.");
}}
class Dog extends Animal{
String name = "狗";
public void run(){
System.out.println("狗在奔跑.");//覆盖父类方法
}
public void eat(){
System.out.println("狗吃东西.");
}}
public class C{
public static void main(String[] args) {
Animal b=new Dog(); //向上转型
System.out.println(b.name);
b.run();
// b.eat(); //加上错误!此处提示在Animal中没有定义。
}}
输出结果:
动物
狗在奔跑.
Anmial b = new Dog()表示定义了一个Anmial类型的引用,指向新建的Dog类型的对象。由于Dog是继承自它的父类Anmal,所以Anmial类型的引用是可以指向Dog类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特
定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,是不能被调用的;
因此b.name调用父类的属性! b.eat方法父类中没有,报错!
父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
因此b.run()调用子类的方法!
向上转型都会成功,是安全的。 就像说狗是动物没问题。但通过b若调用 动物 或 狗类中任意方法都报异常,也就是说向下转型可能会出错 不能说动物是狗