多态
概念
-
多态是继封装、继承之后,面向对象的第三大特性。
-
描述一个事物的多种形态
-
多态体现为父类引用变量可以指向子类对象
-
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
多态通过分离做什么、怎么做,通过另外一个角度将接口和实现分离。
多态的转型
多态的转型分为向上转型和向下转型两种
向上转型:多态本身就是向上转型过的过程
使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
多态存在的必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
概念对比
1. 重写
重写,指的是子类对父类方法的重新定义,但是**子类方法的参数列表和返回值类型,必须与父类方法一致!**所以可以简单的理解,重写就是子类对父类方法的核心进行重新定义。
举个栗子:
class Chicken{
public void live(String lastword){
System.out.println(lastword);
}
}
class BaiqieChicken extends Chicken{
public void live(String lastword){
System.out.println("这只白切鸡说:");
System.out.println(lastword);
}
}
这里白切鸡类重写了鸡类的live()方法,为什么说是重写呢?因为白切鸡类中live()方法的参数列表和返回值与父类一样,但方法体不一样了。
2. 重载(非多态)
重载,指的是在一个类中有若干个方法名相同,但参数列表不同的情况,返回值可以相同也可以不同的方法定义场景。也可以简单理解成,同一行为(方法)的不同表现形式。
重载就是对于同一个概念,同一个操作,因为条件不同而生成了不同的结果,或者多了一些东西,或者少了一些东西,或者根本就完全不同
举个栗子:
class BaiqieChicken extends Chicken{
public void live(){
System.out.println("这是一只会被做成白切鸡的鸡");
}
public void live(String lastword){
System.out.println("这只白切鸡说:");
System.out.println(lastword);
}
}
这里的白切鸡类中的两个live()方法,一个无参一个有参,它们对于白切鸡类的live()方法的描述各不相同,但它们的方法名都是live。通俗讲,它们对于白切鸡鸡生的表现形式不同。
3. 接口实现
接口,是一种无法被实例化,但可以被实现的抽象类型,是抽象方法的集合,多用作定义方法集合,而方法的具体实现则交给继承接口的具体类来定义。所以,接口定义方法,方法的实现在继承接口的具体类中定义,也是对同一行为的不同表现形式。
interface Chicken{
public void live();
}
class BaiqieChicken implements Chicken{
public void live(){
System.out.println("这是一只会被做成白切鸡的鸡");
}
}
class ShousiChicken implements Chicken{
public void live(){
System.out.println("这是一只会被做成手撕鸡的鸡");
}
}
从上面我们可以看到,对于鸡接口中的live()方法,白切鸡类和手撕鸡类都有自己对这个方法的独特的定义。
绑定机制
将一个方法调用和一个方法主体关联在一起叫绑定
-
在编译阶段能够确定方法在内存什么位置的机制就叫静态绑定机制
所有私有方法、静态方法、构造器及final修饰方法都是采用静态绑定机制。在编译器阶段就已经指明了调用方法在常量池中的符号引用,JVM运行的时候只需要进行一次常量池解析即可。 -
**动态绑定是指在“执行期间”(而非编译期间)判断所引用的实际对象类型,根据其实际的类型调用其相应的方法。**只有普通方法调用是多态的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY