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 |