为什么在 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()
。
即:类型声明和实例化方法是分开的。他们出于自己的目的需要他们。
当我们在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()
。
即:类型声明和实例化方法是分开的。他们出于自己的目的需要他们。