Java语言是一种面向对象的语言,对象是整个Java语言的“核心”,因而创建对象就显得极为重要。这里简单讨论一下创建对象的方法。
总结来说,有以下四种方式:
- new关键字创建
- Java反射的newInstance方法
- 使用Object的Clone犯法
- 反序列化
-
使用new关键字
- 这是最简单直接的方式,直接调用类提供的构造器创建
-
使用newInstance()方法
使用Java的反射特性来创建对象,步骤如下:- 获取需要创建对象的Class类
- 使用
Class
类的newInstance
方法可以调用无参的构造器来创建对象,如果是有参构造器,则需要使用Class
的forName
方法和Constructor
来进行对象的创建。
-
使用clone()方法
Object 类是所有类的直接或间接父类,Object 类中提供了 实例方法 clone(),在给定对象的基础上,创建一个完全相同的对象。- 将需要创建对象的类调用Cloneable接口
- 重写clone()方法
-
使用序列化
-
序列化:
- 想要序列化对象的类,实现 Serializable 接口。
- 使用文件输出流 FileOutputStream 创建存储序列化之后对象的文件。
- 使用对象输出流 ObjectOutputStream 的实例方法 writeObject(obj),将对象写入文件
-
反序列化:
- 使用文件输入流 FileInputStream 找到存储序列化对象的文件。
- 使用对象输入流 ObjectInputStream 的实例方法 readObject()。
- 判断类中是否存在,名为readResolve(),返回类型为 Object 的方法,若有读取这个对象;否则,反序列化文件中的对象流。
-
- 示例代码:
Student类
package basic;
import java.io.Serializable;
/**
* @author: Mr.liu
* @pacckageName: basic
* @Date: 2019/3/1 0001
* @Time: 9:16
*/
public class Student implements Cloneable,Serializable {
private String name;
public Student(String name){
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Test:
package basic;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @author: Mr.liu
* @pacckageName: basic
* @Date: 2019/3/1 0001
* @Time: 9:19
*/
public class Test {
public static void main(String args[]) throws Exception {
//1.使用new关键字创建对象
Student s1 = new Student("tom");
System.out.println(s1.toString());
//2、通过java反射,获取Student类。
Class stuClass = Class.forName("basic.Student");
Constructor constructor = stuClass.getConstructor(String.class);
Student s2 = (Student) constructor.newInstance("李四");
System.out.println(s2);
//3.通过clone方式,必须实现cloneable接口
Student s3 = (Student) s1.clone();
System.out.println(s3);
//4、通过对象流,必须实现Serializable
String path = Test.class.getClassLoader().getResource("").getPath();
path= java.net.URLDecoder.decode(path, "utf-8");//由于是中文路径,需要对其转码
System.out.println(path);
String objectFilePath = path + "out.txt";
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(objectFilePath));
objectOutputStream.writeObject(s2);
ObjectInput objectInput = new ObjectInputStream(new FileInputStream(objectFilePath));
Student s4 = (Student) objectInput.readObject();
System.out.println(s4);
}
}