2012-07-23 224 views
0

根据this,构造函数实际上是初始值设定项。并且根据this答案对象已经在调用new关键字之后的构造函数之前创建。为什么在创建对象时调用构造函数?

所以我的问题是如果我不想初始化任何东西,需要将构造函数放在new关键字后面。

+2

为什么你不想初始化你的对象? – 2012-07-23 16:36:17

+0

如果在创建对象时不想执行任何操作,则可以使用空的构造函数。你想要一个初始化对象是否有很好的理由? (顺便说一句,你可以做到这一点,但我怀疑这不是你想要的) – 2012-07-23 16:44:07

+0

@codemaker:做任何答案都能解决你的问题吗?如果不是,你能澄清你的问题吗? – atk 2012-07-31 20:22:20

回答

5

把它看成是这样的...

  1. 的JVM分配内存为对象,但它尚未初始化或接线。
  2. JVM为内存中的对象分配常用的东西,比如指向方法的指针,静态变量等。虽然对象存在,但它仍然没有通过执行构造函数来唯一地初始化。
  3. 调用构造函数,初始化对象。
4

如果您不想初始化变量,你可以将它声明:

MyObject myObject; 

不过,如果你希望能够做任何事情都与myObject,你需要创建一个对象该变量可以指向,并且用new关键字完成。否则myObject只是指向一个什么都没有。

+2

那并不真正声明一个对象。它声明了一个最终将“包含”或“指向”指定类型的对象的变量。 – atk 2012-07-23 16:37:47

+0

@atk:我没有说声明一个对象,我说声明一个变量。 – Keppil 2012-07-23 16:39:47

+0

你是对的。我期望这会混淆OP,因为我认为他们对于分配对象的时间和初始化时间之间的差异感到困惑,所以增加了说明。道歉没有在我的意图更清晰:) – atk 2012-07-23 16:43:48

0

您想要初始化对象本身,其中包括为对象分配内存。还有其他的内务管理内部工作也需要完成。

0

引述您发布的链接:

构造函数的工作是确保新的对象处于有效状态...

你真的想创建一个对象,并没有在一个有效的状态?

如果你只是想要一个对象引用,只需声明一个,不要调用new。

MyClass mc; 
+0

你是什么意思的“有效状态”? – Parth 2012-07-23 17:02:32

0

你是对的,Java的语法可能是

​​

,而不是

String str = new String() 

给你一个空字符串。这个问题有时候我们想把参数传递到像这样的构造函数中:

String str = new String("text") 

这就是我们称之为构造函数的原因。为了保持语法一致,你还必须调用默认的构造函数String()。在这种情况下,String是不可变的类,所以没有其他方法来设置它的初始值。

+1

你也可以做'List list = new ArrayList()'。在你的例子中'List list = new'会不明确。 – 2012-07-23 17:54:40

+0

好点,我认为这是他所要求的,不知道为什么顶部的答案在那里... – 2012-07-23 17:59:01

1

多年来,Java上游语言的术语侵入了Java语言。

过去(C)分配是从初始化开始的单独步骤。他们用C++结合起来,现在被认为是同样的事情。从技术上讲,在“建造”操作的顺序是

  1. 为对象
  2. 分配的存储器作为指定初始化该内存。

对于对象的父类,可能会多次执行这些步骤。关键在于分配始终在初始化之前,并且两者紧密耦合。分配必须在初始化之前进行,或者初始化没有内存进行初始化。构造函数保证两者都是为了避免其他语言中的早期问题,程序通过访问已分配但未初始化的项目来访问随机数据。创建构造函数是为了防止此类错误。

现在,您分配给的东西是一个变量,并且变量保存对值的引用(在Java中,对于对象)。所以你可以考虑一个变量只是一个可以被解除引用的值。如果你想要一个新的名字,但希望没有提及,那么Keppil的答案是最好的。

MyType myName;

这将创建一个没有值(空)引用的名称。

但是,在Java中,对象值必须被初始化。没有“没有初始化分配”,因为这相当于拥有一个随机内部状态的对象。随机内部状态意味着使用该对象将具有(最好)随机结果,并且(在最坏的情况下)对不存在的对象的引用。随着分配和初始化建设的紧密结合,类型体系运作;如果没有它,理论上可以引用一个不存在的对象,从而在Java中重新创建C的分段错误。

+0

:'MyType myName'引用'null',那么M​​yType myName = new MyType()'将如何如果'MyType()'是一个默认构造函数,则初始化Object? – Parth 2012-07-23 16:59:04

+1

'new MyType()'是一组命令组合,用于分配必要的内存,根据构造函数指令初始化该内存,并返回一个引用。 'MyType myName'部分只是一个引用(就像一个指针),它没有任何内存超过了引用的数量,而整个操作'MyType myName = new MyType()'构造了右边的对象,然后将返回的引用分配到左侧的“named”内存位置。它不是C++,因此如果没有'new'关键字(没有就地分配),就永远不能创建对象。 – 2012-07-23 17:04:01

+0

就默认的构造函数而言,基本上所有的对象都带有一个构造函数_if,只要你不声明one_。如果你没有声明构造函数,编译器会在'public MyType(){super(); '作为构造函数。如果你声明了一个构造函数,那么不存在默认的构造函数。无论哪种情况,'new(插入构造函数)'从不会调用超出插入的构造函数,所以关于构造函数的唯一“默认”部分不会影响'new MyType()'部分(因为它是显式声明的,所以不默认)。 – 2012-07-23 17:07:45

相关问题