首页 > 代码库 > AVA实例化类的四种方法

AVA实例化类的四种方法

原文地址:JAVA实例化类的四种方法 作者:权镜士

JAVA中实例化类的四种方法

1)使用new操作符

2)调用Class对象的newInstance()方法

3)调用clone()方法,对现有实例的拷贝

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

点击(此处)折叠或打开

  1. import java.io.*;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;

  4. class ClassInstance implements Cloneable, Serializable { 
  5.     private static final long serialVersionUID = -1261396803896758295L;
  6.     private String str = "测试...";
  7.     public void fun(){
  8.         System.out.println(str);
  9.     }
  10.     public ClassInstance(String str){
  11.         System.out.println("有参类的实例化");
  12.         this.str += str; 
  13.     }
  14.     public ClassInstance(){
  15.         System.out.println("无参类的实例化");
  16.     }
  17.     public Object clone(){
  18.         return this;
  19.     }
  20. }

  21. public class ClassInstanceTest{
  22.     public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
  23.     IllegalAccessException, IOException,InvocationTargetException, NoSuchMethodException{
  24.         //第一种类的实例化方式
  25.         ClassInstance ci01 = new ClassInstance("01");
  26.         ci01.fun();

  27.         //第二种类的实例化方式
  28.         ClassInstance ci02 = (ClassInstance) Class.forName("ClassInstance").newInstance();
  29.         ci02.fun();

  30.         //第三种类的实例化方式
  31.         ClassInstance ci03 = (ClassInstance) ci01.clone();
  32.         ci03.fun();

  33.         //第四种类的实例化方式
  34.         FileOutputStream fos = new FileOutputStream("ci.tmp");
  35.         ObjectOutputStream oos = new ObjectOutputStream(fos);
  36.         oos.writeObject(ci01);
  37.         oos.close();
  38.         fos.close();

  39.         FileInputStream fis = new FileInputStream("ci.tmp");
  40.         ObjectInputStream ois = new ObjectInputStream(fis);

  41.         ClassInstance ci04 = (ClassInstance) ois.readObject();
  42.         ois.close();
  43.         fis.close();

  44.         ci04.fun();
  45.         System.out.println("--------------------额外测试--------------------");
  46.         ClassInstance ci05 = null;
  47.         //额外的思考 在第二种类实例化的方式中有没有一种方法实现有参数的构造方式
  48.         //获得类的构造信息
  49.         Constructor[] ctor = Class.forName("ClassInstance").getDeclaredConstructors();
  50.         //找到我们需要的构造方法
  51.         for(int i=0;i<ctor.length;i++ ){
  52.             Class[] cl = ctor[i].getParameterTypes();
  53.             if(cl.length == 1){
  54.                 //实例化对象
  55.                 ci05 = (ClassInstance) Class.forName("ClassInstance").getConstructor(cl).newInstance(new Object[]{"05"});
  56.             }
  57.         }
  58.         ci05.fun();
  59.     }
  60. }