📅  最后修改于: 2020-03-18 14:22:52             🧑  作者: Mango
众所周知,在Java中,类为对象提供了蓝图,您可以从类中创建对象。用Java创建对象的方法有很多。
以下是在Java中创建对象的一些方法:
1)使用new关键字:使用new关键字是创建对象的最基本方法。这是在Java中创建对象的最常见方法。几乎99%的对象都是通过这种方式创建的。通过使用此方法,我们可以调用要调用的任何构造函数(无参数或参数化的构造函数)。
// Java使用new关键之创建对象/实例
public class NewKeywordExample
{
String name = "芒果For芒果";
public static void main(String[] args)
{
// 用new创建新的对象
NewKeywordExample obj = new NewKeywordExample();
System.out.println(obj.name);
}
}
输出:
芒果For芒果
2)使用new Instance: 如果我们知道类的名称,并且它具有公共默认构造函数,则可以创建一个对象– Class.forName。我们可以使用它来创建类的对象。Class.forName实际上是在Java中加载Class,但不会创建任何Object。要创建该类的对象,您必须使用该类的新实例方法。
// Java展示使用new Instance创造对象
public class NewInstanceExample
{
String name = "芒果For芒果";
public static void main(String[] args)
{
try
{
Class cls = Class.forName("NewInstanceExample");
NewInstanceExample obj =
(NewInstanceExample) cls.newInstance();
System.out.println(obj.name);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
}
输出:
芒果For芒果
3)使用clone()方法:每当在任何对象上调用clone()时,JVM实际上都会创建一个新对象,并将先前对象的所有内容复制到其中。使用clone方法创建对象不会调用任何构造函数。
要在对象上使用clone()方法,我们需要实现Cloneable并在其中定义clone()方法。
// Java程序,展示使用clone()方法创建对象
public class CloneExample implements Cloneable
{
@Override
protected Object clone() throws CloneNotSupportedException
{
return super.clone();
}
String name = "芒果For芒果";
public static void main(String[] args)
{
CloneExample obj1 = new CloneExample();
try
{
CloneExample obj2 = (CloneExample) obj1.clone();
System.out.println(obj2.name);
}
catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
}
}
输出:
芒果For芒果
注意 :
4)使用反序列化:每当我们序列化然后反序列化一个对象时,JVM都会创建一个单独的对象。在反序列化中,JVM不使用任何构造函数来创建对象。为了反序列化对象,我们需要在类中实现Serializable接口。
序列化对象:
// Java展示序列化对象
import java.io.*;
class DeserializationExample implements Serializable
{
private String name;
DeserializationExample(String name)
{
this.name = name;
}
public static void main(String[] args)
{
try
{
DeserializationExample d =
new DeserializationExample("芒果For芒果");
FileOutputStream f = new FileOutputStream("file.txt");
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(d);
oos.close();
f.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
DeserializationExample类的对象使用writeObject()方法进行序列化,然后写入file.txt文件。
对象的反序列化:
// Java使用反序列化,创建新的对象.
import java.io.*;
public class DeserializationExample
{
public static void main(String[] args)
{
try
{
DeserializationExample d;
FileInputStream f = new FileInputStream("file.txt");
ObjectInputStream oos = new ObjectInputStream(f);
d = (DeserializationExample)oos.readObject();
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println(d.name);
}
}
输出:
芒果For芒果
5)使用构造方法类的newInstance()方法:这类似于类的newInstance()方法。java.lang.reflect.Constructor类中有一个newInstance()方法,可用于创建对象。通过使用此newInstance()方法,它还可以调用参数化构造函数和私有构造函数。
这两种newInstance()方法都被称为创建对象的反射方式。实际上,Class的newInstance()方法在内部使用了Constructor类的newInstance()方法。
// Java使用newInstance()方法创建新对象
import java.lang.reflect.*;
public class ReflectionExample
{
private String name;
ReflectionExample()
{
}
public void setName(String name)
{
this.name = name;
}
public static void main(String[] args)
{
try
{
Constructor constructor
= ReflectionExample.class.getDeclaredConstructor();
ReflectionExample r = constructor.newInstance();
r.setName("芒果For芒果");
System.out.println(r.name);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
输出:
芒果For芒果