【问题标题】:why getClass() from superclass variable returns subclass class name? [duplicate]为什么来自超类变量的 getClass() 返回子类类名? [复制]
【发布时间】:2020-08-12 21:52:01
【问题描述】:

我很困惑,当我从指向子类对象的超类引用变量中使用 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

谁能解释一下

【问题讨论】:

  • 这种行为称为dynamic dispatch
  • 感谢@Turing85,运行时对象似乎是从引用变量中调用的对象

标签: java polymorphism


【解决方案1】:

您正在寻找的只是:

Object.class.


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

  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;

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2018-12-28
    • 2023-03-14
    • 2019-02-19
    • 2013-10-17
    相关资源
    最近更新 更多