为什么超类变量中的getClass返回子类类名?

问题描述

我很困惑,当我使用超类引用变量的getClass()指向子类对象时,结果就是子类。 这是一个简单的例子:

public `class` TestGetClass
{
    
        public static void main(String[] args)
        {
            Object obj = new Integer(20);
        
            System.out.println("obj class: " + obj.getClass());
        }
}

输出为我提供了Integer类而不是Object类。

obj class: class java.lang.Integer

有人可以解释吗

解决方法

您正在寻找的只是:

Object.class


Java中的

obj.getClass()可能有两种不同的解释方式:

  1. 这意味着:使用表达式“ obj”,它是一个引用(即指针)。跟随指针并找到它所指向的对象。询问该对象是什么类型。
  2. 与1相似,除了,因为变量类型为Object,所以从getClass()类调用java.lang.Object方法的实现。即没有动态调度。
  3. 这意味着:取名为obj的本地声明的变量。在此方法中,我将其声明为哪种类型?完全不关心对象/指针,只关心声明。

现在,Java lang规范非常清晰:在Java中,发生的是#1。 #2不可用(您不能选择退出动态调度。作为显而易见的语言设计,私有方法不这样做是因为它们不需要它,而静态方法则不这样做是因为,通过是静态的,它们根本就不是层次结构的一部分-因此,那些看似例外情况真的不适用。没有其他选择可以退出)。

这是选项2的内容:完全没有意义

在Java中,您不能拥有神秘的肉类变量。有人声明它们,然后将类型写在源文件中。没有诸如“嗯,在运行时解决所有问题”之类的问题。甚至java10的var也不能那样工作(肯定在编译时它仍处于锁定状态)。

因此,您已经知道。是对象,有什么要重复的地方?

如果您想要一个表示java.lang.Class<?>的{​​{1}}实例,则有这样的语法。它是:

Object

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...