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