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

在java中有两种创建对象的方法吗?,java,class,object,initialization,Java,Class,Object,Initialization,两者的区别是什么 ClassABC objectName = new ClassABC(); 及 第二个示例是否仍像第一个示例一样启动?如果没有,这两种类型的“初始化”有什么区别 如果这令人困惑,我将使用另一个Java类给出第二个示例 Toolkit toolKitObject = Toolkit.getDefaultToolkit(); Dimension screenSize = new Dimension(); 及 请注意,在第一个示例中,我创建了标注对象,但没有为其设置任何值。。但是

两者的区别是什么

ClassABC objectName = new ClassABC();

第二个示例是否仍像第一个示例一样启动?如果没有,这两种类型的“初始化”有什么区别

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

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

请注意,在第一个示例中,我创建了标注对象,但没有为其设置任何值。。但是在第二个例子中,我从未使用过
newdimension()我立即开始,并执行了
toolKitObject.getScreenSize()



第二个不创建对象。它获取从另一个方法创建的对象。如果该方法创建了一个新对象,那么就可以了。如果该方法使用现有的方法,则否。



第二个不创建对象。它获取从另一个方法创建的对象。如果该方法创建了一个新对象,那么就可以了。如果该方法使用现有方法,则不会。有几种方法可以在java中创建对象:

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

MyObject object = new MyObject();
MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();
B.使用Class.forName()如果我们知道类的名称&如果它有一个公共默认构造函数,我们可以用这种方式创建一个对象

MyObject object = new MyObject();
MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();
C.使用clone()clone()可用于创建现有对象的副本

MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();
Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();
使用对象反序列化对象反序列化只是从其序列化形式创建一个对象

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();
E.以另一种方式使用反射

this.getClass().getClassLoader().loadClass(“com.abc.myobject”).newInstance();
有几种方法可以在java中创建对象:

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

MyObject object = new MyObject();
MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();
B.使用Class.forName()如果我们知道类的名称&如果它有一个公共默认构造函数,我们可以用这种方式创建一个对象

MyObject object = new MyObject();
MyObject object = (MyObject) Class.forName("subin.rnd.MyObject").newInstance();
C.使用clone()clone()可用于创建现有对象的副本

MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();
Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();
使用对象反序列化对象反序列化只是从其序列化形式创建一个对象

ObjectInputStream inStream = new ObjectInputStream(anInputStream );
MyObject object = (MyObject) inStream.readObject();
E.以另一种方式使用反射

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

我喜欢阿奇蒂亚的答案,但我觉得答案比问题要高级得多

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

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

Object a = new Object();
Object b = a;
同样的事情也发生在你的例子中,尽管是以一种更隐蔽的方式

下面的代码片段创建了一个
Toolkit
对象。此对象包含一个
维度
对象。第二行只是创建对已存在对象的引用

MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();
Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();

我喜欢阿奇蒂亚的答案,但我觉得答案比问题要高级得多

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

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

Object a = new Object();
Object b = a;
同样的事情也发生在你的例子中,尽管是以一种更隐蔽的方式

下面的代码片段创建了一个
Toolkit
对象。此对象包含一个
维度
对象。第二行只是创建对已存在对象的引用

MyObject anotherObject = new MyObject();
MyObject object = anotherObject.clone();
Toolkit toolKitObject = Toolkit.getDefaultToolkit();
Dimension screenSize = toolKitObject.getScreenSize();

两个示例最后都使用了
new
操作符

Dimension screenSize = toolKitObject.getScreenSize();
下面是您在上面一行调用的
getScreenSize
的源代码:

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

您将看到,在幕后,它仍在调用一个
新维度(采用高度和宽度的重载版本)。

您的两个示例最终都使用了
new
操作符

Dimension screenSize = toolKitObject.getScreenSize();
下面是您在上面一行调用的
getScreenSize
的源代码:

// implementation as per SunToolkit.class
public Dimension getScreenSize() {
    return new Dimension(getScreenWidth(), getScreenHeight());
}
你会看到,在幕后,它仍然在调用一个新的维度(需要高度和宽度的重载版本)

ClassABC objectName = new ClassABC();
它在堆上创建新实例,在堆栈上创建新引用,并将此新对象引用分配给创建的新引用。 . 因此,通过这段代码,我们将明确地在堆上获得新对象。因此,在上述行之后,objectName肯定永远不会为null

但是有了这个

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue()
我们只在堆栈上创建新引用。并将其指向堆上可能在方法内部创建/引用的现有对象

所以在这个阶段,它将明确地在堆栈上创建引用。但是否在堆上创建新对象取决于方法的实现

所以,在上述行之后,objectName可以为null,也可以不为null,这取决于方法返回的内容。 希望它能解决问题。

在下面的一行

ClassABC objectName = new ClassABC();
它在堆上创建新实例,在堆栈上创建新引用,并将此新对象引用分配给创建的新引用。 . 因此,通过这段代码,我们将明确地在堆上获得新对象。因此,在上述行之后,objectName肯定永远不会为null

但是有了这个

ClassABC objectName = differentVariable.methodReturnsClassABCTypeValue()
我们只在堆栈上创建新引用。并将其指向堆上可能在方法内部创建/引用的现有对象

所以在这个阶段,它将明确地在堆栈上创建引用。但是否在堆上创建新对象取决于方法的实现

所以,在上述行之后,objectName可以为null,也可以不为null,这取决于方法返回的内容。
希望它能澄清问题。

对不起,我不得不对这篇文章稍加修改。第二个与第一个是同一个类,但在它的对象中我存储了一个方法的值,该方法返回一个可以存储在ClassABC对象中的值。
methodReturnsClassABC类型值()
必须有
new ClassABC()
的地方。抱歉,我不得不对此进行一些编辑。第二个与第一个是同一个类,但在其对象中我存储了一个方法的值,该方法返回的值可以存储在ClassABC对象中。
methodReturnsClassBCTypeValue()