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); } }
运行结果: