Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Java中实例化新对象时必须键入两次类名?_Java_Class_Object_Instantiation - Fatal编程技术网

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

为什么在Java中实例化新对象时必须键入两次类名?,java,class,object,instantiation,Java,Class,Object,Instantiation,在Java中创建新对象时,我们使用以下语法: ClassName instancename = new ClassName(); 我的问题是为什么我们必须在开头键入类名?为什么没有“object”关键字 例如: object instancename = new ClassName(); 对象是所有java类的父类。当你第一次给班级打电话时 ClassName instancename 它为该变量名创建内存引用,但该引用尚未指向实际对象,因为它尚未在内存中创建。当你第二次叫它的时候 ins

在Java中创建新对象时,我们使用以下语法:

ClassName instancename = new ClassName();
我的问题是为什么我们必须在开头键入类名?为什么没有“object”关键字

例如:

object instancename = new ClassName();

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

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

instancename = new ClassName();
它调用ClassName的默认构造函数,该构造函数分配内存并实际在内存中创建对象


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

有许多新语言可以直观地显示所创建对象的类型。Java就是其中之一

new ArrayList<String> ()
或者-在Java7中更简洁

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

Iterable myList=newarraylist();
我的问题是为什么我们必须在开头键入类名?为什么没有“object”关键字

您正在做两件“事情”:创建一个可以保存
类名的引用,以及创建
类名的实例

许多语言可以从一个方面推断另一个方面,但是Java(默认情况下,请参阅)不能。从内存开始,最初是这样做的,以保持语言规范的简单

在左手边:

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

在右边:

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

所以,你同时在做两件事

ClassName instancename;         // declaring type
instancename = new ClassName(); // invoking method
你的例子是:

ClassName instancename = new ClassName();
这只是两个指令的缩写形式

还有其他获取类实例的方式--
newInstance()
getInstance()


也就是说:类型声明和实例化方法是分开的。它们是出于各自的目的而需要的。

有趣的是,
objectinstancename=new Classname()将编译:)那么在泛型对象类型上使用类名有什么好处呢?声明的类不必与实例化的类相同:
List aList=new ArrayList()
。值得思考……因为Java是静态类型的。@LuiggiMendoza:这是部分原因,但不是全部原因。现在很多语言都有一些“auto”或“value”关键字,基本上是说“嘿,compile,你知道它的类型,别让我再写了”。Java没有理由不具备这种能力。你是说List是一个接口吗?是的,它是一个
接口
。但是接口不能实例化正确-
List myList=new ArrayList()注意使用
新建ArrayList…
实例化
列表
ClassName instancename;         // declaring type
instancename = new ClassName(); // invoking method
ClassName instancename = new ClassName();