2009-10-03 121 views
1

在Java中,Object可以具有运行时类型(它是创建时的类型)和流式类型(您已将其转换为类型)。Java术语说明

我想知道正确这些类型的名称是什么。例如

class A { 

} 

class B extends A { 

} 

A a = new B(); 

一个被作为B创建但是它被宣布为A。使用每个视角来指称a的类型的正确方法是什么?

回答

8

我认为对象区分是很重要的(它存在在执行时,只是具有其执行时间型)和一个表达(诸如可变),其具有一个编译时间类型。

因此,在这种情况下:

A a = new B(); 

aA类型的变量。它在执行时的值是对B类型的对象的引用。

Java语言规范使用“运行时间类”(例如,用于覆盖的目的,如section 15.12.4.4),用于对象的类型。在其他地方,我认为它只是使用“type”作为表达式的类型,这意味着编译时类型。

1

我会说你区分变量/引用的类型和对象的类型。在这种情况下

A a = new B(); 

可变/参考将类型AB类型的对象的。

1

变量a的类型是A。没有改变,因为它是一个参考。它恰巧指的是B类型的对象。当您通过A参考引用B对象时,您只能将它看作是A类型的对象。

以后,您可以将它转换为它的更具体的类型

B b = (B)a; 

,并使用该对象的B方法。

2

在这种情况下,A参考类型而B实例类型

4

Java语言规范谈到变量的声明类型,的getClass()有关对象的运行时类的Javadoc

请注意,在Java中不存在运行时类型; List<String>List<Integer>是不同的类型,但它们的实例共享相同的运行时类。

+0

呼叫getGenericType(),你就会得到它指的是List类和一个ParameterizedType对象字符串类型参数。 – 2009-10-03 21:42:43

+0

是的。这反映了该领域的公认类型,因此与我的答案不矛盾。 – meriton 2009-10-14 22:03:18

0

您正在寻找的术语是表观类型实际类型

A a = new B(); 

表观类型是A,因为编译器只知道该对象的类型是A.作为这样的在这时候可以不引用任何的B特异性的方法。

实际类型是B.您可以转换对象(即更改其明显类型)以访问B特定的方法。

+0

我以前没有听说过“明显类型”的术语。你能告诉我你从哪里得到的?我不认为我在JLS中看到过它。 – 2009-10-03 17:26:24

+0

Michael J. Laszlo - 以Java中的图形应用程序为特色的面向对象编程使用这些术语来描述问题中提到的类型差异。事情是,我认为每个作者都必须为其他地方没有明确定义的这样的东西做出自己的术语。 – 2009-10-03 21:08:11

0

要确定a是类的对象,你可以使用:List类型 的Field对象上

/*The java.lang.Object.getClass() method returns the runtime class of an object*/ 
System.out.println("a is object of: "+a.getClass()); 
+0

这是如何回答这个问题的? – shmosel 2018-01-11 03:53:56

+0

该op是想知道什么是可以用于'a'的术语。我的意思是说'a'是类'b'的一个对象。 – 2018-01-11 03:59:29