• Java面向对象进阶3——多态的概述及特点


    一、前言

    本文将讲述Java三大特性之一的多态

    二、概述

    1️⃣定义

    在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(polymorphic type)可以将自身所支持的操作套用到其它类型的值上。计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。

    简单来说,多态是对象的多种形态

    2️⃣多态的前提

    • 有继承/实现关系
    • 有父类引用指向子类对象
    • 有方法的重写

    三、多态的格式

    • 父类类型 变量名 = new 子类/实现类构造器;
    • 变量名.方法名();
    Person p = new Student();
    p.sleep();
    p.eat();
    p.drink();
    
    • 1
    • 2
    • 3
    • 4

    四、多态的使用

    1️⃣题目

    请写一个程序描述老师和学生行为
    老师:吃饭、喝水、睡觉、教书
    学生:吃饭、喝水、睡觉、学习

    2️⃣分析

    • 老师和学生同属于一个大类:人
    • 老师和学生的行为部分相同(吃饭、喝水、睡觉)
    • 学生特有的行为:读书
    • 老师特有的行为:教书

    3️⃣分析图

    在这里插入图片描述

    4️⃣代码实现

    Person类实现

    public class Person {
    
        public void sleep(){
            System.out.println("睡觉");
        }
    
        public void eat(){
            System.out.println("吃饭");
        }
    
        public void drink(){
            System.out.println("喝水");
        }
    
        public void daytime(){
            System.out.println("平时要做的事情");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Student类实现

    public class Student extends Person {
        @Override
        public void daytime() {
            System.out.println("学习");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Teacher类实现

    public class Teacher extends Person {
        @Override
        public void daytime() {
            System.out.println("教书");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5️⃣测试代码

    public class Test {
        public static void main(String[] args) {
    
            System.out.println("-----学生的行为-----");
            Person p1 = new Student();
            p1.drink();
            p1.eat();
            p1.sleep();
            p1.daytime();
    
            System.out.println("-----老师的行为-----");
            Person p2 = new Teacher();
            p2.drink();
            p2.eat();
            p2.sleep();
            p2.daytime();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出结果

    -----学生的行为-----
    喝水
    吃饭
    睡觉
    读书
    -----老师的行为-----
    喝水
    吃饭
    睡觉
    教书

    在这里插入图片描述

    五、运行特点

    1️⃣调用成员变量时

    编译看左边,运行看左边

    看父类中有无该成员属性,如果没有则报错,如:打印name的值,如果在父类中并没有定义name,则会报错,并且打印出来的值也是父类中name的值

    用IDEA测试一下

    public class Person {
    
        String name = "人";
    
        public void daytime(){
            System.out.println("平时要做的事情");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    public class Student extends Person {
    
        String name = "学生";
        
        @Override
        public void daytime() {
            System.out.println("学习");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    public class Teacher extends Person {
    
        String name = "老师";
        
        @Override
        public void daytime() {
            System.out.println("教书");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试类

    public class Test {
        public static void main(String[] args) {
    
            Person p1 = new Student();
            System.out.println(p1.name);
    
            Person p2 = new Teacher();
            System.out.println(p2.name);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出结果


    在这里插入图片描述

    2️⃣调用成员方法时

    编译看左边,运行看右边

    看父类中有无该成员方法,如果没有则报错,如:打印daytime()方法,如果在父类中并没有定义该方法,则会报错,而打印输出的是子类中不同的daytime()方法

    用IDEA测试一下

    public class Person {
    
        String name = "人";
    
        public void daytime(){
            System.out.println("平时要做的事情");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    public class Student extends Person {
    
        String name = "学生";
        
        @Override
        public void daytime() {
            System.out.println("学习");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    public class Teacher extends Person {
    
        String name = "老师";
        
        @Override
        public void daytime() {
            System.out.println("教书");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试类

    public class Test {
        public static void main(String[] args) {
            
            Person p1 = new Student();
            System.out.println(p1.name);
            p1.daytime();
    
    
            Person p2 = new Teacher();
            System.out.println(p2.name);
            p2.daytime();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    输出结果


    学习

    教书

    在这里插入图片描述

    六、结语

    本文主要是针对多态以及其特点展开描述的,在下一篇文章中将讲解有关多态的弊端以及其解决方法

  • 相关阅读:
    stm32 iap sd卡升级
    JSON一些注意语法点
    Z41H-64C高压闸阀型号解析
    解决npm install 安装报错记录贴
    docker jenkins 安装配置
    git修改远程分支名称
    【SQL Server + MySQL二 】SQL: DDL数据定义【定义、修改、删除基本表】,DML【憎删改查】,DCL数据控制语言
    流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
    unity 获取3D物体的方向数据
    jieba分词器使用指南
  • 原文地址:https://blog.csdn.net/Alita233_/article/details/126402300