Java实例化的几种方式

Java中,类的实例化方法有四种途径:

  1. 用new 语句创建对象,这是最常用的创建对象方法。
  2. 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
  3. 调用对象的clone()方法
  4. 运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。
import java.io.*;

class ClassInstance implements Cloneable, Serializable {
    private String str = "测试...";

    public void fun() {
        System.out.println(str);
    }

    public ClassInstance(String str) {
        System.out.println("有参类的实例化");
        this.str += str;
    }

    public ClassInstance() {
        System.out.println("无参类的实例化");
    }

    public Object clone() {
        return this;
    }
}
import java.io.*;
import java.lang.reflect.*;

public class ClassInstanceTest {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException,
            IllegalAccessException, IOException, InvocationTargetException, NoSuchMethodException {
        //第一种类的实例化方式
        ClassInstance ci01 = new ClassInstance("01");
        ci01.fun();

        //第二种类的实例化方式
        ClassInstance ci02 = (ClassInstance) Class.forName("base.ClassInstance").newInstance();
        ci02.fun();

        //第三种类的实例化方式
        ClassInstance ci03 = (ClassInstance) ci01.clone();
        ci03.fun();

        //第四种类的实例化方式
        FileOutputStream fos = new FileOutputStream("ci.tmp");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(ci01);
        oos.close();
        fos.close();

        FileInputStream fis = new FileInputStream("ci.tmp");
        ObjectInputStream ois = new ObjectInputStream(fis);

        ClassInstance ci04 = (ClassInstance) ois.readObject();
        ois.close();
        fis.close();

        ci04.fun();
        System.out.println("--------------------额外测试--------------------");
        ClassInstance ci05 = null;
        //额外的思考 在第二种类实例化的方式中有没有一种方法实现有参数的构造方式
        //获得类的构造信息
        Constructor[] ctor = Class.forName("base.ClassInstance").getDeclaredConstructors();
        //找到我们需要的构造方法
        for (int i = 0; i < ctor.length; i++) {
            Class[] cl = ctor[i].getParameterTypes();
            if (cl.length == 1) {
                //实例化对象
                ci05 = (ClassInstance) Class.forName("base.ClassInstance").getConstructor(cl).newInstance(new Object[]{"05"});
            }
        }
        ci05.fun();
    }
}

(1)和(2)都会明确的显式的调用构造函数;
(3)是在内存上对已有对象的影印,所以不会调用构造函数;
(4)是从文件中还原类的对象,也不会调用构造函数。

Java 实例化类的方法

  • qq_43638135
    妲己再美究为妃: 博主没有想过自己接一些私活干吗?我现在还没毕业,但是我也确实听说外挂市场自动化游戏脚本市场挺火热的,并且报酬也很丰厚,但是具体的我也不是很清楚,求解答。 (1个月前 #47楼) 查看回复(2) 举报 回复
    22