• 【Java基础】Java创建对象的五种方式


    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;
        }
    
    }
    CreateObjectUtil.java 
    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();
        }
    }
    CreateObjectDemo.java

    结果展示

  • 相关阅读:
    工厂方法模式
    代理模式
    观察者模式
    策略模式
    单例模式
    简单工厂模式
    lintcode:等价二叉树
    lintcode:被围绕的区域
    lintcode:二叉树的所有路径
    lintcode:快乐数
  • 原文地址:https://www.cnblogs.com/Lints/p/11980321.html
Copyright © 2020-2023  润新知