Java中不通过构造方法创建对象的方法总结

    我们常说,Java是一种面向对象的语言,因而在Java中几乎所有的操作都离不开对象。而在Java语言中,最常见的创建对象的方法是通过对类构造器的调用,除此之外,其实还有下面几种可以创建对象的方法。

1)通过反射机制来创建对象;

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();
            }
     }  
}

程序的运行结果为:

    construct

    Jack

2)调用对象的clone方法,需要以下几个步骤才能使用clone方法:

(1)实现clone的类首先需要继承Cloneable接口实质上是一个标识接口,没有任何的接口方法,这一点和序列化接口Serializable()很类似。

(2)在类中重写Object类的clone方法。

(3)在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone()都会直接或间接的调用Java.long.Object类中的clone()方法。

实例代码如下:

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

posted @ 2018-03-15 15:10  rainisraing  阅读(5809)  评论(0编辑  收藏  举报