为什么在创建对象时调用构造函数?
根据this,构造函数实际上是初始值设定项。并且根据this答案对象已经在调用new
关键字之后的构造函数之前创建。为什么在创建对象时调用构造函数?
所以我的问题是如果我不想初始化任何东西,需要将构造函数放在new
关键字后面。
把它看成是这样的...
- 的JVM分配内存为对象,但它尚未初始化或接线。
- JVM为内存中的对象分配常用的东西,比如指向方法的指针,静态变量等。虽然对象存在,但它仍然没有通过执行构造函数来唯一地初始化。
- 调用构造函数,初始化对象。
如果您不想初始化变量,你可以将它声明:
MyObject myObject;
不过,如果你希望能够做任何事情都与myObject
,你需要创建一个对象该变量可以指向,并且用new
关键字完成。否则myObject
只是指向一个什么都没有。
您想要初始化对象本身,其中包括为对象分配内存。还有其他的内务管理内部工作也需要完成。
引述您发布的链接:
构造函数的工作是确保新的对象处于有效状态...
你真的想创建一个对象,并没有在一个有效的状态?
如果你只是想要一个对象引用,只需声明一个,不要调用new。
MyClass mc;
你是什么意思的“有效状态”? – Parth 2012-07-23 17:02:32
你是对的,Java的语法可能是
,而不是
String str = new String()
给你一个空字符串。这个问题有时候我们想把参数传递到像这样的构造函数中:
String str = new String("text")
这就是我们称之为构造函数的原因。为了保持语法一致,你还必须调用默认的构造函数String()
。在这种情况下,String
是不可变的类,所以没有其他方法来设置它的初始值。
你也可以做'List list = new ArrayList()'。在你的例子中'List list = new'会不明确。 – 2012-07-23 17:54:40
好点,我认为这是他所要求的,不知道为什么顶部的答案在那里... – 2012-07-23 17:59:01
多年来,Java上游语言的术语侵入了Java语言。
过去(C)分配是从初始化开始的单独步骤。他们用C++结合起来,现在被认为是同样的事情。从技术上讲,在“建造”操作的顺序是
- 为对象
- 分配的存储器作为指定初始化该内存。
对于对象的父类,可能会多次执行这些步骤。关键在于分配始终在初始化之前,并且两者紧密耦合。分配必须在初始化之前进行,或者初始化没有内存进行初始化。构造函数保证两者都是为了避免其他语言中的早期问题,程序通过访问已分配但未初始化的项目来访问随机数据。创建构造函数是为了防止此类错误。
现在,您分配给的东西是一个变量,并且变量保存对值的引用(在Java中,对于对象)。所以你可以考虑一个变量只是一个可以被解除引用的值。如果你想要一个新的名字,但希望没有提及,那么Keppil的答案是最好的。
MyType myName;
这将创建一个没有值(空)引用的名称。
但是,在Java中,对象值必须被初始化。没有“没有初始化分配”,因为这相当于拥有一个随机内部状态的对象。随机内部状态意味着使用该对象将具有(最好)随机结果,并且(在最坏的情况下)对不存在的对象的引用。随着分配和初始化建设的紧密结合,类型体系运作;如果没有它,理论上可以引用一个不存在的对象,从而在Java中重新创建C的分段错误。
:'MyType myName'引用'null',那么MyType myName = new MyType()'将如何如果'MyType()'是一个默认构造函数,则初始化Object? – Parth 2012-07-23 16:59:04
'new MyType()'是一组命令组合,用于分配必要的内存,根据构造函数指令初始化该内存,并返回一个引用。 'MyType myName'部分只是一个引用(就像一个指针),它没有任何内存超过了引用的数量,而整个操作'MyType myName = new MyType()'构造了右边的对象,然后将返回的引用分配到左侧的“named”内存位置。它不是C++,因此如果没有'new'关键字(没有就地分配),就永远不能创建对象。 – 2012-07-23 17:04:01
就默认的构造函数而言,基本上所有的对象都带有一个构造函数_if,只要你不声明one_。如果你没有声明构造函数,编译器会在'public MyType(){super(); '作为构造函数。如果你声明了一个构造函数,那么不存在默认的构造函数。无论哪种情况,'new(插入构造函数)'从不会调用超出插入的构造函数,所以关于构造函数的唯一“默认”部分不会影响'new MyType()'部分(因为它是显式声明的,所以不默认)。 – 2012-07-23 17:07:45
为什么你不想初始化你的对象? – 2012-07-23 16:36:17
如果在创建对象时不想执行任何操作,则可以使用空的构造函数。你想要一个初始化对象是否有很好的理由? (顺便说一句,你可以做到这一点,但我怀疑这不是你想要的) – 2012-07-23 16:44:07
@codemaker:做任何答案都能解决你的问题吗?如果不是,你能澄清你的问题吗? – atk 2012-07-31 20:22:20