面向对象——多态

目录

一、实现多态

1.认识多态

2.向上转型

3.向下转型

4.instanceof运算符

二、多态的应用

1.使用父类成为方法的参数

2.使用父类成为方法的返回值


一、实现多态

1.认识多态

指能够呈现出多种不同的形式或形态。意味着一个特定类型的变量,可以引用不同类型的对象,并且能自动的调用引用的对象的方法。方法重写是实现多态的基础。

package method;

public class Pet { 
    public void toHospital(){
        System.out.println("宠物看病");
    }
}
class Dog1 extends Pet{
    public void toHospital() {
        System.out.println("狗狗看病");
    }
}
class Bird extends Pet{
    public void toHospital() {
        System.out.println("小鸟看病");
    }
}
package method;

public class Test {
    public static void main(String[] args) {
        Pet pet=null;
        pet=new Dog1();
        pet.toHospital();
        pet=new Bird();
        pet.toHospital();
    }

}

 面向对象——多态_第1张图片

 多态意味着在一次方法调用中根据包含的对象的实际类型(实际子类的对象)来决定应该调用哪个子类的方法,而不是由用来存储对象引起的变量的类型来决定的。为了实现多态的操作,这个方法即使在父类中声明过,也必须是在子类中重写过的方法。

2.向上转型

子类向父类转换称为向上转型。

父类类型 引用变量名=new 子类类型();

多态就是说一个父类可能有多个子类,每个子类都重写了父类的方法,当父类引用调用方法时,父类引用指向哪个子类,就调用哪个子类的方法,形成了父类引用调用相同的方法名称时,有不同的输出形态。

实现多态的三个条件:

  • 子类继承父类,并且父类重写继承的方法。
  • 父类引用指向子类对象。父类引用可以指向任何一个子类对象。
  • 父类引用调用方法时,实际上调用的是子类的方法,不同的子类有不同的方法实现,体现出同一个方法在不同子类中的不同形态的表现。

调用的时候应该注意:

  • 父类只能调用子类从父类继承的方法或重写的方法。
  • 父类不能调用子类新增的方法。 

3.向下转型

当向上转型发生后,将无法调用子类新增的办法。如果需要调用子类新增的办法,,可以通过把父类转化为子类实现。

将一个指向子类对象的父类引用赋值给一个子类的引用,即将父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。

子类类型 引用变量名 =(子类类型)父类类型的引用变量;

4.instanceof运算符

package method;

public class Pet {
    public void toHospital(){
        System.out.println("宠物看病");
    }
}
class Dog1 extends Pet{
    public void toHospital() {
        System.out.println("狗狗看病");
    }
    public void catchingFlyDisc(){
        System.out.println("接飞盘");
    }
}
class Bird extends Pet{
    public void toHospital() {
        System.out.println("小鸟看病");
    }
    public void fly(){
        System.out.println("飞翔");
    }
}
package method;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入宠物,1:狗狗,2.小鸟");
        int choice=sc.nextInt();
        Pet pet=null;
        switch (choice){
            case 1:
                pet=new Dog1();
                break;
            case 2:
                pet=new Bird();
                break;
        }
        pet.toHospital();
        if (pet instanceof Dog1 dog1){
            dog1.catchingFlyDisc();
        }
        if (pet instanceof Bird bird){
            bird.fly();
        }
    }

}

 面向对象——多态_第2张图片

在Java16的增强之后,对于instanceof的判断以及类型转换可以合二为一了。

可以使用getClass()来进行类型转换的判断。(同一个类的对象才能判断true)

getClass()返回的是运行时类的class对象,所以比较时要使用==运算符,而不是使用equals方法,使用getClass()方法进行的、类型转换的判断通常用于处理特定类型的对象,而不是用于处理继承层次结构的类型判断,在处理继承层次结构时,通常使用instanceof运算符。 

二、多态的应用

多态的优势:

  • 可替换性:多态对于已存在的代码具有可替换性。
  • 可扩充性:增加新的子类不影响已存在类的多态性、继承性,以及其它特性的运行和操作。
  • 接口性:多态是父类向子类提供了一个共同的接口,由子类来具体实现。
  • 灵活性:多态在应用中体现了灵活多变的操作。
  • 简化性:多态简化了应用软件的代码编写和修改过程。

1.使用父类成为方法的参数

2.使用父类成为方法的返回值

你可能感兴趣的:(java,开发语言)