在Java中,Object
可以具有运行时类型(它是创建时的类型)和流式类型(您已将其转换为类型)。Java术语说明
我想知道正确这些类型的名称是什么。例如
class A {
}
class B extends A {
}
A a = new B();
一个被作为B
创建但是它被宣布为A
。使用每个视角来指称a
的类型的正确方法是什么?
在Java中,Object
可以具有运行时类型(它是创建时的类型)和流式类型(您已将其转换为类型)。Java术语说明
我想知道正确这些类型的名称是什么。例如
class A {
}
class B extends A {
}
A a = new B();
一个被作为B
创建但是它被宣布为A
。使用每个视角来指称a
的类型的正确方法是什么?
我认为对象区分是很重要的(它存在在执行时,只是具有其执行时间型)和一个表达(诸如可变),其具有一个编译时间类型。
因此,在这种情况下:
A a = new B();
a
是A
类型的变量。它在执行时的值是对B
类型的对象的引用。
Java语言规范使用“运行时间类”(例如,用于覆盖的目的,如section 15.12.4.4),用于对象的类型。在其他地方,我认为它只是使用“type”作为表达式的类型,这意味着编译时类型。
我会说你区分变量/引用的类型和对象的类型。在这种情况下
A a = new B();
可变/参考将类型A
但B
类型的对象的。
变量a
的类型是A
。没有改变,因为它是一个参考。它恰巧指的是B
类型的对象。当您通过A
参考引用B
对象时,您只能将它看作是A
类型的对象。
以后,您可以将它转换为它的更具体的类型
B b = (B)a;
,并使用该对象的B
方法。
在这种情况下,A
是参考类型而B
是实例类型
Java语言规范谈到变量的声明类型,的getClass()
有关对象的运行时类的Javadoc。
请注意,在Java中不存在运行时类型; List<String>
和List<Integer>
是不同的类型,但它们的实例共享相同的运行时类。
您正在寻找的术语是表观类型和实际类型。
A a = new B();
的表观类型是A,因为编译器只知道该对象的类型是A.作为这样的在这时候可以不引用任何的B特异性的方法。
实际类型是B.您可以转换对象(即更改其明显类型)以访问B特定的方法。
我以前没有听说过“明显类型”的术语。你能告诉我你从哪里得到的?我不认为我在JLS中看到过它。 – 2009-10-03 17:26:24
Michael J. Laszlo - 以Java中的图形应用程序为特色的面向对象编程使用这些术语来描述问题中提到的类型差异。事情是,我认为每个作者都必须为其他地方没有明确定义的这样的东西做出自己的术语。 – 2009-10-03 21:08:11
要确定a
是类的对象,你可以使用:List类型
/*The java.lang.Object.getClass() method returns the runtime class of an object*/
System.out.println("a is object of: "+a.getClass());
这是如何回答这个问题的? – shmosel 2018-01-11 03:53:56
该op是想知道什么是可以用于'a'的术语。我的意思是说'a'是类'b'的一个对象。 – 2018-01-11 03:59:29
呼叫getGenericType(),你就会得到它指的是List类和一个ParameterizedType对象字符串类型参数。 – 2009-10-03 21:42:43
是的。这反映了该领域的公认类型,因此与我的答案不矛盾。 – meriton 2009-10-14 22:03:18