今天来聊一聊在Java创建对象的几种方法。在项目里面,可能你经常使用new创建对象,或者就是把创建对象的事情交给框架(比如spring)。那么,除了new以外,你还知道几种创建对象的方法?下面来看看这6种创建对象的方法:
使用new关键字
Class对象的newInstance()方法
构造函数对象的newInstance()方法
对象反序列化
Object对象的clone()方法
-
继续往下看,最后揭晓
1.使用new关键字
这是最常用也最简单的方式,看看下面这个例子就知道了。
public class Test {
private String name;
public Test() {
}
public Test(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test("张三");
}
}
2.Class对象的newInstance()方法
还是上面的Test对象,首先我们通过Class.forName()动态的加载类的Class对象,然后通过newInstance()方法获得Test类的对象
public static void main(String[] args) throws Exception {
String className = "org.b3log.solo.util.Test";
Class clasz = Class.forName(className);
Test t = (Test) clasz.newInstance();
}
3.构造函数对象的newInstance()方法
类Constructor也有newInstance方法,这一点和Class有点像。从它的名字可以看出它与Class的不同,Class是通过类来创建对象,而Constructor则是通过构造器。我们依然使用第一个例子中的Test类。
public static void main(String[] args) throws Exception {
Constructor<Test> constructor;
try {
constructor = Test.class.getConstructor();
Test t = constructor.newInstance();
} catch (InstantiationException |
IllegalAccessException |
IllegalArgumentException |
InvocationTargetException |
NoSuchMethodException |
SecurityException e) {
e.printStackTrace();
}
}
4.对象反序列化
使用反序列化来获得类的对象,那么这里必然要用到序列化Serializable接口,所以这里我们将第一个例子中的Test作出一点改变,那就是实现序列化接口。
public class Test implements Serializable{
private String name;
public Test() {
}
public Test(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) throws Exception {
String filePath = "sample.txt";
Test t1 = new Test("张三");
try {
FileOutputStream fileOutputStream =
new FileOutputStream(filePath);
ObjectOutputStream outputStream =
new ObjectOutputStream(fileOutputStream);
outputStream.writeObject(t1);
outputStream.flush();
outputStream.close();
FileInputStream fileInputStream =
new FileInputStream(filePath);
ObjectInputStream inputStream =
new ObjectInputStream(fileInputStream);
Test t2 = (Test) inputStream.readObject();
inputStream.close();
System.out.println(t2.getName());
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
5.Object对象的clone()方法
Object对象中存在clone方法,它的作用是创建一个对象的副本。看下面的例子,这里我们依然使用第一个例子的Test类。
public static void main(String[] args) throws Exception {
Test t1 = new Test("张三");
Test t2 = (Test) t1.clone();
System.out.println(t2.getName());
}
6.以上五种方法就是所有的方法了,并不存在第六种方法。如果你觉得还有什么可以创建对象的方法,请评论区留言!
如有侵权,请联系删除
转载请注明来源