4.4 多态性

1. 多态概述

多态是面向对象思想中的一个非常重要的概念,在Java中,多态是指不同类的对象在调用同一个方法时表现出的多种不同行为。

例如,要实现一个动物叫声的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象时就发出猫类的叫声,传入犬类对象时就发出犬类的叫声。在同一个方法中,这种由于参数类型不同而导致执行效果不同的现象就是多态。

2. 多态类型

Java中多态主要有以下两种形式:

  • 静态的多态,通过方法的重载实现。
  • 动态的多态,又称对象的多态,通过方法的重写实现。

2.1 动态多态的前提

  • 继承,在多态中必须存在有继承关系的子类和父类。

  • 重写,子类对父类的方法进行重写。

  • 父类引用指向子类对象。

2.2 多态的好处与弊端

  • 好处,提高了程序的扩展性,定义方法使用父类型作为参数,在使用时用具体的子类型参与操作。
  • 弊端,不能使用子类的特有功能。

2.3 多态形式

具体类多态、抽象类多态和接口多态。

3. 具体类的多态案例

  • 案例需求

定义动物类Animal,定义其方法eat(),方法用public修饰。

定义一个小狗类Dog,继承Animal类,在Dog类中覆盖Animal类中的方法eat(),输出“小狗爱吃骨头”。

定义一个小猫类Cat,继承Animal类,在Cat类中覆盖Animal类中的方法eat(),输出“小猫爱吃鱼”。

编写测试类,分别测试父类引用指向子类Dog和Cat对象,访问eat()方法。

  • Animal类

public class Animal {
    public void eat(){
        System.out.println("动物吃饭");
    }
}
  • Dog类

public class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }
}
  • Cat类

public class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
  • 测试类

public class TestAnimal {
    
    @Test
    public void test1(){
        //创建父类对象
        Animal animal = new Animal();
        animal.eat();
    }

    @Test
    public void test2(){
        //父类引用指向子类对象 测试Dog
        Animal animal = new Dog();
        animal.eat();
    }

    @Test
    public void test3(){
        //父类引用指向子类对象 测试Cat
        Animal animal = new Cat();
        animal.eat();
    }
}

4. 抽象类的多态案例

案例需求

定义抽象类Shape,定义其抽象方法getArea(),方法用public修饰。

定义一个圆类Circle,继承Shape类,在Circle类中覆盖Shape类中的抽象方法getArea(),计算圆的面积。

定义一个正方形类Square,继承Shape类,在Square类中覆盖Shape类中的抽象方法getArea(),计算正方形的面积。

编写测试类,基于抽象类的多态,计算所有图形的面积和。

  • Shape抽象类

public abstract class Shape {

    public abstract double getArea();

}
  • Circle类

public class Circle extends Shape{

    private double r;

    public Circle(double r){
        this.r = r;
    }

    @Override
    public double getArea() {
        return Math.PI * r * r;
    }
}
  • Square类

public class Square extends Shape{

    private double r;

    public Square(double r){
        this.r = r;
    }

    @Override
    public double getArea() {
        return r * r;
    }
}
  • 测试类

public class TestArea {

    /**
     * 求所有图形的面积和
     */
    @Test
    public void test(){
        Shape[] shapes = new Shape[2];
        shapes[0] = new Circle(1);
        shapes[1] = new Square(2);
        double sum = 0;
        for(Shape shape : shapes){
            sum += shape.getArea();
        }
        System.out.println("所有图形的面积和为:" + sum);
    }

}

5. instanceof关键字

Java中可以使用instanceof关键字判断一个对象是否是某个类(或接口)的实例,语法格式如下所示。

对象  instanceof  类(或接口)

上述语法格式中,如果“对象”是指定的类的实例对象,则返回true,否则返回false。

你可能感兴趣的:(Java程序设计,Java,多态性)