又到一年一度的情人节了,祝各位程序员有情人终成眷属!
今天公众号本来有个广告推广的,被临时鸽了,唉。。这个情人节有点伤,还好对象没鸽。。
情人节写点什么好呢?!
有座的各位肯定还有不少单身 dog 吧?
没关系,栈长本文教你创建对象的 6 种方式,从低端到高端,各种创建方式,总有一个适合你,没有对象的自己生成一个吧!
2022,一定脱单,再见单身狗!
假设有个女朋友类:
@Data @NoArgsConstructor @AllArgsConstructor class GirlFriend { private String name; }
注解使用的是 Lombok 框架注解,方便快速开发,不熟悉的阅读这篇文章:
推荐一款代码神器,代码量至少省一半!
没对象就 new 一个吧,没错,使用 new 关键字,这也是 Java 创建对象最简单直接的方式了。
示例代码:
/** * new一个对象 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void girlFriend1() { GirlFriend girlFriend = new GirlFriend("new一个对象"); System.out.println(girlFriend); }
输出结果:
GirlFriend(name=new一个对象)
朋友有女朋友,你没有,如果可以,把别人的女朋友克隆一个吧?
让女朋友类先实现 Cloneable 接口,并且实现其 clone() 方法:
/** * 女朋友类 * @author: 栈长 * @from: 公众号Java技术栈 */ @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=克隆一个对象)
使用克隆的好处就是可以快速创建一个和原对象值一样的对象,对象的字段值一样,但是两个不同的引用。
直接使用女朋友类派发一个吧:
/** * 类派发一个对象 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void girlFriend3() throws InstantiationException, IllegalAccessException { GirlFriend girlFriend = GirlFriend.class.newInstance(); girlFriend.setName("类派发一个对象"); System.out.println(girlFriend); }
输出结果:
GirlFriend(name=类派发一个对象)
另外,最新最全的 Java 面试题整理好了,微信搜索Java面试库小程序在线刷题。
知道女朋友类在哪里(类全路径),但却没有被加载,那就反射一个对象吧:
/** * 反射一个对象 * @author: 栈长 * @from: 公众号Java技术栈 */ @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=反射一个对象)
知道女朋友类的构造,就可以调用构造器构造一个对象:
/** * 构造一个对象 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void girlFriend5() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { GirlFriend girlFriend = GirlFriend.class.getConstructor().newInstance(); girlFriend.setName("构造一个对象"); System.out.println(girlFriend); }
输出结果:
GirlFriend(name=构造一个对象)
这里也可以同时结合反射构造一个对象。
这个和克隆的作用类似,假如以前序列化(保存)了一个女朋友在磁盘上,现在就可以反序列化出来。
Java 序列化基础就不介绍了,栈长之前分享不少,我也都整理好了,可以在公众号Java技术栈菜单中阅读。
首先让女朋友可序列化,实现 Serializable 接口:
/** * 女朋友类 * @author: 栈长 * @from: 公众号Java技术栈 */ @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(); } }
序列化/反序列化对象示例代码:
/** * 反序列化一个对象 * @author: 栈长 * @from: 公众号Java技术栈 */ @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=反序列化一个对象)
本文完整示例代码已上传 Github:
https://github.com/javastacks/javastack
欢迎 Star 学习,后续会持续更新~
如果你不喜欢用代码为自己生成对象,你也可以试试这首 Java 表白诗:
写了一首 Java 表白诗,女朋友不愁了!
祝大家成功,不过对方仅限程序员,不然会看不懂的。
你还知道哪些创建对象的方式呢?欢迎留言讨论~!
好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,在公众号后台回复关键字 "面试" 进行刷题。
最后,觉得我的文章对你用收获的话,动动小手,给个在看、转发,原创不易,栈长需要你的鼓励。
版权声明: 本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.20w 程序员红包封面,快快领取。。。
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!