Java 多态
通俗来说,在面向对象编程中,一个在父类或接口中定义的方法 (方法名和参数都完全一样),当被不同子类(对象类型)的对象实例调用时,会执行各自重写的、不同的内部行为,但是要求所有实现都必须返回相同的数据类型。
例如,狗和猫都属于动物,它们都具有 “吃” 这一共同行为,但具体表现方式却有所不同:狗可能会啃骨头,而猫则可能选择吃老鼠。这正是多态性的体现——同一行为在不同对象上被触发时,会产生不同的具体实现与结果。
多态的实现条件
✅ 在 Java 中,要实现多态,必须同时满足以下条件,缺一不可:
- 继承:多态的实现依赖于类的继承关系。子类继承父类,并可以重写父类的方法。
- 方法重写 (Override):子类必须重写父类中的方法,以提供特定的实现。
- 父类引用指向子类对象:通过父类的引用变量来调用子类对象的方法,从而实现动态绑定。
✅ 以下是 Java 多态的使用实例:
java
复制
class Website {
String name;
String url;
public Website(String name, String url) {
this.name = name;
this.url = url;
}
public void websiteType() {
System.out.println(name + "是网站!");
}
}
class Kaicz extends Website {
public Kaicz(String name, String url) {
super(name, url);
}
@Override
public void websiteType() {
System.out.println(name + ":教程网站!");
}
}
class Google extends Website {
public Google(String name, String url) {
super(name, url);
}
@Override
public void websiteType() {
System.out.println(name + ":搜索引擎网站!");
}
}
// 调用代码
public class Main {
public static void main(String[] args) {
// 多态调用:父类引用指向子类对象
Website kaicz = new Kaicz("Kaicz", "https://www.kaicz.com");
Website google = new Google("Google", "https://www.google.com");
// 调用重写的方法,体现多态
kaicz.websiteType();
google.websiteType();
}
}
执行上面程序后,执行结果:
Kaicz:教程网站!
Google:搜索引擎网站!
多态性的类型
✅ 在 Java 中,多态性主要分为两种类型:
- 编译时多态 (静态多态):通过方法重载 (Overloading) 实现。方法重载允许在同一个类中定义多个同名但参数不同的方法,编译器根据传入参数的类型和数量来决定调用哪个方法。
- 运行时多态 (动态多态):通过方法重写 (Overriding) 和父类引用指向子类对象实现。运行时多态允许在运行时根据对象的实际类型来决定调用哪个方法。
运行时多态
在 Java 中,运行时多态通常通过方法重写(Method Overriding)机制来实现。
假设在父类及其子类中创建了相同的方法。在这种情况下,将要调用的方法取决于用于调用该方法的对象。例如:
java
复制
abstract class Website {
public abstract void printUrl();
}
class Kaicz extends Website {
@Override
public void printUrl() {
System.out.println("www.kaicz.com");
}
}
class Google extends Website {
@Override
public void printUrl() {
System.out.println("www.google.com");
}
}
class Main {
public static void main(String[] args) {
Kaicz k1 = new Kaicz();
k1.printUrl();
Google g1 = new Google();
g1.printUrl();
}
}
执行上面程序后,执行结果:
www.kaicz.com
www.google.com
要了解方法重写的工作原理,请访问 Java 中的方法重写。
在上面的示例中,printUrl()
方法在两个不同的类中有着不同的实现。程序运行时:
- 表达式
k1.printUrl()
将调用 Kaicz 类的方法。这是因为k1
是 Kaicz 类的对象。 - 表达式
g1.printUrl()
将调用 Google 类的方法。这是因为g1
是 Google 类的对象。
编译时多态
在Java中,可以通过方法重载和运算符重载来实现编译时多态。
假设在父类及其子类中创建了相同的方法。在这种情况下,将要调用的方法取决于用于调用该方法的对象。例如:
java
复制
class Website {
public void printUrl() {
System.out.println("www.google.com");
}
public void printUrl(String url) {
System.out.println(url);
}
}
class Main {
public static void main(String[] args) {
Website web = new Website();
web.printUrl();
web.printUrl("www.kaicz.com");
}
}
执行上面程序后,执行结果:
www.google.com
www.kaicz.com
在上面的示例中,printUrl()
方法在两个不同的方法中有着不同的实现。程序运行时:
- 表达式
web.printUrl()
将调用第一个方法。 - 表达式
web.printUrl("www.kaicz.com")
将调用第二个方法。
评论区 0
发表评论
教程介绍
Java 通用高级编程语言,广泛应用在企业级应用开发、移动应用开发、大数据处理等领域。
34
章节
38
阅读
0
评论
反馈提交成功
感谢您的反馈,我们将尽快处理您的反馈