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();
		
	}
}
posted @ 2021-10-11 18:59  栀寒烈火  阅读(38)  评论(0)    收藏  举报