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