疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

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);

  }

  }

  复制代码

  运行结果: