之间有什么区别
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>
答案 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,具体取决于从方法返回的内容。 。 希望它能清除这些东西。