gpt4 book ai didi

java - 为什么 Java 不编译这段代码?

转载 作者:行者123 更新时间:2023-11-29 09:36:43 25 4
gpt4 key购买 nike

我有这样的代码:

abstract class ExampleOne {
int dataOne = 1000;

abstract void display();
}

class ExampleTwo extends ExampleOne {
int dataTwo;

ExampleTwo(int varOne) {
dataTwo = varOne;
}

public void disp() {
System.out.println("Testing");
}

public void display() {
System.out.println(dataOne);
}
}

class Example {
public static void main(String args[]) {
ExampleOne obj = new ExampleTwo(20);
obj.disp();
obj.display();
}
}

编译时出现错误:

                obj.disp(); 
^
symbol: method disp()
location: variable obj of type ExampleOne

为什么会这样?

我正在将 ExampleTwo 的实例分配给 ExampleOne,为什么 Java 不选择 ExampleOne 实例而不是 ExampleTwo ?

同样的概念在动态多态性方面也适用!

为什么会这样?

最佳答案

由于 obj 的类型是 ExampleOne,编译器将在 ExampleOne 中搜索您在 obj 上调用的方法> 类,如果找不到就会报错。

why doesn't Java choose the ExampleOne instance instead of ExampleTwo?

那是因为编译时检查是根据引用类型而不是实际对象类型完成的。然后在运行时实际调用的方法根据被引用的实际对象 来决定。这就是我们所说的方法调用的Dynamic Dispatch

您可以向您的 ExampleOne 类添加一个抽象的 disp() 方法,只是为了确保编译器对调用满意。

abstract class ExampleOne{ 
int dataOne=1000;
abstract void display();
abstract void disp();
}

关于java - 为什么 Java 不编译这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14918955/

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