多态是继封装、继承之后,面向对象的第三大特性。
生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞 机,飞起来也是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描 述的就是这样的状态。
定义
多态: 是指同一行为,对于不同的对象具有多个不同表现形式。
程序中多态: 是指同一方法,对于不同的对象具有不同的实现.
多态的前提:
1. 继承或者实现【二选一】
2. 父类引用指向子类对象【格式体现】 Fu fu = new Zi();
3. 方法的重写【意义体现:不重写,无意义】
多态的体现:父类的引用指向它的子类的对象
父类类型 变量名 = new 子类类型();
变了名.方法名();
注意此时的父类类型不仅指的是集成的父类类型,也包括实现的父接口类型
多态时的成员访问特点:
(1)多态时成员变量的访问特点:编译看左边,运行看左边。简而言之:多态的情况下,访问的是父类的成员变量
(2)多态时非静态成员方法的访问特点:编译看左边,运行看右边,简而言之:编译的时候去父类中查找方法,运行的时候去子类中查找方法来执行
(3)多态时静态成员方法的访问特点:编译看左边,运行看左边,简而言之:编译的时候去父类中查找方法,运行的时候去父类中查找方法来执行
注意:多态的情况下是无法访问子类独有的方法
代码示例:
public class Person {
int age = 10;
public void eat(){
System.out.println("人吃东西");
}
public static void sleep(){
System.out.println("Person类中的睡觉方法");
}
}
class Student extends Person{
int age = 20;
@Override
public void eat(){
System.out.println("学生吃东西");
}
public static void sleep(){
System.out.println("学生类中的睡觉方法");
}
public void study(){
System.out.println("学生再学习");
}
}
public class Tets {
public static void main(String[] args) {
Person person = new Student();//父类引用指向子类对象
//访问非静态方法:编译看左边,运行看右边
person.eat(); //应该输出“学生吃东西”
System.out.println(person.age);//访问成员变量:编译看左边,运行看左边。此时输出age=10
//访问非静态方法:编译看左边,运行看左边
person.sleep();//此时输出父类中的内容
//person.study();访问子类独有的方法报错
}
}
多态的好处:实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体 现出多态的扩展性与便利。
但有好处也有弊端,因为此时只能调用父类的共性内容,不能调用子类的特有内容。
代码示例:
public abstract class Animal {
public abstract void eat();
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
Dog dog = new Dog();
//多态的扩展性体现在,今后无论再多的子类出现,我们都不需要去编写showXXXEat方法了,直接使用showAnimalEat就可以完成
showAnimalEat(cat);
showAnimalEat(dog);
showCatEat(cat);//可以被showAnimalEat方法替代
showDogEat(dog);//可以被showAnimalEat方法替代
}
//用父类的类型作为形参,实际调用的时候,传入子类实参。方法可以根据传入的实参类型执行特定的方法,增强代码的可扩展性
public static void showAnimalEat(Animal animal){
animal.eat();
}
public static void showCatEat(Cat cat){
cat.eat();
}
public static void showDogEat(Dog dog){
dog.eat();
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
【推荐】国内首个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搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报