多平台统一管理软件接口,如何实现多平台统一管理软件接口
275
2022-08-28
Java中创建对象的6种方式
目录背景创建对象的 6 种方式方法1:new 一个对象方法2:克隆一个对象方法3:类派发一个对象(反射)方法4:动态加载一个对象(反射)方法5:构造一个对象(反射)方法6:反序列化一个对象总结
背景
本文教你创建对象的 6 种方式,从低端到高端,各种创建方式,总有一个适合你,没有对象的自己生成一个吧!
创建对象的 6 种方式
假设有个女朋友类:
@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend {
private String name;
}
注解使用的是 Lombok 框架注解,方便快速开发
方法1:new 一个对象
没对象就 new 一个吧,没错,使用 new 关键字,这也是 java 创建对象最简单直接的方式了。
示例代码:
@Test
public void girlFriend1() {
GirlFriend girlFriend = new GirlFriend("new一个对象");
System.out.println(girlFriend);
}
输出结果:
GirlFriend(name=new一个对象)
方法2:克隆一个对象
朋友有女朋友,你没有,如果可以,把别人的女朋友克隆一个吧?
让女朋友类先实现 Cloneable 接口,并且实现其 clone() 方法:
@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend implements Cloneable {
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
注意:这里演示默认使用的是浅拷贝,即只克隆基本类型的字段,引用类型的需要再重写 clone() 方法手动赋下引用字段的值。
现在克隆一个对象,示例代码:
@Test
public void girlFriend2() throws CloneNotSupportedException {
GirlFriend girlFriend1 = new GirlFriend("克隆一个对象");
GirlFriend girlFriend2 = (GirlFriend) girlFriend1.clone();
System.out.println(girlFriend2);
}
输出结果:
GirlFriend(name=克隆一个对象)
使用克隆的好处就是可以快速创建一个和原对象值一样的对象,对象的字段值一样,但是两个不同的引用。
方法3:类派发一个对象(反射)
直接使用女朋友类派发一个吧:
@Test
public void girlFriend3() throws InstantiationException, IllegalAccessException {
GirlFriend girlFriend = GirlFriend.class.newInstance();
girlFriend.setNhttp://ame("类派发一个对象");
System.out.println(girlFriend);
}
输出结果:
GirlFriend(name=类派发一个对象)
方法4:动态加载一个对象(反射)
知道女朋友类在哪里(类全路径),但却没有被加载,那就反射一个对象吧:
@Test
public void girlFriend4() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
GirlFriend girlFriend = (GirlFriend) Class.forName("cn.javastack.test.jdk.core.GirlFriend").newInstance();
girlFriend.setName("反射一个对象");
System.out.println(girlFriend);
}
输出结果:
GirlFriend(name=反射一个对象)
方法5:构造一个对象(反射)
知道女朋友类的构造,就可以调用构造器构造一个对象:
@Test
public void girlFriend5() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
GirlFriend girlFriend = GirlFriend.class.getConstructor().newInstance();
girlFriend.setName("构造一个对象");
System.out.println(girlFriend);
}
输出结果:
GirlFriend(name=构造一个对象)
这里也可以同时结合类全路径构造一个对象。
方法6:反序列化一个对象
这个和克隆的作用类似,假如以前序列化(保存)了一个女朋友在磁盘上,现在就可以反序列化出来。
首先让女朋友可序列化,实现 Serializable 接口:
@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
序列化/反序列化对象示例代码:http://
@Test
public void girlFriend6() throws IOException, ClassNotFoundException {
GirlFriend girlFriend1 = new GirlFriend("反序列化一个对象");
// 序列化一个女朋友
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("gf.obj"));
objectOutputStream.writeObject(girlFriend1);
objectOutputStream.close();
// 反序列化出来
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("gf.obj"));
GirlFriend girlFriend2 = (GirlFriend) objectInputStream.readObject();
objectInputStream.close();
System.out.println(girlFriend2);
}
输出结果:
GirlFriend(name=反序列化一个对象)
总结
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~