Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269844
  • 博文数量: 88
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 840
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-20 21:13
文章分类

全部博文(88)

文章存档

2022年(1)

2017年(1)

2016年(2)

2015年(1)

2014年(83)

分类: Java

2014-05-06 17:45:31

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. }
结果:

点击(此处)折叠或打开

  1. 有参类的实例化
  2. 测试...01
  3. 无参类的实例化
  4. 测试...
  5. 测试...01
  6. 测试...01
  7. --------------------额外测试--------------------
  8. 有参类的实例化
  9. 测试...05

这四种方法,很多人可能怀疑觉得是否真的都用的到?答案是肯定的。
第一种new就不用多说了;第二种是使用Class类的方法,如果对java了解稍微深入一点,Class类也必须知道;第三种,使用clone(),这个涉及到原型模式,也是很常用的;最后是使用序列化机制,这个也很常见。大家应该知道eclipse经常会提示我们对类进行序列化。


阅读(495) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~