当我们在Java中创建一个新对象时,我们使用语法:
ClassName instancename = new ClassName();
我的问题是为什么我们必须在开头输入类名?为什么没有“对象”关键字?
示例:
object instancename = new ClassName();
答案 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<> ();