1.使用new創建對象
使用new關鍵字創建對象應該是最常見的一種方式,但我們應該知道,使用new創建對象會增加耦合度。無論使用什么框架,都要減少new的使用以降低耦合度。
package yunche.test; /** * @ClassName: Hello * @Description: 待創建的類 * @author: yunche * @date: 2018/08/24 */ public class Hello { public void sayWorld() { System.out.println("Hello world!"); } }
package yunche.test; /** * @ClassName: NewClass * @Description: 使用new關鍵字創建對象 * @author: yunche * @date: 2018/08/24 */ public class NewClass { public static void main(String[] args) { Hello h = new Hello(); h.sayWorld(); } }
2.使用反射的機制創建對象
使用Class類的newInstance方法
Hello類的代碼不變,NewClass類的代碼如下:
package yunche.test; /** * @ClassName: NewClass * @Description: 使用Class類的newInstance方法 * @author: yunche * @date: 2018/08/24 */ public class NewClass { public static void main(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方法
package yunche.test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * @ClassName: NewClass * @Description: 使用Constructor類的newInstance方法 * @author: yunche * @date: 2018/08/24 */ public class NewClass { public static void main(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類。
package yunche.test; /** * @ClassName: Hello * @Description: 待創建的類 * @author: yunche * @date: 2018/08/24 */ public class Hello implements Cloneable { public void sayWorld() { System.out.println("Hello world!"); } public static void main(String[] args) { Hello h1 = new Hello(); try { Hello h2 = (Hello)h1.clone(); h2.sayWorld(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }
4.采用序列化機制
使用序列化時,要實現實現Serializable接口,將一個對象序列化到磁盤上,而采用反序列化可以將磁盤上的對象信息轉化到內存中。
package yunche.test; import java.io.*; /** * @ClassName: Serialize * @Description: 序列化與反序列化對象 * @author: yunche * @date: 2018/08/24 */ public class Serialize { public static void main(String[] args) { Hello h = new Hello(); //准備一個文件用於存儲該對象的信息 File f = new File("hello.obj"); try(FileOutputStream fos = new FileOutputStream(f); ObjectOutputStream oos = new ObjectOutputStream(fos); FileInputStream fis = new FileInputStream(f); ObjectInputStream ois = new ObjectInputStream(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(); } } }