当前位置:   article > 正文

Java 创建对象的 6 种方式_java创建对象

java创建对象

背景

又到一年一度的情人节了,祝各位程序员有情人终成眷属!

有座的各位肯定还有不少单身 dog 吧?

没关系,本文教你创建对象的 6 种方式,从低端到高端,各种创建方式,总有一个适合你,没有对象的自己生成一个吧!

创建对象的 6 种方式

假设有个女朋友类:

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. class GirlFriend {
  5.  private String name;
  6. }

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

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

方法1:new 一个对象

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

示例代码:

  1. /**
  2.  * new一个对象
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Test
  7. public void girlFriend1() {
  8.     GirlFriend girlFriend = new GirlFriend("new一个对象");
  9.     System.out.println(girlFriend);
  10. }

输出结果:

GirlFriend(name=new一个对象)

方法2:克隆一个对象

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

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

  1. /**
  2.  * 女朋友类
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Data
  7. @NoArgsConstructor
  8. @AllArgsConstructor
  9. class GirlFriend implements Cloneable {
  10.  private String name;
  11.     @Override
  12.     protected Object clone() throws CloneNotSupportedException {
  13.         return super.clone();
  14.     }
  15.     
  16. }

注意:这里演示默认使用的是浅拷贝,即只克隆基本类型的字段,引用类型的需要再重写 clone() 方法手动赋下引用字段的值。

现在克隆一个对象,示例代码:

  1. @Test
  2. public void girlFriend2() throws CloneNotSupportedException {
  3.     GirlFriend girlFriend1 = new GirlFriend("克隆一个对象");
  4.     GirlFriend girlFriend2 = (GirlFriend) girlFriend1.clone();
  5.     System.out.println(girlFriend2);
  6. }

输出结果:

GirlFriend(name=克隆一个对象)

使用克隆的好处就是可以快速创建一个和原对象值一样的对象,对象的字段值一样,但是两个不同的引用。

方法3:类派发一个对象(反射)

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

  1. /**
  2.  * 类派发一个对象
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Test
  7. public void girlFriend3() throws InstantiationException, IllegalAccessException {
  8.     GirlFriend girlFriend = GirlFriend.class.newInstance();
  9.     girlFriend.setName("类派发一个对象");
  10.     System.out.println(girlFriend);
  11. }

输出结果:

GirlFriend(name=类派发一个对象)

另外,最新最全的 Java 面试题整理好了,微信搜索Java面试库小程序在线刷题。

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

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

  1. /**
  2.  * 反射一个对象
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Test
  7. public void girlFriend4() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
  8.     GirlFriend girlFriend = (GirlFriend) Class.forName("cn.javastack.test.jdk.core.GirlFriend").newInstance();
  9.     girlFriend.setName("反射一个对象");
  10.     System.out.println(girlFriend);
  11. }

输出结果:

GirlFriend(name=反射一个对象)

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

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

  1. /**
  2.  * 构造一个对象
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Test
  7. public void girlFriend5() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
  8.     GirlFriend girlFriend = GirlFriend.class.getConstructor().newInstance();
  9.     girlFriend.setName("构造一个对象");
  10.     System.out.println(girlFriend);
  11. }

输出结果:

GirlFriend(name=构造一个对象)

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

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

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

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

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

  1. /**
  2.  * 女朋友类
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Data
  7. @NoArgsConstructor
  8. @AllArgsConstructor
  9. class GirlFriend implements Cloneable, Serializable {
  10.     private static final long serialVersionUID = 1L;
  11.     
  12.     private String name;
  13.     @Override
  14.     protected Object clone() throws CloneNotSupportedException {
  15.         return super.clone();
  16.     }
  17. }

序列化/反序列化对象示例代码:

  1. /**
  2.  * 反序列化一个对象
  3.  * @author: 栈长
  4.  * @from: 公众号Java技术栈
  5.  */
  6. @Test
  7. public void girlFriend6() throws IOException, ClassNotFoundException {
  8.     GirlFriend girlFriend1 = new GirlFriend("反序列化一个对象");
  9.     // 序列化一个女朋友
  10.     ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("gf.obj"));
  11.     objectOutputStream.writeObject(girlFriend1);
  12.     objectOutputStream.close();
  13.     // 反序列化出来
  14.     ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("gf.obj"));
  15.     GirlFriend girlFriend2 = (GirlFriend) objectInputStream.readObject();
  16.     objectInputStream.close();
  17.     System.out.println(girlFriend2);
  18. }

输出结果:

GirlFriend(name=反序列化一个对象)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/813271
推荐阅读
相关标签
  

闽ICP备14008679号