-须知:本文请结合类的加载机制一文中Java内存模型阅读。
1.前言
Java是一门面向对象的语言,所谓万物皆对象,对Java程序员来说,对象Object可谓是必不可少的,当然不管是哪一个对象!
2.对象的创建
Java对象的创建主要有以下四种方式:
- new关键字;
- 利用反射机制;
- clone()方法;
- 反序列化。
下面具体看代码分析:
//对象信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public class EvilDog {
/**
* 姓名
*/
private String name;
/**
* 出生日期
*/
private String birthday;
/**
* 年龄
*/
private Integer age;
}
2.1 new关键字
创建对象:
public class ObjectUtil {
public static void main(String[] args) {
//无参构造
EvilDog evilDog = new EvilDog();
//有参构造
EvilDog evilDog1 = new EvilDog("张三","1991-01-01",25);
System.out.println(evilDog);
System.out.println(evilDog1);
}
}
输出结果:
EvilDog(name=null, birthday=null, age=null)
EvilDog(name=张三, birthday=1991-01-01, age=25)
2.2 利用反射机制
创建对象:
public class ObjectUtil {
public static void main(String[] args) {
//反射
try {
//不带参数 Class 对象的 newInstance 方法
EvilDog evilDog2 = (EvilDog)Class.forName("com.yolo.common.utils.EvilDog").newInstance();
// Constructor的 newInstance方法
EvilDog evilDog3 = (EvilDog)Class.forName("com.yolo.common.utils.EvilDog").getConstructor().newInstance();
System.out.println(evilDog2);
System.out.println(evilDog3);
}catch (Exception e){
e.printStackTrace();
}
}
}
输出结果:
EvilDog(name=null, birthday=null, age=null)
EvilDog(name=null, birthday=null, age=null)
2.3 clone()方法
要使用clone()方法,首先需实现Cloneable接口并实现其定义的clone方法,需要在EvilDog中实现。
创建对象:
public class ObjectUtil {
public static void main(String[] args) {
try {
EvilDog evilDog3 = new EvilDog("李四","1995-02-26",25);
EvilDog evilDog4 = (EvilDog)evilDog3.clone();
System.out.println(evilDog4);
}catch (Exception e){
e.printStackTrace();
}
}
}
输出结果:
EvilDog(name=李四, birthday=1995-02-26, age=25)
2.4 反序列化
使用序列化时,要实现实现Serializable接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中,代码如下。
创建对象:
public class ObjectUtil {
public static void main(String[] args) {
EvilDog evilDog5 = new EvilDog("王五","1995-02-26",25);
//保存信息在本地文件中
save(evilDog5);
//从本地文件读取数据
EvilDog evilDog6 = read();
System.out.println(evilDog6);
}
private static EvilDog read() {
EvilDog evilDog = null;
File file = new File("D:/evil-dog.out");
InputStream is = null;
ObjectInputStream ois = null;
try {
is = new FileInputStream(file);
ois = new ObjectInputStream(is);
evilDog = (EvilDog) ois.readObject();
}catch (Exception e){
e.printStackTrace();
}finally {
if(ois != null){
try {
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return evilDog;
}
private static void save(EvilDog evilDog5) {
//把信息保存在本地文件中
File file = new File("D:/evil-dog.out");
OutputStream os = null;
ObjectOutputStream oos = null;
try {
os = new FileOutputStream(file);
oos = new ObjectOutputStream(os);
oos.writeObject(evilDog5);
}catch (Exception e){
e.printStackTrace();
}finally {
if(oos != null) {
try {
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if(os != null) {
try {
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
输出结果:
EvilDog(name=王五, birthday=1995-02-26, age=25)