java创建对象的几种常用方法

java几种常见的创建对象的方法:

1、使用new关键字创建对象

2、利用java的反射机制,通过java.lang.Class或者java.lang.reflect.Constructor创建对象

3、实现Cloneable接口,然后重写Object.clone()方法创建对象

4、实现序列化serialiable接口,通过反序列化,ObjectInputStream的readObject()方法创建对象

5、String str="abc" 直接由jvm创建 或者使用 字符串操作符"+"  String str1 = "a"+"bc"由jvm创建

创建对象类TestBean.java

package test.createObj;

import java.io.Serializable;

public class TestBean implements Cloneable,Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = -6896355094290356656L;
    private String id;
    private String name;
    
    public TestBean(String id, String name) {
        this.id = id;
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getId() {
        return id;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    
    @Override
    public String toString() {
        return super.toString()+"  "+id+"  "+name;
    }
}

创建测试类CreateObjTest.java

package test.createObj;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;

public class CreateObjTest {

    /**
     * @param args
     */
    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        //一、new关键词新建一个对象
        TestBean testbean1 = new TestBean("1","张三哈哈");
        
        //二、反射机制
        TestBean testbean2 = null;
        try {
            Class<?> clazz = Class.forName("test.createObj.TestBean");
            //当类中含有参数的构造函数 而没有无参构造函数时 会报java.lang.InstantiationException异常
            //则类里需要添加无参构造函数
//            testbean2 = (TestBean) clazz.newInstance();
            
            //或者用反射获取类的有参构造函数   通过有参构造函数实例化对象
            Class[] paramTypes = {String.class,String.class};
            Constructor constor = clazz.getConstructor(paramTypes);
            testbean2 = (TestBean) constor.newInstance("2","李四");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        //三、克隆   但类必须要实现Cloneable接口     并且要在类里重写clone方法
        //jdl1.6中文api是这样说的:
        //如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。 
        //按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
        //请参阅 Object.clone(),以获得有关重写此方法的详细信息。 
        //注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。 
        TestBean testbean3 = null;
        try {
            testbean3 = (TestBean) testbean1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        
        //四、反序列化  但类要实现序列化接口
        ObjectOutputStream objOutStream = null;
        ObjectInputStream objInStream = null;
        TestBean testbean4 = null;
        try {
            File file = new File("C:\testbean.txt");
            if(!file.exists()){
                file.createNewFile();
            }
//            objOutStream = new ObjectOutputStream(new FileOutputStream(file));
//            objOutStream.writeObject(testbean1);
            objInStream = new ObjectInputStream(new FileInputStream(file));
            testbean4 = (TestBean) objInStream.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(objOutStream!=null){
                try {
                    objOutStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(objInStream!=null){
                try {
                    objInStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        System.out.println("testbean1:"+testbean1);
        System.out.println("testbean2:"+testbean2);
        System.out.println("testbean3:"+testbean3);
        System.out.println("testbean4:"+testbean4);
    }

}

运行结果:

原文地址:https://www.cnblogs.com/yinwutuan/p/4226673.html