zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Go_海量用户即时通讯系统
    Golang redis学习指南
    Golang 操作_Redis
    十七、Redis
    十六、网络编程-tcp socket编程
    十五、反射
    十四、goroutine(协程)和channel(管道)
    Jmeter笔记(9)Jmeter 性能测试资源监控方法(本地与服务器)(转)
    Fiddler笔记(8)重装时清除已有证书及解决tunnel to 443问题
    Jmeter笔记(8)Jmeter与MySql连接
  • 原文地址:https://www.cnblogs.com/rainisraining/p/8573730.html
Copyright © 2011-2022 走看看