立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[Java/JSP] Java实例化类的方法 [复制链接] qrcode

查看: 2930 | 回复: 0

大法师的 该用户已被删除
发表于: 2012-12-10 17:29:56 | 显示全部楼层

Java中,类的实例化方法有四种途径:
1)使用new操作符
2)调用Class对象的newInstance()方法
3)调用clone()方法,对现有实例的拷贝
4)通过ObjectInputStream的readObject()方法反序列化类
1.ClassInstance.java
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.          }
2.ClassInstanceTest.java
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.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.          }
3.输出结果
1.             有参类的实例化  
2.             测试...01  
3.             无参类的实例化  
4.             测试...  
5.             测试...01  
6.             测试...01  
7.             -------------------额外测试--------------------  
8.             有参类的实例化  
9.             测试...05
除了这几种情况可以实例化一个Java类对象外,隐式调用实例化也是利用了已上集中情况。例如常见的方法:
1.             public class ClassInstance{  
2.             public ClassInstance(){  
3.             }  
4.                  public ClassInstance getInstance(){  
5.             return new ClassInstance();  
6.             }  
7.             }
通过观察结果,我们发现无论哪一种方式必须经过的一步---调用构造方法。无论怎样构造函数作为初始化类的意义怎样都不会改变。

 QQ 744437114
    

  疯狂软件官网:www.fkjava.org
  疯狂java视频 android视频:http://www.fkjava.org/video.html
跳转到指定楼层
快速回复 返回顶部 返回列表