为什么在 Java 中实例化新对象时必须输入两次 class 名称?

Why do we have to type the class name twice when instantiating a new object in Java?

当我们在Java中创建一个新对象时,我们使用语法:

ClassName instancename = new ClassName();

我的问题是为什么我们必须在开头输入 class 名称?为什么根本就没有 'object' 关键字?

示例:

object instancename = new ClassName();

对象是所有 java class 对象的父对象 class。当您第一次调用 class 时,

ClassName instancename

它为该变量名创建内存引用,但该引用尚未指向实际对象,因为它尚未在内存中创建。第二次调用时,

instancename = new ClassName();

它调用 ClassName 的默认构造函数,该构造函数分配内存并实际在内存中创建对象。

在使用多个 classes 时,创建 ClassName 的实例而不是对象更安全。如果您使用对象来声明您的 classes,您将经常不得不频繁使用类型转换,以便您的代码能够编译,因为编译器将知道要查看哪个 class 以找到相应的 class的方法。

有许多新语言可以凭直觉判断创建对象的类型。 Java就是其中之一。

new ArrayList<String> ()

Java 知道结果的类型是 ArrayList<String>。但是,在 Java 中,您不必将结果分配给该类型的对象,您可以使用层次结构中一直到 Object 的任何类型 - 事实上,您甚至被鼓励这样做。大多数情况下,您会向上移动到最近的 interface(在本例中为 List<String>),但进一步向上移动可能会有用(Iterable<String> 在这里效果很好)。在这种情况下推荐的技术是:

List<String> myList = new ArrayList<String> ();

或者 - 在 Java 7

中更简洁
List<String> myList = new ArrayList<> ();

Iterable<String> myList = new ArrayList<> ();

My question is why do we have to type the class name at the beginning? Why is there simply not an 'object' keyword?

您正在执行两个 "things",您正在创建一个可以容纳 ClassName 的引用,并创建一个 ClassName.

的实例

许多语言可以从另一面推断出一侧,但是 Java(默认情况下,请参阅 Lombok)不能。 From memory with 最初是这样做的,以保持语言规范简单。

左手:

ClassName instancename

ClassName 正在声明变量 instancename 的类型 (= class)。

右手:

new ClassName();

ClassName() 正在调用名为 ClassName() 的(构造函数)方法。

所以,您同时在做两件事。

ClassName instancename;         // declaring type
instancename = new ClassName(); // invoking method

你的例子:

ClassName instancename = new ClassName();

只是两条指令的缩写形式。

还有其他获取 class 实例的方式——例如 newInstance()getInstance()

即:类型声明和实例化方法是分开的。他们出于自己的目的需要他们。