JAVA创建对象的五种方法实例详解
in JAVA编程 with 0 comment

JAVA创建对象的五种方法实例详解

in JAVA编程 with 0 comment

众所周知JAVA是一门面向对象的编程语言,万物皆对象。在JAVA语言编程中无论实现简单还是复杂的逻辑都需要使用对象Object进行数据的承载,在JAVA中有众多的创建对象的方式,你了解多少?

Java1.jpg

new关键字

没有对象怎么办?
作为JAVA程序猿的第一反应恐怕就是,New一个吧!

//无参构造,直接new
MebugsUser meBaby1_1 = new MebugsUser();
//需要相应参数构造方法的支持
MebugsUser meBaby1_2 = new MebugsUser("qty","1992","181","73","man");

Class类的newInstance方法

使用Class类的newInstance方法创建对象,在工厂模式常用的反射机制创建对象。
大多数开源框架(如Spring)内部都是通过反射来创建实例的。
方法创建对象的时候,只会调用该类的[无参数构造函数],不会调用其他的有参构造函数。

MebugsUser meBaby2_1 = (MebugsUser) Class.forName("com.Mebugs.MebugsUser").newInstance();
//另外一种写法
MebugsUser meBaby2_2 = MebugsUser.class.newInstance();

构造器Constructor类的newInstance方法

和Class类的newInstance方法很像(也是反射机制创建对象)。
java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。
通过这个newInstance方法调用[有参数的和私有的构造函数]。

Constructor<MebugsUser> constructor = MebugsUser.class.getConstructor();
MebugsUser meBaby3 = constructor.newInstance();

克隆clone方法

调用一个对象的clone方法,jvm就会创建一个新的对象。
clone方法会将前面对象的内容全部拷贝进去。
clone方法创建对象并不会调用任何构造函数。
使用clone方法,该类需要实现Cloneable接口并实现其定义的clone方法。

public class MebugsUser implements Cloneable
{
    //.....略
    //实现clone方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    //.....略
}
MebugsUser meBaby4 = (MebugsUser) meBaby3.clone();

反序列化创建单独对象

序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。
在反序列化时,jvm创建对象并不会调用任何构造函数。
反序列化一个对象,需要让类实现Serializable接口

public class MebugsUser implements Serializable
{
    //.....略
    //实现Serializable接口,需要提供一个无参构造函数
    public MebugsUser(){}
    //.....略
}
//序列化和反序列化
MebugsUser meBaby5_1 = new MebugsUser();
//序列化
ObjectOutputStream oos = null;
try {
    oos = new ObjectOutputStream(new FileOutputStream("obj.Mebugsuser"));
    oos.writeObject(meBaby5_1);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    IOUtils.closeQuietly(oos);
}
//反序列化
File file = new File("obj.Mebugsuser");
ObjectInputStream ois = null;
try {
    ois = new ObjectInputStream(new FileInputStream(file));
    //反序列化的对象
    MebugsUser meBaby5_2 = (User1) ois.readObject();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} finally {
    IOUtils.closeQuietly(ois);
}

结尾小结

除了第一个(new)方法,其他四个方法全都是创建对象的直接方法。
new可以区别两种调用,直接new和new构造函数调用。
在实际商业应用中创建对象一般都会交给开发框架完成。

Responses