一、前言
本文将讲述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(); } }
输出结果
人 学习 人 教书
六、结语
本文主要是针对多态以及其特点展开描述的,在下一篇文章中将讲解有关多态的弊端以及其解决方法