Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在父方法中返回子类名?_Java_Inheritance - Fatal编程技术网

Java 为什么在父方法中返回子类名?

Java 为什么在父方法中返回子类名?,java,inheritance,Java,Inheritance,我有一个名为Entity的类,它是我在整个程序中使用的许多其他对象的abstract超类(例如Apple类) 在许多方法中,我通过打印从中打印调试语句的类名,然后是实际的调试消息来打印调试语句。然而,令我惊讶的是,当我从Apple的实例调用继承的方法时,Apple的类名被打印出来,而不是实体的类名(该方法实际位于该实例中) 以一个更容易发布代码片段的相关示例为例,我覆盖了toString(),如下所示: public abstract class Entity { private St

我有一个名为
Entity
的类,它是我在整个程序中使用的许多其他对象的
abstract
超类(例如
Apple
类)

在许多方法中,我通过打印从中打印调试语句的类名,然后是实际的调试消息来打印调试语句。然而,令我惊讶的是,当我从
Apple
的实例调用继承的方法时,
Apple
的类名被打印出来,而不是
实体的类名(该方法实际位于该实例中)

以一个更容易发布代码片段的相关示例为例,我覆盖了
toString()
,如下所示:

public abstract class Entity {

    private String name;

    @Override
    public String toString() {
        return getClass().getSimpleName() + " " + (name != null ? name : super.hashCode());
    }
}
因为我没有在
Apple
类中进一步重写此方法,所以我希望返回字符串的第一部分是
Entity
,而不是
Apple
。但它返回的是苹果公司的
(对于这个用例来说,它以这种方式工作确实很好,但仍然有点令人困惑)

我尝试查看
对象的实现#getClass()
,但无法查看,因为它被声明为
本机方法

公共最终本机类getClass()


有人能解释为什么会发生这种情况吗?

您正在调用
getClass()
。它总是返回与对象的实际执行时类型关联的
对象的引用,而不是调用它的表达式的编译时类型的类。例如:

Object foo = "this is a string";
Class<?> clazz = foo.getClass();
Object foo=“这是一个字符串”;
类clazz=foo.getClass();
clazz
将引用
String
的类,而不是
对象的类

您无需查看
getClass()
的实现—只需查看以下内容:

表示此对象的运行时类的类对象

注意“运行时”位,如“在执行时确定,而不是在编译时”


在这种情况下,我认为在
toString()
的结果中返回执行时类名是完全合理的,但是如果您真的想要
实体
类,您可以使用
实体.class

谢谢您的回答。是的,对于
toString()
来说,这种方式很好,但有时调试会让人沮丧。:)刚开始的时候,它完全出乎我的意料。