gpt4 book ai didi

java - getClass() 在向上转换后返回派生类名

转载 作者:行者123 更新时间:2023-11-29 08:40:07 27 4
gpt4 key购买 nike

我在学习 Java 时遇到了一件奇怪的事情。考虑以下程序:

public class GetClassNameInheritance {
public static void main(String[] args) {
Employee e = new Employee();
Person p = (Person) e;
System.out.println(p.getClass());
}
}

class Person {

}

class Employee extends Person {

}

由于类型转换的原因,我原以为输出是 Person,但它是 Employee!老实说,我很困惑,找不到解释。官方甲骨文tutorial没有提到这种行为,docs似乎太简洁了,没有帮助。我可以从其他 StackOverflow 示例中看出这与“运行时类”有关,但我不理解其基本思想。有人可以解释这里发生了什么吗?

最佳答案

在 Java 中,类型转换不会改变对象的类型。一旦成为 Employee,您的对象将始终是 Employee。类型转换不像其他语言(例如 C/C++)那样工作。

虽然p 引用的类型是Person,但它实际上是指JVM 堆中Employee 类型的对象。当您调用 p.getClass() 方法时,引用会依次调用对象上的方法,而不是引用上的方法。这就是您在输出中看到 Employee 的原因。

唯一可行的类型转换是您可以对基元执行的类型转换。

int x = (int)2.5f;

返回值将被类型转换为 int。

您可以在此处阅读有关类型转换和转换的更多信息:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

http://www.wideskills.com/java-tutorial/java-object-typecasting

关于java - getClass() 在向上转换后返回派生类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40902504/

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