咱們常說,Java是一種面向對象的語言,於是在Java中幾乎全部的操做都離不開對象。而在Java語言中,最多見的建立對象的方法是經過對類構造器的調用,除此以外,其實還有下面幾種能夠建立對象的方法。java
1)經過反射機制來建立對象;this
class Person{ String name="Jack"; public Person(){ System.out.println("construct"); } public String toString(){return name;} } public class Test{ public static void main(String[] args){ Class classType; try{ classType=Class.forname("Person"); Person p = (Person)classType.newInstance(); System.out.println(p); }cathch(Exception e){ e.printStackTrace(); } } }
程序的運行結果爲:spa
constructcode
Jack對象
2)調用對象的clone方法,須要如下幾個步驟才能使用clone方法:blog
(1)實現clone的類首先須要繼承Cloneable接口實質上是一個標識接口,沒有任何的接口方法,這一點和序列化接口Serializable()很相似。繼承
(2)在類中重寫Object類的clone方法。接口
(3)在clone方法中調用super.clone()。不管clone類的繼承結構是什麼,super.clone()都會直接或間接的調用Java.long.Object類中的clone()方法。get
實例代碼以下:it
class Obj implement Cloneable{ private int aInt=0; public Obj(){ System.out.println("construct"); } public int getAint(){return aInt;} public void changeInt(){this.aInt=1; } public Object clone(){ Object o=null; try{ o=(Obj)super.clone(); }catch(CloneNotSuppertedException e){ e.printStackTrace(); } return 0; } } public class Test{ public static void main(String[] args){ Obj a = new Obj(); Obj b = (Obj)a.clone(); b.changeInt(); System.out.println("a:"+a.getAInt()); System.out.println("b:"+b.getAInt()); } }
程序的運行結果爲:
construct
a:0
b:1
從以上的程序運行能夠看出,在調用a.clone()方法時,系統建立了新的對象,可是沒有調用構造方法。
3)經過反序列化的方式建立對象,實例代碼以下:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Person implement Serilalizable{ private String name; public Person(){ this.name="lili"; System.out.println("Construct"); } public Stream toString(){return this.name;} public static void main(String args[]){ Person p = new People(); System.out.println(p); ObjectOutputStream oos=null; ObjectInputStream ois = null; try{ FileOutputStream fos =new FileOutputStream("perpke.out"); oos=new ObjectOutputStream(fos); oos.writeObject(p); oos.close(0); } catch(Exception ex){} People pl; try{ FileInputStream fis = new FileInputStream("perple.out"); ois = new ObjectInputStream(fis); p1=(People)ois.readObject(); System.out.println(p); if(p!=p1) System.out.println("two different objecrt") ois.close(); }catch(Exception ex){} } }
程序的運行結果爲:
construct
lili
lili
two fifferent object