为什么在Java中实例化一个新对象时我们必须输入两次类名?

时间:2015-10-16 14:34:01

标签: java class object instantiation

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

ClassName instancename = new ClassName();

我的问题是为什么我们必须在开头输入类名?为什么没有“对象”关键字?

示例:

object instancename = new ClassName();

4 个答案:

答案 0 :(得分:2)

Object是所有java类的父类。当你第一次给班级打电话时,

ClassName instancename

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

instancename = new ClassName();

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

使用多个类时,创建ClassName实例而不是对象更安全。如果你使用object来声明你的类,你经常需要经常使用类型转换,这样你的代码就会被编译,因为编译器会知道要查找哪个类来查找相应的类的方法。

答案 1 :(得分:1)

  

我的问题是为什么我们必须在开头输入类名?为什么没有一个'对象'关键字?

您正在做两件事",您正在创建一个可以容纳ClassName的参考,并创建一个ClassName的实例。

许多语言可以从另一方推断出一方,但Java(默认情况下,请参见Lombok)不能。从内存开始以这种方式完成,以保持语言规范简单。

答案 2 :(得分:1)

左边:

ClassName instancename

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

在右边:

new ClassName();

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

所以,你一次做两件事。

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

你的例子:

ClassName instancename = new ClassName();

只是缩短了两条指令的风格。

还有其他一种获取课程实例的方式 - 例如newInstance()getInstance()

即:实例化的类型和方法的声明是单独的事情。它们是出于自己的目的而需要的。

答案 3 :(得分:0)

有许多新语言可以直接使用已创建对象的类型。 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<> ();