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

一、前言

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

二、概述

1️⃣定义

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

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

2️⃣多态的前提

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

三、多态的格式

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

四、多态的使用

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("平时要做的事情");
    }
}

Student类实现

public class Student extends Person {
    @Override
    public void daytime() {
        System.out.println("学习");
    }
}

Teacher类实现

public class Teacher extends Person {
    @Override
    public void daytime() {
        System.out.println("教书");
    }
}

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️⃣调用成员变量时

编译看左边,运行看左边

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

用IDEA测试一下

public class Person {

    String name = "人";

    public void daytime(){
        System.out.println("平时要做的事情");
    }
}
public class Student extends Person {

    String name = "学生";
    
    @Override
    public void daytime() {
        System.out.println("学习");
    }
}
public class Teacher extends Person {

    String name = "老师";
    
    @Override
    public void daytime() {
        System.out.println("教书");
    }
}

测试类

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);

    }
}

输出结果


在这里插入图片描述

2️⃣调用成员方法时

编译看左边,运行看右边

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

用IDEA测试一下

public class Person {

    String name = "人";

    public void daytime(){
        System.out.println("平时要做的事情");
    }
}
public class Student extends Person {

    String name = "学生";
    
    @Override
    public void daytime() {
        System.out.println("学习");
    }
}
public class Teacher extends Person {

    String name = "老师";
    
    @Override
    public void daytime() {
        System.out.println("教书");
    }
}

测试类

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();
    }
}

输出结果


学习

教书

在这里插入图片描述

六、结语

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alita11101_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值