浅谈 --- Java中多态的向上转型和向下转型

216 阅读2分钟

1. 什么是多态?

  • 多态指的是同一个行为有多种不同的表现形式。

2. 构成多态的三个充要条件

  1. 继承。
  2. 重写父类方法。
  3. 父类引用指向子类的对象(向上转型)或子类引用指向父类对象(向下转型)。

3. 代码分析

  • 父类:

    package com.hfut;
    
    /**
     * @author Chenzh
     */
    public class Animal {
    
        public String name = "我是父类,子类也存在";
        public String father = "我是父类,子类没有";
    
        public void eat() {
            System.out.println("我是父类,animal类");
        }
    
        public void sleep() {
            System.out.println("我是父类,我要睡觉了");
        }
    }
    
  • **子类1:Dog类

    package com.hfut;
    
    /**
     * @author Chenzh
     */
    public class Cat extends Animal {
    
        public String name = "我是子类,Cat类,父类也存在";
        public String sonCat = "我是子类,Cat类,父类没有";
    
        @Override
        public void eat() {
            System.out.println("我是子类,Cat类");
        }
    
        public void voice() {
            System.out.println("我是子类,喵喵喵!");
        }
    }** 
    
  • **子类2:Cat类

    package com.hfut;
    
    /**
     * @author Chenzh
     */
    public class Cat extends Animal {
    
        public String name = "我是子类,Cat类,父类也存在";
        public String sonCat = "我是子类,Cat类,父类没有";
    
        @Override
        public void eat() {
            System.out.println("我是子类,Cat类");
        }
    
        public void voice() {
            System.out.println("我是子类,喵喵喵!");
        }
    }** 
    
  • ** 主类:**

    package com.hfut;
    
    /**
     * @author Chenzh
     */
    public class Main {
        public static void main(String[] args) {
            // 向上转型
            Animal animal1 = new Dog();
            animal1.eat();
            animal1.sleep();
            System.out.println(animal1.name);
            System.out.println(animal1.father);
    
            System.out.println("===============================");
    
            // 向上转型
            Animal animal2 = new Cat();
            animal2.eat();
            animal2.sleep();
            System.out.println(animal2.name);
            System.out.println(animal2.father);
    
            System.out.println("===============================");
    
            // 向下转型
            Dog dog = (Dog) animal1;
            dog.eat();
            dog.voice();
            dog.sleep();
            System.out.println(dog.name);
            System.out.println(dog.father);
            System.out.println(dog.sonDog);
    
            System.out.println("===============================");
    
            // 向下转型
            Cat cat = (Cat) animal2;
            cat.eat();
            cat.voice();
            cat.sleep();
            System.out.println(cat.name);
            System.out.println(cat.father);
            System.out.println(cat.sonCat);
        }
    }
    
  • ** 运行结果:**

  • 说明:

向上转型(父类引用指向子类对象,默认转换):通过父类引用可以调用父类的方法和属性,但是不可以调用子类的方法和属性,如果子类和父类有相同的属性,则调用的是父类的属性;如果子类重写了父类的某方法,则调用的是子类的方法。

向下转型(子类引用指向父类对象,需要进行强制转换):通过子类引用可以调用子类和父类的方法和属性,如果子类和父类有相同的属性,则调用的是子类的属性;如果子类重写了父类的某方法,则调用的是子类的方法。

注意:在进行向下转型时之前,需要先进行向上转型,把向上转型的父类引用用作向下转型的对象,否则,会报类型转换异常。