java中4中创建对象的方式详解

第一种:new,这个很简单不多说。

第二种:利用clone方法,如下步骤

①  实现clone的类首先实现Cloneble接口,Cloneable接口实质上是一个标识接口,没有任何方法。

② 重写Object中的clone方法。

③ 在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或者简介调用Object类中的clone方法。

如下示例代码:

package easy;

public class Obj implements Cloneable{
	private int a = 0;
	public Obj (){
		System.out.println("construct Obj");
	}
	public int getA() {
		return a;
	}
	public void setA(int a) {
		this.a = a;
	}
	public void changeA(){
		this.a = 1;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		Object o = null;
		try {
			o = (Object)super.clone();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return o;
	}

}
测试代码及输出:

package easy;

public class Test {
	public static void main(String[] args) {
		try {
			Obj a = new Obj();
			Obj b = (Obj) a.clone();
			b.changeA();
			System.out.println(a.getA());
			System.out.println(b.getA());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

第三种,利用反射:

如下示例代码:

package easy;

class Person{
	String name = "Jack";
	public Person(){
		System.out.println("construct Person");
	}
	@Override
	public String toString() {
		return name;
	}
}

public class Test {
	public static void main(String[] args) {
		Class clazz;
		try {
			clazz = Class.forName("easy.Person");
			Person p = (Person) clazz.newInstance();
			System.out.println(p);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


第四种:通过反序列化来创建对象。

示例代码如下:

package easy;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class People implements Serializable{
	private String name;
	public People(){
		this.name = "6点A君";
		System.out.println("construct people");
	}
	@Override
	public String toString() {
		return this.name;
	}
	
	public static void main(String[] args) {
		People p = new People();
		System.out.println(p);
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		try {
			FileOutputStream fos = new FileOutputStream("test.out");
			oos = new ObjectOutputStream(fos);
			oos.writeObject(p);
			oos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		People p1;
		try {
			FileInputStream fis = new FileInputStream("test.out");
			ois = new ObjectInputStream(fis);
			p1 = (People)ois.readObject();
			System.out.println(p1);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值