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) throwsClassNotFoundException, 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< p>
41. Class[] cl = ctor[i].getParameterTypes();
42. if(cl.length == 1){
43. //实例化对象
44. ci05 = (ClassInstance)Class.forName("ClassInstance").getConstructor(cl).newInstance(newObject[]{"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. }
通过观察结果,我们发现无论哪一种方式必须经过的一步---调用构造方法。无论怎样构造函数作为初始化类的意义怎样都不会改变。