多态重写重载
多态(Polymorphism)
Java中的多态是面向对象编程的一个重要特性,它允许使用一个接口来表示不同的类型或行为。多态性(Polymorphism)这个词来源于希腊语,意为“多种形态”。在Java中,多态主要通过方法重写(Overriding)和方法重载(Overloading)来实现。
方法重写 (Overriding)
当子类重新定义了父类的方法,这就是方法重写。在运行时,Java虚拟机会根据对象的实际类型来调用相应的方法,而不是根据引用变量的类型。这使得同一个方法调用可以表现出不同的行为,即实现了运行时多态。
方法重载 (Overloading)
方法重载是指在一个类中可以有多个同名的方法,但是这些方法的参数列表必须不同(参数的数量、类型或者顺序不同)。方法重载是在编译时期决定的,属于静态多态的一种形式。
示例代码
父类引用指向子类对象:
Animal myDog = new Dog();:这里 myDog 是一个 Animal 类型的引用,但它实际上指向的是一个 Dog 对象。
Animal myCat = new Cat();:这里 myCat 是一个 Animal 类型的引用,但它实际上指向的是一个 Cat 对象。
调用子类重写的方法:
myDog.sound();:尽管 myDog 是 Animal 类型的引用,但由于它实际上指向的是 Dog 对象,所以调用的是 Dog 类中重写的 sound 方法,输出 Dog barks。
myCat.sound();:同样,尽管 myCat 是 Animal 类型的引用,但由于它实际上指向的是 Cat 对象,所以调用的是 Cat 类中重写的 sound 方法,输出 Cat meows。
访问子类特有的方法:
如果需要访问 Dog 类特有的 wagTail 方法,需要先进行类型转换:((Dog) myDog).wagTail();。
同样,如果需要访问 Cat 类特有的 purr 方法,需要先进行类型转换:((Cat) myCat).purr();。
// 定义一个父类 Animal
class Animal {
void sound() {
System.out.println("This animal makes a sound");
}
}
// 定义一个子类 Dog,继承自 Animal
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
void wagTail() {
System.out.println("Dog wags its tail");
}
}
// 定义一个子类 Cat,继承自 Animal
class Cat extends Animal {
@Override
void sound() {
System.out.println("Cat meows");
}
void purr() {
System.out.println("Cat purrs");
}
}
// 主类 Test
public class Test {
public static void main(String[] args) {
// 使用父类类型的引用
Animal myDog = new Dog();
Animal myCat = new Cat();
// 调用 sound 方法
myDog.sound(); // 输出: Dog barks
myCat.sound(); // 输出: Cat meows
// 如果需要访问子类特有的方法,需要进行类型转换
if (myDog instanceof Dog) {
((Dog) myDog).wagTail(); // 输出: Dog wags its tail
}
if (myCat instanceof Cat) {
((Cat) myCat).purr(); // 输出: Cat purrs
}
}
}
总结
方法重写是对继承的父类方法的重写。
方法重载是对不同参数对应不同的,具有相同名字的方法的调用。
多态能方便更改调用不同的子类重写出的方法。(调用子类特有的方法不能多态化)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)