1

和有什么区别

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();

4

5 回答 5

13

在java中创建对象有不同的方法:

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

MyObject object = new MyObject();

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

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

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

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

D. 使用对象反序列化对象反序列化只不过是从其序列化形式创建一个对象。

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

E. 以另一种方式使用反射。

this.getClass().getClassLoader().loadClass(“com.abc.myobject”).newInstance();
于 2013-04-21T09:18:18.503 回答
3

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

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

因此,下面的代码片段只创建了一个被两个不同变量引用的对象:

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

您的示例中也发生了同样的事情,尽管方式更为隐蔽。

以下代码段创建一个Toolkit对象。除其他外,该对象包含一个Dimension对象。第二行只是创建对那个已经存在的对象的引用。

Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();
于 2013-04-21T09:30:52.950 回答
1

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

Dimension screenSize = toolKitObject.getScreenSize();

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

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

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

于 2013-04-21T09:37:32.537 回答
0

没有。!!

第二个不创建对象。它获取从另一个方法创建的对象。如果该方法创建了一个新对象,那就没问题了。如果该方法使用现有方法,则不会。

于 2013-04-21T09:18:09.603 回答
0

在下线

ClassABC objectName = new ClassABC();

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

但是有了这个

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue()

我们只在堆栈上创建新的引用。并将其指向堆上可能在方法内部创建/引用的现有对象。

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

因此,根据方法返回的内容,在上述行之后 objectName 可以为 null 或不为 null。. 希望它能清除这些东西。

于 2013-04-22T05:33:24.037 回答