Java中創建對象的幾種方式
1. 使用new關鍵字
這是最直接、最常見的創建對象的方式。通過new關鍵字,Java會調用類的構造函數(Constructor)來初始化新創建的對象。
ClassName obj = new ClassName();
2. 使用clone()方法
如果類實現了Cloneable接口并覆蓋了Object類的clone()方法,那么可以通過調用對象的clone()方法來創建該對象的淺拷貝(Shallow Copy)。
補充:深拷貝和淺拷貝的區別
淺拷貝:創建一個新對象,這個對象具有與原對象相同的字段和值。但是,如果對象的某些字段是引用類型(如對象或數組),那么淺拷貝只會復制這些引用,而不是引用指向的實際對象。
深拷貝:創建一個新對象,并遞歸地復制對象內的所有引用類型。這意味著新對象和原對象不再共享任何數據,即使數據是引用類型。深拷貝會創建一個完全獨立的副本,包括所有層次上的引用類型。
public class Main {public static class Person implements Cloneable {// 必須覆蓋clone方法@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}}public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person();Person clonePerson = (Person)person.clone();}
}
3. 反射(Reflection)
反射允許程序在運行時檢查和修改其結構和行為,包括創建對象。這通常用于框架或需要動態加載類的場景。
public class TestReflection {public static class Person {public String name;public int age;public Person(String name, int age){this.name = name;this.age = age;}@Overridepublic String toString() {System.out.println("name: " + name + ", age: " + age);return null;}}public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Constructor<Person> constructor = Person.class.getConstructor(String.class, int.class);Person obj = constructor.newInstance("yjh",18);obj.toString();}
}
4. 使用反序列化
public class TestSer {public static class Person implements Serializable {public String name;public int age;public Person(String name, int age){this.name = name;this.age = age;}@Overridepublic String toString() {System.out.println("name: " + name + ", age: " + age);return null;}}public static void main(String[] args) throws IOException, ClassNotFoundException {// 序列化Person order = new Person("YJH",18);ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Person.obj"));oos.writeObject(order);// 反序列化ObjectInputStream ois = new ObjectInputStream(new FileInputStream("Person.obj"));Person obj = (Person) ois.readObject();obj.toString();}
}
注意:其中反射和new會調用類的構造方法。