有两种方法可以在java中创建对象吗?

时间:2013-04-21 09:14:58

标签: java class object initialization

之间有什么区别
ClassABC objectName = new ClassABC();

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue();

第二个例子仍然像第一个一样启动吗?如果不是,这两种“启动”之间有什么区别?

如果这令人困惑,我将使用另一个Java类给出第二个例子。

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = new Dimension();

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();

注意在第一个例子中我是如何创建Dimension对象并且没有为它设置任何值..但是在第二个例子中,我从未使用过new Dimension();我立即继续前进并做了toolKitObject.getScreenSize(); < / p>

5 个答案:

答案 0 :(得分:13)

different种方法可以在java中创建对象:

一个。使用new关键字这是在java中创建对象的最常用方法。几乎99%的对象都是以这种方式创建的。

MyObject object = new MyObject();

B中。使用Class.forName()如果我们知道类的名称&amp;如果它有一个公共默认构造函数,我们可以用这种方式创建一个对象。

MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();

℃。使用clone()clone()可用于创建现有对象的副本。

MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();

d。使用对象反序列化对象反序列化只不过是从序列化形式创建对象。

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();

电子。以另一种方式使用反射。

this.getClass().getClassLoader().loadClass(“com.abc.myobject”).newInstance();

答案 1 :(得分:3)

我喜欢Achintya的答案,但我觉得答案比问题更先进。

在java中,变量(不包括基本类型,如整数)引用内存中的对象。

因此,以下代码段只创建一个由两个不同变量引用的对象:

Object a = new Object();
Object b = a;

同样的事情发生在你的例子中,但是以更隐蔽的方式发生。

以下代码段会创建一个Toolkit对象。此对象包含Dimension对象等。第二行只是创建对现有对象的引用。

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();

答案 2 :(得分:1)

您的两个示例最终都使用new运算符。

Dimension screenSize = toolKitObject.getScreenSize();

以下是您在上述行中调用的getScreenSize的源代码:

// implementation as per SunToolkit.class
public Dimension getScreenSize() {
    return new Dimension(getScreenWidth(), getScreenHeight());
}

你会在幕后看到,它仍在调用new Dimension(带有高度和宽度的重载版本)。

答案 3 :(得分:0)

不。!!

第二个不创建对象。它获取从另一个方法创建的对象。如果该方法创建一个新的Object,那就没关系。如果该方法使用现有方法,则为。

答案 4 :(得分:0)

在下面一行

ClassABC objectName = new ClassABC();

它在堆上创建新实例并在堆栈上创建新引用,并将此新对象引用分配给创建的新引用。 。 因此,使用此代码,我们肯定会在堆上获取新对象。所以在上面的行之后,objectName永远不会为null。

但是有了这个

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue()

我们只在堆栈上创建新的引用。并将其打包到堆上的现有Object,这可能是在方法内创建/引用的。

所以在这个阶段它肯定会在堆栈上创建引用。但是在堆上创建的新对象取决于该方法的实现。

所以在上面的行之后,objectName可以为null或不为null,具体取决于从方法返回的内容。 。 希望它能清除这些东西。