1.使用new创建对象
使用new关键字创建对象应该是最常见的一种方式,但我们应该知道,使用new创建对象会增加耦合度。无论使用什么框架,都要减少new的使用以降低耦合度。
1 packageyunche.test;2
3 public classHello {4 public voidsayWorld() {5 System.out.println("Hello world!");6 }7
8 }
packageyunche.test;public classNewClass
{public static voidmain(String[] args)
{
Hello h= newHello();
h.sayWorld();
}
}
2.使用反射的机制创建对象
使用Class类的newInstance方法
Hello类的代码不变,NewClass类的代码如下:
packageyunche.test;public classNewClass
{public static voidmain(String[] args)
{try{
Class heroClass= Class.forName("yunche.test.Hello");
Hello h=(Hello) heroClass.newInstance();
h.sayWorld();
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}catch(IllegalAccessException e)
{
e.printStackTrace();
}catch(InstantiationException e)
{
e.printStackTrace();
}
}
}
使用Constructor类的newInstance方法
packageyunche.test;importjava.lang.reflect.Constructor;importjava.lang.reflect.InvocationTargetException;public classNewClass
{public static voidmain(String[] args)
{try{//获取类对象
Class heroClass = Class.forName("yunche.test.Hello");//获取构造器
Constructor constructor =heroClass.getConstructor();
Hello h=(Hello) constructor.newInstance();
h.sayWorld();
}catch(NoSuchMethodException e)
{
e.printStackTrace();
}catch(InvocationTargetException e)
{
e.printStackTrace();
}catch(IllegalAccessException e)
{
e.printStackTrace();
}catch(InstantiationException e)
{
e.printStackTrace();
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
3.采用clone
clone时,需要已经有一个分配了内存的源对象,创建新对象时,首先应该分配一个和源对象一样大的内存空间。
要调用clone方法需要实现Cloneable接口,由于clone方法是protected的,所以修改Hello类。
packageyunche.test;public class Hello implementsCloneable
{public voidsayWorld()
{
System.out.println("Hello world!");
}public static voidmain(String[] args)
{
Hello h1= newHello();try{
Hello h2=(Hello)h1.clone();
h2.sayWorld();
}catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
}
}
4.采用序列化机制
使用序列化时,要首先实现Serializable接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。
packageyunche.test;import java.io.*;public classSerialize
{public static voidmain(String[] args)
{
Hello h= newHello();//准备一个文件用于存储该对象的信息
File f = new File("hello.obj");try(FileOutputStream fos = newFileOutputStream(f);
ObjectOutputStream oos= newObjectOutputStream(fos);
FileInputStream fis= newFileInputStream(f);
ObjectInputStream ois= newObjectInputStream(fis)
)
{//序列化对象,写入到磁盘中
oos.writeObject(h);//反序列化对象
Hello newHello =(Hello)ois.readObject();//测试方法
newHello.sayWorld();
}catch(FileNotFoundException e)
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}catch(ClassNotFoundException e)
{
e.printStackTrace();
}
}
}