gpt4 book ai didi

java - 定义为基类时调用扩展类对象中的基类方法

转载 作者:行者123 更新时间:2023-11-30 06:11:58 24 4
gpt4 key购买 nike

想象一下下面的代码:

public class BaseClass {
private int a;

public void noReturnNoParam() {
System.out.println("From Base Class");
}
}

public class ExtendedClass extends BaseClass {
private int b;

@Override
public void noReturnNoParam() {
System.out.println("From Extended Class");
}
}

public class Polymorph {
public static void main(String... args) {
BaseClass bc = new BaseClass();
ExtendedClass ec = new ExtendedClass();
BaseClass bcec = new ExtendedClass();

bc.noReturnNoParam();
ec.noReturnNoParam();
bcec.noReturnNoParam();
}
}

输出如下:

From Base Class
From Extended Class
From Extended Class

那么在调用 bcec.noReturnNoParam() 时调用 BaseClass` 方法时,我该如何实现呢? (并且仅当 ExtendedClass 对象存储在 BaseClass 类型中时)?

最佳答案

这正是多态性的概念:

BaseClass bcec = new ExtendedClass();

BaseClass 是你为 bcec 声明的契约。它为您提供有关可以从 bcec 获得的内容的编译时信息。它告诉您可以调用 noReturnNoParam 方法。

ExtendedClass 是 bcec 的实际实现。 JVM 在运行时知道 bcec.noReturnNoParam() 正在调用 ExtendedClass 中的 noReturnNoParam。

下面的语句类似:

ExtendedClass ec = new ExtendedClass();

左边的ExtendedClass是合约,告诉你从ec可以得到什么。右边的ExtendedClass是实际的实现,在运行时执行。

ExtendedClass 扩展了 BaseClass,因此 ExtendedClass 的实例也是 BaseClass 的实例。但是 BaseClass 的实例可能不是 ExtendedClass 的实例。这就是以下无法编译的原因:

ExtendedClass abc = new BaseClass();

我给你另一个例子来让这个概念不那么抽象。

class Fruit {
void taste() {
System.out.println("delicious!");
}
}

class Apple extends Fruit{
void taste() {
System.out.println("sweet!");
}
}

class Orange extends Fruit{
void taste() {
System.out.println("juicy!");
}
}

class Polymorph {
public static void main(String... args) {
Fruit fruit = new Fruit();
Apple apple = new Apple();
Fruit fruit_apple = new Apple();
Fruit fruit_orange = new Orange();

fruit.taste(); // prints delicious!
apple.taste(); // prints sweet!
fruit_apple.taste(); // prints sweet!
fruit_orange.taste(); // prints juicy!
}
}

橙子和苹果都是水果。 Fruit/Orange/Apple都有口味,Orange和Apple各有口味。你说苹果是一种水果,橙子也是一种水果,但你不能说水果是苹果。

关于java - 定义为基类时调用扩展类对象中的基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33417545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com