Java - 关于子类父类的向上转型,向下转型

时间:2022-08-09 03:44:51

以下Animal为父类,Dog,Cat作为子类,分别继承Animal

class Animal{
public void shout(){
System.out.println("叫了一声");
}
} class Dog extends Animal{
public void shout() {
System.out.println("旺旺旺");
}
public void seeDoor() {
System.out.println("看门中");
}
} class Cat extends Animal{
public void shout() {
System.out.println("喵喵喵");
}
}

总结:

  1. Dog对象转成Animal对象可行,如d2

      Cat对象转成Animal对象可行,如c2

  2. d2作为Animal对象转成Dog对象可行。如d3,且可执行一个Dog特有的方法

  3. c2作为Animal对象转成Dog对象,编译通过,运行报错,显示 java.lang.ClassCastException,类型转化出错

实例代码:

1. Dog对象转成Animal对象可行,如d2

Cat对象转成Animal对象可行,如c2

public class TestPoym{
public static void main(String[] args) {
Dog d1 = new Dog();
animalCry(d1);
Animal d2 = new Dog(); //向上转型
animalCry(d2);

      Animal c1 = new Cat();
      animalCry(c1);
      Animal c2 = new Cat();
      animalCry(c2);

    }

    static void animalCry(Animal a) {
a.shout();
}
}

结果:

Java - 关于子类父类的向上转型,向下转型

2. d2作为Animal对象转成Dog对象可行。如d3,且可实现一个Dog特有的方法,看门

public class TestPoym{
public static void main(String[] args) {
Dog d1 = new Dog();
animalCry(d1);
Animal d2 = new Dog(); //向上转型
animalCry(d2);
Animal c1 = new Cat();
animalCry(c1);
Animal c2 = new Cat();
animalCry(c2); Dog d3 = (Dog)d2; //向下转型
d3.seeDoor(); } static void animalCry(Animal a) {
a.shout();
}
}

结果:

Java - 关于子类父类的向上转型,向下转型

3.  c2作为Animal对象转成Dog对象,编译通过,运行报错,显示 java.lang.ClassCastException,类型转化出错

代码:

public class TestPoym{
public static void main(String[] args) {
Dog d1 = new Dog();
animalCry(d1);
Animal d2 = new Dog(); //向上转型
animalCry(d2);
Animal c1 = new Cat();
animalCry(c1);
Animal c2 = new Cat();
animalCry(c2); Dog d3 = (Dog)d2; //向下转型
d3.setDoor(); Dog c3 = (Dog)c2; //编译通过,运行出错,显示强制转换出错
} static void animalCry(Animal a) {
a.shout();
}
}

结果:

Java - 关于子类父类的向上转型,向下转型