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) 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. }

  通过观察结果,我们发现无论哪一种方式必须经过的一步---调用构造方法。无论怎样构造函数作为初始化类的意义怎样都不会改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值