Java基础面试题-3
12、Java中创建对象有几种方式?
(1)new,使⽤ new 关键字;
(2)反射,使⽤ Class 类的 newInstance ⽅法,该⽅法调⽤⽆参的构造器创建对象 ;
(3)克隆,使⽤ clone() ⽅法;
(4)反序列化,⽐如调⽤ ObjectInputStream 类的 readObject() ⽅法。
实验类:
package object;
import java.io.Serializable;
/**
* 带实例化的类
*/
//为了支持反序列化【Serializable】
public class TestClass implements Serializable {
private static final long serialVersionUID = 1L;
public void hello() {
System.out.println("Hello world!");
}
}
(1)使用new关键字创建对象应该是最常见的一种方式,但我们应该知道,使用new创建对象会增加耦合度。无论使用什么框架,都要减少new的使用以降低耦合度【需要构造器】。
package object;
/**
* 使用new关键字创建对象
*/
public class NewClass {
public static void main(String[] args) {
//new关键字实例化对象
TestClass say = new TestClass();
say.hello();
}
}
(2)有两种反射方法:构造器反射;类反射【需要构造器】。
package object;
/**
* 反射创建对象,使用Class类中的newInstance方法
*/
public class NewInstance_1 {
public static void main(String[] args) throws Exception {
//获取类对象
Class<?> reflectClass = Class.forName("object.TestClass");
//使用Class类中的newInstance方法
TestClass say = (TestClass)reflectClass.newInstance();
say.hello();
}
}
package object;
import java.lang.reflect.Constructor;
/**
* 反射创建对象,使用构造方法的newInstance方法
*/
public class NewInstance_2 {
public static void main(String[] args) throws Exception {
//获取类对象
Class<?> reflectClass = Class.forName("object.TestClass");
//获取构造器
Constructor<?> constructor = reflectClass.getConstructor();
//使用构造方法的newInstance方法
TestClass say = (TestClass)constructor.newInstance();
say.hello();
}
}
(3)clone时,需要已经有一个分配了内存的源对象,创建新对象时,首先应该分配一个和源对象一样大的内存空间。要调用clone方法需要实现Cloneable接口,由于clone方法是protected的,需要注意【不需要构造器】。
package object;
/**
* 使用clone实例化对象
*/
public class Clone implements Cloneable {
public void hello() {
System.out.println("Hello world!");
}
public static void main(String[] args) throws Exception {
Clone say = new Clone();
//使用clone实例化对象
Clone say2 = (Clone)say.clone();
say2.hello();
}
}
(4)使用序列化时,要在类TestClass实现Serializable接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。 JSON 数据跟 Java 对象之间的转换,即序列化和反序列化【不需要构造器】。
package object;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* 使用反序列化创建对象
*/
public class Serialize {
@SuppressWarnings("resource")//SuppressWarnings这个批注可以取消一些特定代码段中的警告
public static void main(String[] args) throws Exception {
TestClass say = new TestClass();
//准备一个文件用于存储对象的信息
File f = new File("hello.obj");
//输出流
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
//输入流
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
//序列化对象,写入到磁盘中
oos.writeObject(say);
//反序列化对象,读出到对象中
TestClass newSay = (TestClass)ois.readObject();
//测试方法
newSay.hello();
}
}