Java创建对象的四种方式

229 阅读1分钟

一、Java创建对象主要有四种方法,直接上代码~

// 案例使用类
public class Person implements Cloneable, Serializable {
   private final String name;

   private final int age;

   public Person(String name, int age) {
      this.name = name;
      this.age = age;
   }

   public String getName() {
      return name;
   }

   public int getAge() {
      return age;
   }

   @NonNull
   @Override
   public Object clone() throws CloneNotSupportedException {
      return super.clone();
   }
}
public class Test {
   public static void main(String[] args) {
      // 方式1 new关键字
      Person person1 = new Person("abc", 10);
      System.out.println("person1 name: " + person1.getName() + ", age: " + person1.getAge());

      // 方式2 反射   即使构造方法是私有的也可以通过反射创建
      Class<?> clazz = Person.class;

      try {
         Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
         Object person2 = constructor.newInstance("abc", 10);
         if (person2 instanceof Person) {
            System.out.println("person2 name: " + ((Person) person2).getName() + ", age: " + ((Person) person2).getAge());
         }
      } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
         e.printStackTrace();
      }

      // 方式3 clone   类需要实现Cloneable接口,覆写Object.clone()方法来改变可见性
      Person personRaw = new Person("abc", 10);
      try {
         Person person3 = (Person) personRaw.clone();
         System.out.println("person3 name: " + person3.getName() + ", age: " + person3.getAge());
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }

      // 方式3 反序列化   类需要实现Serializable接口,反序列化不走构造方法
      Person personOutput = new Person("abc", 10);
      try {
          // 序列化
         ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("person.txt"));
         outputStream.writeObject(personOutput);
         // 反序列化
         ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("person.txt"));
         Person person4 = (Person) inputStream.readObject();
         System.out.println("person4 name: " + person4.getName() + ", age: " + person4.getAge());
      } catch (IOException | ClassNotFoundException e) {
         e.printStackTrace();
      }
   }
}

输出

person1 name: abc, age: 10
person2 name: abc, age: 10
person3 name: abc, age: 10
person4 name: abc, age: 10

参考

Java创建对象的几种方式