Java中创建对象的方式

https://www.jianshu.com/p/4cc036dbef8d

从面向过程到面向对象的转变,是由一句“万物皆对象”开始的。那么所说的这个对象是如何产生的?下面,我们就来看看,在Java中,对象是如何创建的。

在Java中创建对象,通常有四种方式:
1、new关键字;
2、反射机制;
3、clone()方法;
4、反序列化。

New关键字

ClassA a = new ClassA();
使用new关键字,实际上完成了两个步骤:1、分配内存空间,创建对象;2、调用构造方法初始化对象。

注意:任何类都有构造方法,但是new指令只能创建非抽象类的对象。

构造方法是静态的吗?不是,因为静态方法不能使用this,而构造方法中可以使用。

反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。

反射机制创建对象分为两种,一种是Class类的newInstance(),另一种是java.lang.reflect.Constructor类的newInstance()。
两者区别在于:
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数;
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。

事实上Class的newInstance方法内部调用Constructor的newInstance方法。
反射机制创建对象,使用的是类加载机制,newInstance()的特点是在调用时才创建对象,通过类加载机制Class.forName("xxx").newInstance()创建对象,xxx可以从配置文件当中获取实际的值,这样达到了解耦的目的,也是Spring依赖注入的原理。

clone()方法

在介绍clone()之前,首先得明白两个概念:浅拷贝和深拷贝。
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
深拷贝:不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。
浅拷贝的效果就是,对引用对象的操作,会影响到所有引用了该对象的对象。

public class Object  {
   protected native Object clone() throws CloneNotSupportedException;
}

从clone的源码看出:
1、protected需要继承Object类;2、native为本地方法,效率高于非native方法;3、返回类型为Object。
要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

public interface Cloneable {
}

由此可见,Cloneable只是一个标志,想要使用super.clone(),则需要实现Cloneable接口,否则就会抛出CloneNotSupportedException异常。
注意:clone()实现的是浅复制,在重载clone方法的时候,需要转为深复制。即属性存在对象引用的时候,需要对引用属性再进行clone()复制,直到没有对象引用。

反序列化

序列化对象就是对象此刻在内存中的状态转成的字节码。通过实现Serializable接口进行序列化。同Cloneable一样,Serializable也是一个空接口,作为一个标志使用。通过ObjectStream的writeObject()方法和readObject()方法来序列化和反序列化。

** 注意:对象序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构。**

还有一个Externalizable接口同样可以实现序列化,Externalizable继承了Serializable,同时增加了writeExternal()和readExternal()两个方法,可以指定序列化哪些属性,对于需要隐藏的属性,在前面加上transient就可以。
同时,序列化和反序列化是深复制,static、transient 后的变量无法序列化。

参考资料:http://www.cnblogs.com/wxd0108/p/5685817.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值