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

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

一、前言


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


二、概述


1️⃣定义


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


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


2️⃣多态的前提


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


三、多态的格式


  • 父类类型 变量名 = new 子类/实现类构造器;
  • 变量名.方法名();


Person p = new Student();
p.sleep();
p.eat();
p.drink();


四、多态的使用


1️⃣题目


请写一个程序描述老师和学生行为

老师:吃饭、喝水、睡觉、教书

学生:吃饭、喝水、睡觉、学习


2️⃣分析


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


3️⃣分析图


93b5123c0ccf41ceaf794de28d63f81c.png


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


输出结果


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

720f063e60d343989d8bd9caca649385.png


五、运行特点


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


输出结果



cb975359fdc049d9846d5ecd30bbc3c8.png


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


输出结果


学习
教书

4b7987ad2e96466d86bb40abb6eac9c0.png


六、结语


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

相关文章
|
22天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
14 2
|
1月前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第10天】Java零基础教学篇,手把手实践教学!
22 4
|
1月前
|
Java 编译器 程序员
Java多态背后的秘密:动态绑定如何工作?
本文介绍了Java中多态的实现原理,通过动态绑定和虚拟方法表,使得父类引用可以调用子类的方法,增强了代码的灵活性和可维护性。文中通过具体示例详细解析了多态的工作机制。
41 4
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
1月前
|
Java
java继承和多态详解
java继承和多态详解
43 5
|
1月前
|
存储 Java 测试技术
Java零基础-多态详解
【10月更文挑战第1天】Java零基础教学篇,手把手实践教学!
29 1
|
1月前
|
安全 Java 编译器
【一步一步了解Java系列】:重磅多态
【一步一步了解Java系列】:重磅多态
20 3
|
2月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
35 4
|
2月前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
1月前
|
存储 Java 程序员
Java基础-面向对象
Java基础-面向对象
17 0