问题描述
我很困惑,当我使用超类引用变量的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()
可能有两种不同的解释方式:
- 这意味着:使用表达式“ obj”,它是一个引用(即指针)。跟随指针并找到它所指向的对象。询问该对象是什么类型。
- 与1相似,除了,因为变量类型为
Object
,所以从getClass()
类调用java.lang.Object
方法的实现。即没有动态调度。 - 这意味着:取名为
obj
的本地声明的变量。在此方法中,我将其声明为哪种类型?完全不关心对象/指针,只关心声明。
现在,Java lang规范非常清晰:在Java中,发生的是#1。 #2不可用(您不能选择退出动态调度。作为显而易见的语言设计,私有方法不这样做是因为它们不需要它,而静态方法则不这样做是因为,通过是静态的,它们根本就不是层次结构的一部分-因此,那些看似例外情况真的不适用。没有其他选择可以退出)。
这是选项2的内容:完全没有意义。
在Java中,您不能拥有神秘的肉类变量。有人声明它们,然后将类型写在源文件中。没有诸如“嗯,在运行时解决所有问题”之类的问题。甚至java10的var
也不能那样工作(肯定在编译时它仍处于锁定状态)。
因此,您已经知道。是对象,有什么要重复的地方?
如果您想要一个表示java.lang.Class<?>
的{{1}}实例,则有这样的语法。它是:
Object