- Father f1=new Daughter();
- Father f2=new Son();
- if(f1 instanceof Daughter){
- System.out.println("f1是Daughter的类型");
- }
- else{
- System.out.println("f1是Son的类型");
- }
- if(f2 instanceof Son){
- System.out.println("f2是Daughter的类型");
- }
- else{
- System.out.println("f2是Son的类型");
- }
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
- public class Test {
- public static void main(String[] args) {
- show(new Cat()); // 以 Cat 对象调用 show 方法
- show(new Dog()); // 以 Dog 对象调用 show 方法
-
- Animal a = new Cat(); // 向上转型
- a.eat(); // 调用的是 Cat 的 eat
- Cat c = (Cat)a; // 向下转型 这里属于向下转型,因为父类没有work这个方法
- c.work(); // 调用的是 Cat 的 work
- }
-
- public static void show(Animal a) {
- a.eat();
- // 类型判断
- if (a instanceof Cat) { // 猫做的事情
- Cat c = (Cat)a;
- c.work();
- } else if (a instanceof Dog) { // 狗做的事情
- Dog c = (Dog)a;
- c.work();
- }
- }
- }
-
- //这是一个抽象类,如果不懂,后面的博客我会介绍什么是抽象类
- //这里简单说明一下:抽象类也是类,只不过抽象类里面的方法可以没有具体的实现,可由子类去实现
- abstract class Animal {
- abstract void eat();
- }
-
- class Cat extends Animal {
- public void eat() {
- System.out.println("吃鱼摆摆");
- }
- public void work() {
- System.out.println("抓老鼠");
- }
- }
-
- class Dog extends Animal {
- public void eat() {
- System.out.println("吃骨头");
- }
- public void work() {
- System.out.println("看家");
- }
- }