Java,术语澄清

时间:2009-10-03 16:34:58

标签: java terminology

在Java中,Object可以有一个运行时类型(它是创建它的类型)和一个类型(你已经将它转换为的类型)。

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

class A {

}

class B extends A {

}

A a = new B();

a创建为B但是它被声明为A。使用每个视角引用a类型的正确方法是什么?

8 个答案:

答案 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的引用。

我个人以以下方式解释这两个概念(但是请注意,我不确定其正确性):

  • 静态类型的表达式是编译时源代码中存在的纯语法概念,可供Java编译器处理
  • 对象的运行时类是运行时内存中存在的实际机器结构,可供Java虚拟机进行处理