Java中不經過構造方法建立對象的方法總結

    咱們常說,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

相關文章
相關標籤/搜索