Java实例化类的方法

上一篇 / 下一篇  2012-05-25 09:06:42 / 个人分类:Java

 Java中,类的实例化方法有四种途径:

%w-?_emzc0  1)使用new操作符51Testing软件测试网 l%rHlJg ~(~%d

`bU7c8up:I]X6v8s0  2)调用Class对象的newInstance()方法

TtJm%j+W|0

tj6NO^f5q0  3)调用clone()方法,对现有实例的拷贝51Testing软件测试网-x\,~D,s6TW(b:F}

51Testing软件测试网;Z/|x_8?

  4)通过ObjectInputStream的readObject()方法反序列化类

`Eqwht8QY {051Testing软件测试网i8~S+nzS/x [

  1、ClassInstance.java

F!YtqBo(l)Rt0
  1. import java.io.*;  
  2.    
  3.  class ClassInstance implements Cloneable, Serializable {  
  4.      private String str = "测试...";  
  5.      public void fun(){  
  6.          System.out.println(str);  
  7.      }  
  8.      public ClassInstance(String str){  
  9.          System.out.println("有参类的实例化");  
  10.          this.str += str;   
  11.      }  
  12.      public ClassInstance(){  
  13.          System.out.println("无参类的实例化");  
  14.      }  
  15.      public Object clone(){  
  16.          return this;  
  17.      }  
  18.  }

5U7zK2g{DtQB^0  2、ClassInstanceTest.java51Testing软件测试网a3t,u#j(i dz ]

  1. import java.io.*;  
  2.  import java.lang.reflect.*;  
  3.    
  4.  public class ClassInstanceTest{  
  5.      public static void main(String[] args) throws ClassNotFoundException, InstantiationException,  
  6.             IllegalAccessException, IOException,InvocationTargetException, NoSuchMethodException{  
  7.          //第一种类的实例化方式 
  8.          ClassInstance ci01 = new ClassInstance("01");  
  9.          ci01.fun();  
  10.    
  11.          //第二种类的实例化方式 
  12.          ClassInstance ci02 = (ClassInstance) Class.forName("ClassInstance").newInstance();  
  13.          ci02.fun();  
  14.    
  15.          //第三种类的实例化方式 
  16.          ClassInstance ci03 = (ClassInstance) ci01.clone();  
  17.          ci03.fun();  
  18.    
  19.          //第四种类的实例化方式 
  20.          FileOutputStream fos = new FileOutputStream("ci.tmp");  
  21.          ObjectOutputStream oos = new ObjectOutputStream(fos);  
  22.          oos.writeObject(ci01);  
  23.          oos.close();  
  24.          fos.close();  
  25.            
  26.          FileInputStream fis = new FileInputStream("ci.tmp");  
  27.          ObjectInputStream ois = new ObjectInputStream(fis);  
  28.            
  29.          ClassInstance ci04  = (ClassInstance) ois.readObject();  
  30.          ois.close();  
  31.          fis.close();  
  32.            
  33.          ci04.fun();  
  34.          System.out.println("--------------------额外测试--------------------");  
  35.          ClassInstance ci05 = null;  
  36.          //额外的思考 在第二种类实例化的方式中有没有一种方法实现有参数的构造方式 
  37.          //获得类的构造信息 
  38.          Constructor[] ctor = Class.forName("ClassInstance").getDeclaredConstructors();  
  39.          //找到我们需要的构造方法 
  40.          for(int i=0;i<ctor.length;i++ ){  
  41.              Class[] cl = ctor[i].getParameterTypes();  
  42.              if(cl.length == 1){  
  43.                  //实例化对象 
  44.                  ci05 = (ClassInstance) Class.forName("ClassInstance").getConstructor(cl).newInstance(new Object[]{"05"});  
  45.              }  
  46.          }  
  47.          ci05.fun();  
  48.      }  
  49.  }

yOcQAS#F0  3、输出结果51Testing软件测试网z)y8Z/l'LkS

  1. 有参类的实例化  
  2.  测试...01  
  3.  无参类的实例化  
  4.  测试...  
  5.  测试...01  
  6.  测试...01  
  7.  -------------------额外测试--------------------  
  8.  有参类的实例化  
  9.  测试...05
51Testing软件测试网1k;[XH4qBYd7H(m

  除了这几种情况可以实例化一个Java类对象外,隐式调用实例化也是利用了已上集中情况。例如常见的方法:

[9G?4q3HnAeT0Ea0
  1. public class ClassInstance{  
  2.  public ClassInstance(){  
  3.  }  
  4.      public ClassInstance getInstance(){  
  5.  return new ClassInstance();  
  6.  }  
  7.  }

6?3oU2E!M@0  通过观察结果,我们发现无论哪一种方式必须经过的一步---调用构造方法。无论怎样构造函数作为初始化类的意义怎样都不会改变。

pV/z%~ \|[J,]l0

TAG:

 

评分:0

我来说两句

Open Toolbar