创建对象的方法:new、反射、clone、发序列化
1 new
package xx.study.design.createObj;public class NewCreateObj {public static void main(String[] args) {Programmer programmer=new Programmer("程序员",29);System.out.println(programmer);}}
2 反射
package xx.study.design.createObj;import java.lang.reflect.Constructor;/*** Class.newInstance();只能反射无参的构造器,需要构造器可见;* Constructor.newInstance();可以反射任何构造器,可以反射私有构造器*/
public class ReflectCreatObj {public static void main(String[] args) throws Exception {Class clazz = Programmer.class;//利用Class.newInstance()Object object1 = clazz.newInstance();System.out.println(object1);//利用Constructor.newInstance()反射无参构造方法Constructor cons1 = clazz.getDeclaredConstructor();Object object2 = cons1.newInstance();System.out.println(object2);//利用Constructor.newInstance()反射私有构造方法Constructor cons2 = clazz.getDeclaredConstructor(String.class,Integer.TYPE);if(!cons2.isAccessible())cons2.setAccessible(true);Object object3 = cons2.newInstance("张三",12);System.out.println(object3.toString());}}
3 clone
package xx.study.design.createObj;/*** Programmer必须实现Cloneable接口 clone()*/
public class CloneCreateObj {public static void main(String[] args) {Programmer programmer=new Programmer("码农",22);Programmer programmerTwins= (Programmer) programmer.Clone();System.out.println(programmerTwins);}
}
4 发序列化
package xx.study.design.createObj;import java.io.*;/*** 使用 反序列化ObjectInputStream的readObject()方法:类必须实现 Serializable接口*/
public class SerializableCreateObj {public static void main(String[] args) {Programmer programmer=new Programmer("cx",22);// 序列化ObjectOutputStream objectOutputStream = null;try {//序列化写入文件objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.txt"));objectOutputStream.writeObject(programmer);// 反序列化ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.txt"));Programmer programmer1 = (Programmer) objectInputStream.readObject();System.out.println(programmer1);} catch (Exception e) {e.printStackTrace();}}
}
基类
package xx.study.design.createObj;import java.io.Serializable;public class Programmer implements Serializable,Cloneable {private String name;private int age;public Programmer(String name, int age) {this.name = name;this.age = age;}public Programmer(){}@Overridepublic String toString() {return "Programmer{" +"name='" + name + '\'' +", age=" + age +'}';}public Object Clone(){try {return super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}
}