Java 多态

可以理解为事物存在的多种体现形态。

人:男人,女人
动物:猫,狗。

多态的体现

  • 父类的引用指向了自己的子类对象。
  • 父类的引用也可以接收自己的子类对象。

多态的前提

  • 必须是类与类之间有关系。要么继承,要么实现。
  • 通常还有一个前提:存在覆盖。

多态的好处与弊端

  • 多态的出现大大的提高程序的扩展性。
  • 只能使用父类的引用访问父类中的成员。
abstract class Animal {
    abstract void eat();
}

class Cat extends Animal {
    public void eat() {
        System.out.println("吃鱼");
    }

    public void catchMouse() {
        System.out.println("抓老鼠");
    }
}

class Test {
    public static void main(String[] args) {
        Animal a = new Cat();//类型提升。 向上转型。
        a.eat();
        //如果想要调用猫的特有方法时,如何操作?
        //强制将父类的引用。转成子类类型。向下转型。
        Cat c = (Cat)a;
        c.catchMouse();
    }
}

运行结果:
吃鱼
抓老鼠

多态特点

在多态中成员函数的特点

  • 在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
  • 在运行时期:参阅对象所属的类中是否有调用的方法。
    简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点

  • 无论编译和运行,都参考左边(引用型变量所属的类)。

在多态中,静态成员函数的特点:

  • 无论编译和运行,都参考做左边。
class Fu {
    static int num = 5;

    void method1() {
        System.out.println("fu method_1");
    }

    void method2() {
        System.out.println("fu method_2");
    }

    static void method4() {
        System.out.println("fu method_4");
    }
}

class Zi extends Fu {
    static int num = 8;

    void method1() {
        System.out.println("zi method_1");
    }

    void method3() {
        System.out.println("zi method_3");
    }

    static void method4() {
        System.out.println("zi method_4");
    }
}

class DuoTaiDemo4 {
    public static void main(String[] args) {
        Fu f = new Zi();
        System.out.println(f.num);
        f.method2();
        f.method1();
    }
}

运行结果:
5
fu method_2
zi method_1

原文地址:https://www.cnblogs.com/hen-java/p/12601550.html