Java创建对象的五种方式

Java创建对象的五种方式

  1. new 关键字
  2. 反射()
  3. Constructor.newInstance
  4. 克隆(Clone方法)
  5. 反序列化
  6. 动态代理
1、new关键字

通过new关键字来实例化对象是最简单的创建对象的方式,该方式可以调用任意的构造器来创建实例。

public class Main {

    public static void main(String[] args) {
        City city= new City();
    }

}
2、Class.newInstance

这是我们运用反射创建对象时最常用的方法。Class类的newInstance使用的是类的public的无参构造器。

public class Main {

    public static void main(String[] args) throws Exception {
        City city= City.class.newInstance();
    }
}
3、Constructor.newInstance

Constructor.newInstance比Class.newInstance强大。可以通过该方法调用有参数和私有的构造函数。不再局限于必须是无参且公共的。

public class Main {

    public static void main(String[] args) throws Exception {
        // 包括public的和非public的,当然也包括private的
        Constructor<?>[] declaredConstructors = City.class.getDeclaredConstructors();
        // 只返回public的~~~~~~(返回结果是上面的子集)
        Constructor<?>[] constructors = City.class.getConstructors();


        Constructor<?> noArgsConstructor = declaredConstructors[0];
        Constructor<?> haveArgsConstructor = declaredConstructors[1];

        noArgsConstructor.setAccessible(true); // 非public的构造必须设置true才能用于创建实例
        Object city1= noArgsConstructor.newInstance();
        Object city2= declaredConstructors[1].newInstance("湖北", "武汉");

        System.out.println(person1);
        System.out.println(person2);
    }

}

输出:

City{province="null",city="null"}
City{province="湖北",city="武汉"}
4、Clone

无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。
因为Object的clone方法是protected的,所以要使用clone方法,我们必须先实现Cloneable接口并复写Object的clone方法

public class City implements Cloneable {
	...
	// 访问权限写为public,并且返回值写为city
    @Override
    public City clone() throws CloneNotSupportedException {
        return (City) super.clone();
    }
    ...
}

public class Main {

    public static void main(String[] args) throws Exception {
        City city = new City("湖北", "武汉");
        Object clone = city.clone();

        System.out.println(city);
        System.out.println(clone);
        System.out.println(city == clone); //false
    }

}

输出:

City{province="湖北",city="武汉"}
City{province="湖北",city="武汉"}
false
5、反序列化

当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。

为了反序列化一个对象,我们需要让我们的类实现Serializable接口。

public class Main {

    public static void main(String[] args) throws Exception {
        City city = new City("湖北", "武汉");
        byte[] bytes = SerializationUtils.serialize(city);

        // 字节数组:可以来自网络、可以来自文件(本处直接本地模拟)
        Object deserCity = SerializationUtils.deserialize(bytes);
        System.out.println(city);
        System.out.println(deserCity);
        System.out.println(person == deserCity);
    }

}

输出:

City{province="湖北",city="武汉"}
City{province="湖北",city="武汉"}
false
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值