• 4.4 多态性


    1. 多态概述

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

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

    2. 多态类型

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

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

    2.1 动态多态的前提

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

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

    • 父类引用指向子类对象

    2.2 多态的好处与弊端

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

    2.3 多态形式

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

    3. 多态案例

    • 案例需求

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

    定义一个小猫类Cat,继承Animal类,在Cat类中覆盖Animal类中的方法shout(),输出“小猫喵喵叫”。

    定义一个小狗类Dog,继承Animal类,在Dog类中覆盖Animal类中的方法shout(),输出“小狗汪汪叫”。

    编写测试类,编写测试方法makeSound(Animal animal),测试动物叫声。

    • Animal类

    1. public abstract class Animal {
    2. public abstract void shout();
    3. }
    • Cat类

    1. public class Cat extends Animal{
    2. @Override
    3. public void shout() {
    4. System.out.println("小猫喵喵叫");
    5. }
    6. }
    • Dog类

    1. public class Dog extends Animal{
    2. @Override
    3. public void shout() {
    4. System.out.println("小狗汪汪叫");
    5. }
    6. }
    • 测试类

    1. public class TestDemo {
    2. @Test
    3. public void testSound(){
    4. //父类引用指向子类对象 测试小狗叫声
    5. Animal animal = new Dog();
    6. animal.shout();
    7. //父类引用指向子类对象 测试小猫叫声
    8. Animal animal2 = new Cat();
    9. animal2.shout();
    10. }
    11. /**
    12. * 测试动物叫声
    13. * @param animal
    14. */
    15. public void makeSound(Animal animal){
    16. animal.shout();
    17. }
    18. }

    4. 练习

    • 案例需求

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

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

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

    编写测试类,基于抽象类的多态,将每个图形的面积放到数组中,计算数组中所有图形的面积和。

    • Shape抽象类

    1. public abstract class Shape {
    2. public abstract double getArea();
    3. }
    • Circle类

    1. public class Circle extends Shape{
    2. private double r;
    3. public Circle(double r){
    4. this.r = r;
    5. }
    6. @Override
    7. public double getArea() {
    8. return Math.PI * r * r;
    9. }
    10. }
    • Square类

    1. public class Square extends Shape{
    2. private double r;
    3. public Square(double r){
    4. this.r = r;
    5. }
    6. @Override
    7. public double getArea() {
    8. return r * r;
    9. }
    10. }
    • 测试类

    1. public class TestArea {
    2. /**
    3. * 求所有图形的面积和
    4. */
    5. @Test
    6. public void test(){
    7. Shape[] shapes = new Shape[2];
    8. shapes[0] = new Circle(1);
    9. shapes[1] = new Square(2);
    10. double sum = 0;
    11. for(Shape shape : shapes){
    12. sum += shape.getArea();
    13. }
    14. System.out.println("所有图形的面积和为:" + sum);
    15. }
    16. }

    5. instanceof关键字

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

    对象  instanceof  类(或接口)

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

    1. public class Animal {
    2. }
    3. public class Cat extends Animal {
    4. }
    5. public class Dog extends Animal {
    6. }
    7. public class TestDemo {
    8. @Test
    9. public void test(){
    10. Animal animal = new Animal();
    11. Dog dog = new Dog();
    12. Cat cat = new Cat();
    13. if (animal instanceof Animal) {
    14. System.out.println("animal 是 Animal 类型");
    15. } else {
    16. System.out.println("animal 不是 Animal 类型");
    17. }
    18. if (dog instanceof Animal) {
    19. System.out.println("dog 是 Animal 类型");
    20. } else {
    21. System.out.println("dog 不是 Animal 类型");
    22. }
    23. if (cat instanceof Animal) {
    24. System.out.println("cat 是 Animal 类型");
    25. } else {
    26. System.out.println("cat 不是 Animal 类型");
    27. }
    28. }
    29. }

  • 相关阅读:
    MySQL数据迁移遇到的一些错误
    信息技术 安全技术 信息安全管理测量
    单元测试(JUint)
    C++数据结构X篇_11_C++栈的应用-后缀表达式求解
    世界经济和金融秩序再定义 | 零数科技受邀出席第三届世界金融论坛
    python如何使用IP池
    Lua脚本之库存
    MySQL DDL执行方式-Online DDL介绍
    提升有限元分析核心能力,这三类概念思维不可或缺
    小程序备案小程序认证双系统
  • 原文地址:https://blog.csdn.net/lv_soso/article/details/133963992