【Java基础】面向对象的特征:多态性
1.简单说明
同一种事物表现出的多种形态,比如打印,都执行打印操作,但会得到彩色或黑白
(1)对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
(2)比如有一个函数是叫某个人来吃饭,函数要求传递的参数是人的对象,可是来了一个美国人,你看到的可能是用刀和叉子在吃饭,而来了一个中国人你看到的可能是用筷子在吃饭,这就体现出了同样是一个方法,可以却产生了不同的形态,这就是多态!
2.举例说明
下面有三个类,American类和Chinese类都继承Person类并重写了eat()方法
Person类
public class Person { public void eat() { System.out.println("人吃饭"); } }
American类
public class American extends Person { public void eat() { System.out.println("美国人用刀叉吃饭"); } }
Chinese类
public class Chinese extends Person{ public void eat(){ System.out.println("中国人用筷子吃饭"); } }
多态体现1
父类引用指向子类对象,Person类型对象调用eat方法,发现执行的是子类中的方法
Person a1 = new American(); a1.eat(); //美国人用刀叉吃饭 Person a2 = new Chinese(); a2.eat(); //中国人用筷子吃饭
多态体现2
我们有一个叫人吃饭的方法,形参为Person类型(相当于形参为抽象的,如果写为American或Chinese则方法不能通用)
public void CallToEat(Person person){ person.eat(); }
给这个方法传入American或Chinese类型的对象(形参为Person类型),执行的是子类中的方法,执行同样的方法得到不一样的结果
public static void main(String[] args) { Test test = new Test(); American american = new American(); Chinese chinese = new Chinese(); test.CallToEat(american); //美国人用刀叉吃饭 test.CallToEat(chinese); //中国人用筷子吃饭 }
3.属性有没有多态呢
(1)我们给Person类和American类中加入name属性,并赋初始值。
String name = "人的姓名"; String name = "美国人姓名";
执行以下语句,输出为父类中的属性值,因此属性是没有多态的(想调用子类的属性或子类特有的方法使用向下转型)
Person a1 = new American(); System.out.println(a1.name); //人的姓名
(2)如果去掉Person类中的name属性呢,编译错误,a1对象为Person类型,只能调用Person类中的属性、方法
4.总结
-
多态使用的前提
- 类的继承
- 方法重写
-
编译看左边,运行看右边
Person a1 = new American();
- 编译时,变量a1为Person类型,只能调用Person类中
eat()
方法,但在运行时实际执行的是子类重写父类的方法。 - 如果父类中没有该方法,则编译错误
- 编译时,变量a1为Person类型,只能调用Person类中
-
虚函数(虚拟方法、虚拟函数)
- Java中其实没有虚函数的概念,有的人也将Person类中的eat()函数称为虚函数,即编译期无法确定的方法
参考:
(1)多态的概念和作用(深入理解)
(2)菜鸟教程:Java多态
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本