Animal b = new Dog(); 向上转型的理解
参考文章:https://blog.csdn.net/zhangfan1913775361/article/details/95178806
为什么要用向上转型?因为为了让方法复用,只写一个以父类为形参的方法即可。但是会丢失子类的特有方法
核心就是下面代码-------看完就能理解
在下面的代码中
- Animal为父类,存在move方法
- Dog为子类,存在move,bark方法
- Animal animal=new Animal(); ok
- Dog dog=new Dog(); ok
- Animal dog=new Dog(); ok
- Dog animal=new Animal(); 错误
- 我的大概理解就是:子类是父类的属性,方法的更加完善版本,所以new 子类可以拿父类来接收
class Animal {
public void move() {
System.out.println("动物可以移动");
}
}
class Dog extends Animal {
@Override
public void move() {
System.out.println("狗可以跑和走");
}
public void bark() {
System.out.println("狗可以吠叫");
}
}
class TestDog {
// 形参类型只写一种Animal即可,如果没有向上转型,要写Dog,Fish,Cat等多种形参,那就累死了。
public static void doEat(Animal h) {
h.move();
}
public static void main(String args[]) {
Animal a = new Animal(); // Animal 对象
// 下一行就是向上转型,需要Animal,给个Dog,也行吧,但是不能执行Dog类的特有方法了。
Animal b = new Dog();
// 下一行需要Dog,给它Animal,肯定不行,编译出错!
// Dog d =new Animal();
Dog c = new Dog();
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
// b.bark() 该方法使用失败
c.bark();
//下两行体现了向上转型的精髓,假如没有向上转型,面对不同的实参,形参要写很多种,那样该方法要写多少个呀!!!!
doEat(new Dog()); //狗可以跑和走
doEat(new Animal()); //动物可以移动
}
}
结论:向上转型,是子类继承父类,并创建对象的过程。语法为“父类 对象名 = new 子类构造器”,如 父 对象 = new 子类();