为什么超类变量的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

有人能解释一下吗

您想要的只是:

CCD_ 2。

java中的

obj.getClass()可以用两种不同的方式进行解释:

  1. 它的意思是:取表达式"obj",它是一个引用(即指针(。跟随指针,找到它所指向的对象。询问该对象的类型
  2. 就像1一样,只是因为变量类型是Object,所以从java.lang.Object类调用getClass()方法的实现。即没有动态调度
  3. 意思是:取本地声明的名为obj的变量。在这个方法中,我把它声明为什么类型?根本不关心对象/指针,只关心声明

现在,java语言规范非常清楚:在java中,#1就是发生的事情#2不可用(你不能选择退出动态调度。作为一个显而易见的语言设计问题,私有方法不这样做是因为它们不需要它,而静态方法不这么做是因为,由于是静态的,它们一开始就不是层次结构的一部分,所以这些看似例外的情况真的不适用。没有其他方法可以选择退出(。

以下是关于选项#2的内容:完全没有意义

在java中,不能有神秘的肉变量。有人声明了它们,并且类型就写在源文件中。不存在"嗯,在运行时解决所有问题"这样的说法。即使是java10的var也不能以这种方式工作(当然,在编译时它仍然被锁定(。

所以,您已经知道了。它是物体,重复它有什么意义?

如果您想要一个代表Objectjava.lang.Class<?>实例,则有相应的语法。它是:

Class<?> objClass = Object.class;

最新更新