转自:http://ncs123.iteye.com/blog/1775661
Java中创建对象的四种方式
(1) 用new语句创建对象,这是最常见的创建对象的方法。
(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
(3) 调用对象的clone()方法。
(4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
一.用new语句创建对象
- User user = new User()
二.运用反射手段
(1)调用java.lang.Class.newInstance()
- Class.forName(classname).newInstance()
- Wife wife = (Wife) Class.forName("com.java.clone.Wife").newInstance();
(2)调用java.lang.reflect.Constructor类的newInstance()
- Constructor<Wife> constructor = Wife.class.getDeclaredConstructor(int.class,String.class);
- Wife wife = (Wife) constructor.newInstance(1,"nihao");
三.调用对象的clone()方法
- Wife wife = new Wife(1,"wang");
- Wife wife2 = null;
- wife2 = (Wife) wife.clone();//运用clone()方法产生新对象
被序列化的对象必须implements Serializable
- public class BeanUtil {
- @SuppressWarnings("unchecked")
- public static <T> T cloneTo(T src) throws RuntimeException {
- ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
- ObjectOutputStream out = null;
- ObjectInputStream in = null;
- T dist = null;
- try {
- out = new ObjectOutputStream(memoryBuffer);
- out.writeObject(src);
- out.flush();
- in = new ObjectInputStream(new ByteArrayInputStream(
- memoryBuffer.toByteArray()));
- dist = (T) in.readObject();
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (out != null)
- try {
- out.close();
- out = null;
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- if (in != null)
- try {
- in.close();
- in = null;
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- return dist;
- }
- public static void main(String[] args){
- Husband husband = new Husband(1);
- Wife wife = new Wife(1,"jin");
- husband.setWife(wife);
- Husband husband2 = cloneTo(husband);//运用反序列生成了一个对象
- }
- }
*1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自 己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
*2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
四种创建对象的方法只要不是看他们有什么利弊的,而是来适应不同的条件的,一般就用new Obiect().但是如果你需要调一个方法,但是这个方法又是不确定的,那么我们呢就需要用反射了,克隆顾名思义了,运用反序列化手段是传输对象时用
(问题:工厂模式是不是也属于一种创建对象的方法?)