Java中创建(实例化)对象的五种方式
1、用new语句直接创建对象,这是最常见的创建对象的方法。
2、通过工厂方法返回对象,如:String str = String.valueOf(23);
3、调用对象的clone()方法。
4、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance();
5、通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。
源代码
package main.java; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * @description 创建对象工具类 * @author Lints * @date 2019/12/4 10:35 * @sine version 1.0 */ public class CreateObjectUtil { // 导读:不想看大片注释的朋友,在IDEA中,把光标移至块注释内,按 'Ctrl' + '-' 折叠注释。 /** * @description 通过new关键字创建(实例化)对象 * @param * @return java.lang.Object * @author Lints * @date 2019/12/4 10:36 * @sine version 1.0 */ public static Object createObjectByNewKeyword(){ String strObj = new String("我是new关键字创建的字符串对象"); return strObj; } /** * @description 通过工厂方法创建(实例化)对象 * @param * @return java.lang.Object * @author Lints * @date 2019/12/4 10:36 * @sine version 1.0 */ public static Object createObjectByFactoryMethod() { String strObj = String.valueOf(12345); return strObj; } /** * @description 通过Object类的clone()方法复制得到对象。 * @param * @return java.lang.Object * @author Lints * @date 2019/12/4 10:38 * @sine version 1.0 */ public static Object createObjectByCloneMethod() { CreateObjectDemo srcObj = new CreateObjectDemo(); Object cloneObj = null; try { cloneObj = srcObj.clone(); } catch (CloneNotSupportedException e) { // todo handle the exception } return cloneObj; } /** * @description 根据Java反射机制获取对象 * @param * @return java.lang.Object * @author Lints * @date 2019/12/4 15:06 * @sine version 1.0 */ public static Object createObjectByReflection() { Object obj = null; try { obj = CreateObjectDemo.class.newInstance(); // obj = String.class.newInstance(); } catch (Exception e) { // todo handle the exception } return obj; } /** * @description 通过反序列化机制读取文件对象 * @param * @return java.lang.Object * @author Lints * @date 2019/12/4 17:56 * @sine version 1.0 */ public static Object createObjectBySerialization() { File objFile = new File("CreateObjectDemo.obj"); CreateObjectDemo obj = new CreateObjectDemo(); CreateObjectDemo objFromFile = null; System.out.println(); System.out.println("---序列化前---"); System.out.println("我是obj对象:" + obj); System.out.println("我是objFromFile反序列化对象:" + objFromFile); // JDK1.7后,可以使用try-with-recources优雅关闭流对象 try ( // 输出流,写对象到磁盘 FileOutputStream fos = new FileOutputStream(objFile); ObjectOutputStream oos = new ObjectOutputStream(fos); // 输入流,从磁盘读对象到内存 FileInputStream fis = new FileInputStream(objFile); ObjectInputStream ois = new ObjectInputStream(fis); ) { oos.writeObject(obj); objFromFile = (CreateObjectDemo) ois.readObject(); System.out.println(); System.out.println("---反序列化后---"); System.out.println("我是obj对象:" + obj); System.out.println("我是objFromFile反序列化对象:" + objFromFile); } catch (Exception e) { // todo handle exception } return objFromFile; } }
package main.java; import java.io.Serializable; /** * @description 实现克隆标记接口的demo类. * @author Lints * @date 2019/12/4 15:05 * @sine version 1.0 */ public class CreateObjectDemo implements Serializable, Cloneable { // 导读:不想看大片注释的朋友,在IDEA中,把光标移至注释块内,按 'Ctrl' + '-' 折叠注释。 // 每个类都有特定的序列化ID private static final long serialVersionUID = -8634864503012834475L; /** * @description 重写Object类的clone方法提升Clone方法的访问权限 * @param * @return java.lang.Object * @author Lints * @date 2019/12/4 11:26 * @sine version 1.0 */ @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } // main方法,JVM程序入口 public static void main(String[] args) { String strObj1 = (String) CreateObjectUtil.createObjectByNewKeyword(); String strObj2 = (String) CreateObjectUtil.createObjectByFactoryMethod(); CreateObjectDemo cloneObj = (CreateObjectDemo) CreateObjectUtil.createObjectByCloneMethod(); CreateObjectDemo reflectionObj = (CreateObjectDemo) CreateObjectUtil.createObjectByReflection(); System.out.println("通过new关键字创建的对象:" + strObj1.getClass().getName() + "@" + Integer.toHexString(strObj1.hashCode())); System.out.println("通过工厂方法创建的对象:" + strObj2.getClass().getName() + "@" + Integer.toHexString(strObj2.hashCode())); System.out.println("通过clone方法克隆的对象:" + cloneObj); System.out.println("通过反射机制获取的对象:" + reflectionObj.toString()); CreateObjectDemo obj = (CreateObjectDemo) CreateObjectUtil.createObjectBySerialization(); } }
结果展示