创建对象的 6 种方式

假设有个女朋友类:

@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend {private String name;}

注解使用的是 Lombok 框架注解,方便快速开发,不熟悉的阅读这篇文章:

推荐一款代码神器,代码量至少省一半!

方法1:new 一个对象

没对象就 new 一个吧,没错,使用 new 关键字,这也是 Java 创建对象最简单直接的方式了。

示例代码:

/*** new一个对象* @author: 栈长* @from: 公众号Java技术栈*/
@Test
public void girlFriend1() {GirlFriend girlFriend = new GirlFriend("new一个对象");System.out.println(girlFriend);
}

输出结果:

GirlFriend(name=new一个对象)

方法2:克隆一个对象

朋友有女朋友,你没有,如果可以,把别人的女朋友克隆一个吧?

让女朋友类先实现 Cloneable 接口,并且实现其 clone() 方法:

/*** 女朋友类* @author: 栈长* @from: 公众号Java技术栈*/
@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend implements Cloneable {private String name;@Overrideprotected 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:类派发一个对象(反射)

直接使用女朋友类派发一个吧:

/*** 类派发一个对象* @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面试库小程序在线刷题。

方法4:动态加载一个对象(反射)

知道女朋友类在哪里(类全路径),但却没有被加载,那就反射一个对象吧:

/*** 反射一个对象* @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=反射一个对象)

方法5:构造一个对象(反射)

知道女朋友类的构造,就可以调用构造器构造一个对象:

/*** 构造一个对象* @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=构造一个对象)

这里也可以同时结合类全路径构造一个对象。

方法6:反序列化一个对象

这个和克隆的作用类似,假如以前序列化(保存)了一个女朋友在磁盘上,现在就可以反序列化出来。

Java 序列化基础就不介绍了,栈长之前分享不少,我也都整理好了,可以在公众号Java技术栈菜单中阅读。

首先让女朋友可序列化,实现 Serializable 接口:

/*** 女朋友类* @author: 栈长* @from: 公众号Java技术栈*/
@Data
@NoArgsConstructor
@AllArgsConstructor
class GirlFriend implements Cloneable, Serializable {private static final long serialVersionUID = 1L;private String name;@Overrideprotected 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 创建对象的 6 种方式,总有一种适合你。。

Java 创建对象的 6 种方式,总有一种适合你相关推荐

  1. 把 Console 部署成 Windows 服务,四种方式总有一款适合你!

    一:背景 1. 讲故事 上周有一个项目交付,因为是医院级项目需要在客户的局域网独立部署.程序:netcore 2.0,操作系统:windows server 2012,坑爹的事情就来了, netcor ...

  2. Java面向对象相对于面向过程的优势?以及java创建对象的4中方式?

    文章目录 面向对象相对于面向过程的优势? java创建对象的4中方式? 面向对象相对于面向过程的优势? 答: 面向过程: 面向过程是一种自顶向下的编程. 面向过程优点:性能比面向对象高,因为类调用时需 ...

  3. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  4. 怎么把线稿提取出来_PS教程:提取线稿如此简单?三种方法总有一种适合你

    原标题:PS教程:提取线稿如此简单?三种方法总有一种适合你 部落窝教育,每天学习PS独家原创视频 在PS出现之前,如果我们喜欢某个动漫角色大概只能通过临摹的方式将人物线条勾勒出来,但PS的出现将提取线 ...

  5. linux 最快的,五种方式装Linux哪种最快

    mask宇 于 2012-05-20 00:46:44发表: 个人觉得硬盘的传输速率更快 所以悬着硬盘. Hoo_h 于 2012-05-20 00:18:54发表: 想尝试硬盘安装,用过光盘和U盘 ...

  6. 基岩版刷铁傀儡机制和Java_我的世界:Java版1.14获得铁傀儡的四种方式,第三种千万别忘记...

    在沙盒游戏我的世界中,铁傀儡是守护村庄和村民的生物,它们的攻击力很强,即使是玩家们也不敢轻易地惹怒它们!当玩家们进入Jaa版1.14生存模式之时,拥有四种获得铁傀儡的方式,接下来就为玩家们介绍一下!第 ...

  7. 计算机启动的四种方式,电脑有几种开机方式

    如果有人问你,你的电脑怎么开机?回答不外乎是:"直接按电脑机箱上的电源开关按钮不就得了".这当然是最简单的方法.不过,其实打开电脑还有许多方法,下面笔者就给大家介绍四种神奇的电脑开 ...

  8. 【推荐收藏 】Python写入MySQL数据库的三种方式,最后一种方式方便又高效

    大家好,Python 读取数据自动写入 MySQL 数据库,这个需求在工作中是非常普遍的,主要涉及到 python 操作数据库,读写更新等,数据库可能是 mongodb. es,他们的处理思路都是相似 ...

  9. java创建对象时分配内存方式,是堆上分配还是栈上分配?

    创建对象的内存是分配在堆上还是栈上面?大部分童鞋的回答是这样的:"肯定分配在堆内存的嘛,栈内存是属于子线程和基本数据类型专用的内存空间,怎么会分配到栈上面呢?",这个回答嘛,也对, ...

  10. java实现aop的几种方式_SpringAOP 的三种实现方式

    引入aop相关的jar包 org.springframework spring-aop 5.1.12.RELEASE org.aspectj aspectjweaver 1.9.4 TransferS ...

最新文章

  1. JVM学习1:JVM和Java体系结构
  2. 多个旅游网站被挂马 五一假期外出旅游应小心
  3. android多线程下载原理,安卓多线程断点续传下载功能(靠谱第三方组件,原理demo)...
  4. 配置文件configSections节点使用实例      。
  5. linux 虚拟机挂载本地,CentOS 在VMWare中挂载本地yum源
  6. 北京学python 价格怎么样_北京学习Python需要多少钱
  7. 前端学习(1779):前端调试之cache原理和查看
  8. Android输入事件InputReader和InputDispatcher分析
  9. OC可变数组的常用操作
  10. vue使用element-ui的el-input监听不了回车事件解决
  11. pytorch冻结模型
  12. 使用HDTunePro检测硬盘快速上手教程
  13. 使用hightopo完成基本图元旋转和闪烁
  14. 视频教程-C语言-从汇编角度理解C语言的本质-C/C++
  15. Mapbox相机动画整理(1)示例解析
  16. android chrome 夜间,【科技知识】(暗黑模式)Android安卓版的Chrome谷歌浏览器这样设置暗黑模式(夜间模式)...
  17. delegation模式
  18. Selenium 循环删除页面元素
  19. JVM进阶(十二)——JAVA 可视化分析工具
  20. 计算机网络之无线局域网

热门文章

  1. 用stream流来遍历处理list,筛选出符合条件的list,并对其中某些值求和
  2. 30万微博评论看翟天临与毕业生的爱恨情仇
  3. 安卓和苹果按钮颜色不同解决方案
  4. 电脑QQ表情收藏的测试用例
  5. 定期清除浏览器缓存 预防专偷网络账号的恶意软件
  6. stm32控制共阳数码管以及共阴数码管
  7. Java读取office-word(doc、docx)里面表格中的数据
  8. 三角形和矩形傅里叶变换_方波信号傅里叶变换.ppt
  9. mw313r拨号服务器无响应,水星mw313r路由器手机怎么设置? | 192路由网
  10. 老年人腰扭伤如何治疗