编译和运行时类

Jus*_*yul 0 java

让我们想象一下,我有一个叫做Person另一个类的泛化的类Man.如果我要做这个类的几个实例

Man man = new Man();
Person person = new Man();
Run Code Online (Sandbox Code Playgroud)

现在,编译时类的实例是从该变量引用manMan和编译时类的人Person,而运行时类两种情况下的是Man.到目前为止,我完全已经使用了术语,因为在运行时创建的实例都属于类Man.但是,如果我在哪里施放man实例如下

Person personMan = (Person) man;
Run Code Online (Sandbox Code Playgroud)

为什么运行时类型personMan仍然是Man?是否仅在创建新实例时设置实例的运行时类?另外,有没有办法在运行时实际获取变量的编译时类,因此我可以查询personMan类的类型(getClass将返回Man).

编辑:"类的编译时类"是一个错误(并没有多大意义).我的意思是变量(因此他们质疑类人类是什么类型:))

Jon*_*eet 5

在这里区分三个不同的概念很重要:

  • 变量(man,person)
  • 引用(变量的值)
  • 对象(引用,嗯,引用的内存blob)

对象的类型在创建后永远不会更改.将引用转换为其他类型只会影响该表达式的编译时类型.引用类型强制转换表达式的结果始终与原始引用相同 - 它仍然引用相同的对象,该对象仍具有相同的类型.(那就是把拳击放在一边 - 当然演员阵容可能会在执行时失败,导致异常.)

还有,有一种方法可以在运行时实际获取类的编译时类

如果你的意思是变量的编译时类型 - 不是它是一个局部变量,而没有真正深入检查字节代码.如果它是一个字段,你可以使用反射来获得它.你为什么想知道?