Java面向对象笔记(九)多态

    xiaoxiao2021-04-17  33

    一、什么是多态

    多态就是指一个事物具备了多种表现形态

    二、多态的体现

    ①父类的引用指向了自己的子类对象

    ②父类的引用也可以接受自己的子类对象

    二、多态的前提

    ①必须是类与类之间有关系,要么被继承,要么被实现

    ②通常存在覆盖(重写)

    三、多态的好处

    大大的提高了程序的扩展性

    例:

    //定义一个Animal类描述动物的共性 class Animal { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void eat(){ System.out.println("动物吃饭...."); } protected void sound(){ System.out.println("动物的声音...."); } } //Cat类继承Animal类 class Cat extends Animal { public void eat(){ //重写父类eat方法 System.out.println("猫吃鱼"); } public void sound(){ System.out.println("喵喵喵"); } public void showCat(){ System.out.println("I am a cat"); } } //Dog类继承Animal类 class Dog extends Animal { public void eat(){ System.out.println("狗吃骨头"); } public void sound(){ System.out.println("汪汪汪"); } public void showDog(){ System.out.println("I am a dog"); } } //动物类测试类 class AnimalTest { public static void main(String[] args){ //没有使用多态的写法 Cat c = new Cat(); c.eat(); c.sound(); Dog d = new Dog(); d.eat(); d.sound(); /* 当有了一个新的动物老鼠时,需要重新实例化一个对象,调用老鼠的方法 使得代码变得麻烦。 */ //使用多态的写法,只要是动物就可以调用function()实现功能, //大大的提高了程序的扩展性 function(new Cat()); function(new Dog()); } public static void function(Animal a){ a.eat(); a.sound(); } }

    四、多态的弊端

    ①只能使用父类的引用访问父类中的成员

    Animal a = new Cat();  //类型提升,向上转型

    这意味着对象a只能访问父类Animal类中存在的成员,而不能访问自己特有的成员。

    ②如果想要调用猫的特有方法,强制将父类的应用转成子类类型   向下转型

    Cat c = (Cat)a;

    //将对象a转成Cat型后就可以访问Cat特有的方法

    a.showCat();

    五、在多态中成员的特点

    ①成员函数

    在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败

    Animal a = new Cat();

    a.eat();

    编译时,a对象调用的方法只能是Animal中存在的方法,否则编译失败

    在运行时期:参阅对象所属的类中是否有调用的方法。

    Animal a = new Cat();

    a.eat();

    运行时,a调用的方法是Cat类中重写后的eat()方法

    简单总结:成员函数在多态调用时,编译看左边,运行看右边

    ②成员变量

    无论编译还是运行,都参阅引用型变量所属的类中是否存在该成员变量。

    即成员变量在多态调用时,都看左边。

    ③静态成员

    在多态中,静态成员函数和变量的调用都看左边。

    六、instanceof 关键字

    a  instanceof  b   //判断a是否为b的对象

    例:

    Animal a = new Cat(); //判断对象a是否为Cat的实例,若是强制将a转成Cat型,调用Cat特有的方法showCat(). if(a instanceof Cat){ Cat b = (Cat)a; b.showCat(); }
    转载请注明原文地址: https://ju.6miu.com/read-673497.html

    最新回复(0)