在Java中,Object
可以有一个运行时类型(它是创建它的类型)和一个类型(你已经将它转换为的类型)。
我想知道这些类型的正确的名称是什么。例如
class A {
}
class B extends A {
}
A a = new B();
a创建为B
但是它被声明为A
。使用每个视角引用a
类型的正确方法是什么?
答案 0 :(得分:8)
我认为区分对象(在执行时存在,只有其执行时间类型)和表达式(如变量)很重要它有一个编译时类型。
所以在这种情况下:
A a = new B();
a
是一个A
类型的变量。它在执行时的值是对B
类型的对象的引用。
Java语言规范使用“运行时类”(例如,为了覆盖的目的,如在section 15.12.4.4中)来表示对象的类型。在其他地方我认为它只是使用“type”作为表达式的类型,这意味着编译时类型。
答案 1 :(得分:5)
Java语言规范讲述变量的声明类型,getClass()
的javadoc关于对象的运行时类。
请注意,Java中没有运行时类型; List<String>
和List<Integer>
是不同的类型,但它们的实例共享相同的运行时类。
答案 2 :(得分:2)
在这种情况下,A
是参考类型,而B
是实例类型
答案 3 :(得分:1)
我想说你区分变量/引用的类型和对象的类型。在案件中
A a = new B();
变量/引用的类型为A
,但类型为B
的对象。
答案 4 :(得分:1)
变量a
的类型为A
。没有改变,因为它是一个参考。它碰巧引用了B
类型的对象。当您通过B
引用引用该A
个对象时,您只能将其视为A
类型。
您可以稍后将其转换为更具体的类型
B b = (B)a;
并在该对象上使用B
方法。
答案 5 :(得分:0)
您要查找的术语是表观类型和实际类型。
A a = new B();
表观类型是A,因为编译器只知道对象是A类型。因此,此时您不能引用任何B特定方法。
实际类型是B.您可以转换对象(即更改其表观类型)以访问B特定方法。
答案 6 :(得分:0)
确定/*The java.lang.Object.getClass() method returns the runtime class of an object*/
System.out.println("a is object of: "+a.getClass());
是您可以使用哪个类的对象:
$ python --version
答案 7 :(得分:0)
Section 15.5. Expressions and Run-Time Checks区分
例如,
如果表达式的类型是引用类型,则 ,甚至是该值是否是对引用对象的引用 对象而不是null,在编译时不一定是已知的。 Java编程语言中的一些地方 实际所引用对象的类会影响程序中的程序执行 不能从表达式的类型推导出来的方式...
[snip]
其类型是引用类型的表达式可以使用
instanceof
来确定所引用对象的类是否由 表达式的运行时值
因此,将以上语言应用于
A a = new B();
我们可能会说类似
表达式
a
的静态类型为A
,尽管存储在a
中的值是对运行时类B
的引用。
我个人以以下方式解释这两个概念(但是请注意,我不确定其正确性):