点击上方蓝字关注我们
Java 创建对象的方式有哪些?
(1)使用 new 关键字;
(2)反射,使用 java.lang.Class 类的 newInstance 方法。
这种方式会调用无参的构造函数来创建对象,有两种实现方式。
//方式一,使用全路径包名User user = (User)Class.forName("com.xian.view.demo.User").newInstance();//方法二,使用class类User user = User.class.newInstance();
(3)反射,使用 java.lang.reflect.Constructor 类的 newInstance 方法。
Constructor constructor = User.class.getConstructor();User user = constructor.newInstance();
(4)使用 clone 方法。
public class User implements Cloneable{/** 构造方法 */public User(Integer age){this.age = age;}public Integer getAge(){return age;}private Integer age;// 重写(Overriding)Object的clone方法@Overrideprotected User clone() throws CloneNotSupportedException{return (User) super.clone();}public static void main(String[] args) throws Exception{User person = new User(new Integer(200));User clone = person.clone();System.out.println("person == clone, result = " + (person == clone)); // false,拷贝都是生成新对象System.out.println("person.age == clone.age, result = " + (person.getAge() == clone.getAge())); // true,浅拷贝的成员变量引用仍然指向原对象的变量引用}}
首先需要明确两个概念:浅拷贝和深拷贝。
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,对拷贝后对象的引用仍然指向原来的对象。
深拷贝:不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。
其他需要注意的是,clone () 是 Object 的 native 方法,但如果要标注某个类是可以调用 clone (),该类需要实现空接口 Cloneable。
(5)使用反序列化。
为了序列化 / 反序列化一个对象,需要该类实现空接口 Serializable。
序列化时首先创建一个输出流对象 oos, 使用 oos 的 writeObject () 方法将 p 对象写入 oos 对象中去。使用反序列化创建对象时,首先创建一个输入流对象 ois,使用输入流对象 ois 的 readObject () 方法将序列化存入的对象读出,重新创建一个对象。
分析:
前面三种创建方式比较常见,其中第二三种经常见于框架代码,用于 bean 注入等。第四五种本质是复制,是不需要调用构造器的(见下表),第五种在 rpc 调用中使用比较多,第四种使用比较少一些。
创建对象方式
是否调用了构造器
new 关键字
是
Class.newInstance
是
Constructor.newInstance
是
Clone
否
反序列化
否
扩展题目:
java.lang.Class 类的 newInstance 方法和 java.lang.reflect.Constructor 类的 newInstance 方法有什么区别? 后期文章会更新解答!
长按识别二维
码获取更多精
彩内容
JAVA开发者