再见,单身狗!Java 创建对象的六种方式,总有一种适合你......

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

背景

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

今天公众号本来有个广告推广的,被临时鸽了,唉。。这个情人节有点伤,还好对象没鸽。。

情人节写点什么好呢?!

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

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

2022,一定脱单,再见单身狗!

创建对象的 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;

@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:类派发一个对象

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

/**
* 类派发一个对象
* @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;

@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​

责任编辑:武晓燕 来源: Java技术栈
相关推荐

2022-08-18 09:38:02

Spring跨域

2009-02-26 10:29:00

2020-07-10 10:48:51

编程语言JavaPython

2015-01-26 15:58:02

MDM应用指南

2010-02-01 08:33:46

2021-12-31 16:16:04

JavaScript数组代码

2020-12-10 09:48:15

鸿蒙Linux开发

2019-11-13 08:52:19

Linux监控日志

2017-06-26 10:35:58

前端JavaScript继承方式

2022-03-28 20:57:31

私有属性class属性和方法

2023-10-30 11:53:37

继承JS父类

2019-05-16 13:00:18

异步编程JavaScript回调函数

2018-08-03 16:40:06

前端前端框架微服务

2021-12-15 23:10:34

JS Debugger 前端开发

2009-02-11 09:46:00

ASON网络演进

2020-07-31 11:12:39

安全威胁网络攻击网络安全

2022-01-14 10:34:50

黑客隐藏踪迹网络安全

2020-04-27 09:00:00

双因素认证身份认证生物识别

2022-03-23 12:55:50

农业物联网

2017-07-20 08:47:19

网页加载时间移动开发IT
点赞
收藏

51CTO技术栈公众号