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

Java中创建(实例化)对象的五种方式

1、用new语句直接创建对象,这是最常见的创建对象的方法。

2、通过工厂方法返回对象,如:String str = String.valueOf(23); 

3、调用对象的clone()方法。

【Java基础】Java创建对象的五种方式_第1张图片

4、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。如:Object obj = Class.forName("java.lang.Object").newInstance(); 

 【Java基础】Java创建对象的五种方式_第2张图片

5、通过I/O流(包括反序列化),如运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。

 【Java基础】Java创建对象的五种方式_第3张图片

源代码

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

 

结果展示

【Java基础】Java创建对象的五种方式_第4张图片

 

 

你可能感兴趣的:(【Java基础】Java创建对象的五种方式)