为什么要用向上转型?因为为了让方法复用,只写一个以父类为形参的方法即可,不然形参为子类的话,每个子类都要单独写一个方法,那该多麻烦啊(只不过向上转型会丢失子类的特有方法)
向下转型是强转,可使用instance判断,用来调用子类的特有方法。
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()); //动物可以移动
}
}
但是向上转型丢失了子类特有的方法,这个就需要向下转型来弥补了。
向下转型参考文献:8.JAVA-向上转型、向下转型 - 诺谦 - 博客园
-----------------------------------------------------------------------------------------------------------------------------
以下为入门知识,可不看。
package cn.com;
class BaseClass{
public int book = 6;
public void base(){
System.out.println("父类的普通方法");
}
public void test(){
System.out.println("父类被覆盖的方法");
}
}
public class SubClass extends BaseClass {
public String book = "java基础书";
public void test(){
System.out.println("子类覆盖父类的方法");
}
public void sub(){
System.out.println("子类的普通方法");
}
public static void main(String[] args) {
BaseClass abc = new SubClass();
System.out.println(abc.book);
abc.test();
abc.base();
// 执行下面这一句会报错
// abc.sub();
}
}
输出结果:
6
子类覆盖父类的方法
父类的普通方法
得到结论。向上转型,是子类继承父类,并创建对象的过程。语法为“父类 对象名 = new 子类构造器”,如 父 对象 = new 子类();
子类继承后,只能调用父类中已有的方法,不能调用子类独特的方法。如果子类中已重写,则调用重写的方法。