您的位置:首页 > 编程语言 > Java开发

Java 创建对象的四种方法

2014-01-13 18:32 411 查看
package com.lou.creation;

public class Client {

public static void main(String[] args) {
//1.使用new 方式创建对象
Worker worker1 = CreateInstanceUtil.createWorker();
Worker worker2 = CreateInstanceUtil.createWorker("Louis", 23);

//2.使用反射机制进行创建:
//a.使用反射机制,不带参数 Class 對象的 newInstance() 方法
Worker worker3 = CreateInstanceUtil.createWorker1();

//b.使用反射機制 , Constructor的 newInstance方法 不带参数
Worker worker4 = CreateInstanceUtil.createWorker2();

//c.使用反射机制 :带参数的构造函数创建新对象
Worker worker5 = CreateInstanceUtil.createWorker3("Louis", 23);

//3. 使用序列化和反序列化 进行创建,这个实际上是对象的复原
//将一个对象存入lou.dat文件内
CreateInstanceUtil.storeObject2File("lou.dat");
//将对象从文件取出
Worker worker6 = CreateInstanceUtil.createWorker4("lou.dat");

//4.利用对象的深层拷贝功能

Worker worker7 = CreateInstanceUtil.createWorker5(worker1);

}
}


 

 

package com.lou.creation;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class CreateInstanceUtil {

/*
* 方式1: 直接使用new的方式,不使用参数
*/
public static Worker createWorker() {
return new Worker();
}

/*
* 方式2: 使用new方式,带参数
*/
public static Worker createWorker(String name, int age) {
return new Worker(name, age);
}

/*
* 方式3: 使用反射机制,不带参数 Class 對象的 newInstance() 方法
*/

public static Worker createWorker1() {

Class clazz = null;
Worker worker = null;
try {
clazz = Class.forName("com.lou.creation.Worker");
worker = (Worker) clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

return worker;
}

/*
* 方式4: 使用反射機制 , Constructor的 newInstance方法
*/

public static Worker createWorker2() {
Worker worker = null;
try {
Class clazz = null;
clazz = Class.forName("com.lou.creation.Worker");

// 获取不带参数的构造器
Constructor constructor = clazz.getConstructor();
// 使用构造器创建对象
worker = (Worker) constructor.newInstance();

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

return worker;
}

/*
* 方式5: 使用反射机制 :带参数的构造函数创建新对象
*/
public static Worker createWorker3(String name, Integer age) {
Worker worker = null;
try {
Class clazz = null;
clazz = Class.forName("com.lou.creation.Worker");

// 获取不带参数的构造器
Constructor constructor = clazz.getConstructor(name.getClass(),
age.getClass());
// 使用构造器创建对象
worker = (Worker) constructor.newInstance(name, age);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return worker;
}

/*
* 方式6: 使用序列化和反序列化创建对象,这种方式其实是根据既有的对象进行复制,这个需要事先将可序列化的对象线存到文件里
*/
@SuppressWarnings("resource")
public static Worker createWorker4(String objectPath) {
ObjectInput input = null;
Worker worker = null;
try {
input = new ObjectInputStream(new FileInputStream(objectPath));
worker = (Worker) input.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return worker;
}

/*
* 将创建的对象存入到文件内
*/
public static void storeObject2File(String objectPath) {
Worker worker = new Worker();
ObjectOutputStream objectOutputStream;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(
objectPath));
objectOutputStream.writeObject(worker);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/*
* 方式7, 使用对象的 深复制进行复制,创建对象
*/
public static Worker createWorker5(Worker worker) {
return (Worker) worker.clone();
}

public static void main(String[] args) {

}

}


 

package com.lou.creation;

import java.io.Serializable;

public class Worker implements Cloneable,Serializable {

private static final long serialVersionUID = 1L;
private String name;
private int age;

public Worker()
{
this.name = "";
this.age = 0;
}

public Worker(String name,int age)
{
this.name = name;
this.age = age;
}

public void work()
{
System.out.println(name +"is working");
}

public Worker clone()
{
Worker worker = null;
try {
return (Worker) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return worker;
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: