• Java 实例化类的方法


      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[i].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 }

      

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

  • 相关阅读:
    第一篇正式文章 随便聊聊吧
    CSS 28 块之间的空格
    CSS 27 贴在下方
    CSS 26 左右固定
    CSS 25 垂直居中
    CSS 24 左侧固定
    CSS 23 水平居中
    CSS 22 显示方式
    CSS 21 浮动
    CSS 20 相对定位
  • 原文地址:https://www.cnblogs.com/localhost/p/2508440.html
Copyright © 2020-2023  润新知