Java中创建对象有哪几种方式,Java 中创建对象的4种方式--Java学习网

核心提示:Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法。  总结下来有以下4种创建对象的方法:使用 new 关键字调...

Java 是面向对象的语言,不可避免的,“对象”这个概念是 Java 语言的核心部分,这里来简单讨论一下在 Java 中创建一般对象的方法。

总结下来有以下4种创建对象的方法:

使用 new 关键字调用对象的构造器;

使用 Java 反射的 newInstance() 方法;

使用 Object 类的 clone() 方法;

使用对象流 ObjectInputStream 的 readObject() 方法读取序列化对象;

1.      使用 new 关键字

最常见的 Java 对象的构造方法,通过调用类提供的构造器创建对象。

2.      使用 newInstance() 方法

Java 反射中有一个 newInstance() 方法,可以创建对象,步骤如下:

获取要创建的类的 Class 对象。

如果只需要调用这个类的访问权限为 public 无参构造器,直接使用 Class 类的实例方法 newInstance()。

获取 Class 对象的构造器对象,通过调用 Class 类的实例方法 getDeclaredConstractors() 来获取构造器对象的数组。(获取所有构造器,无视访问权限的限制,数组顺序按照代码中的顺序决定)

如果调用的构造器是 private 的,需要调用 Constractor 类的父类 AccessibleObject 类的实例方法 setAccessible(true) 来打破访问限制。

使用 Constractor 类的实例方法 newInstance()。

示例代码:

cdec0645add3fc3c328197dda5c76203.pngMethodNewInstance

备注:

获取 Class 对象的方法有3个,此处不多赘述。

获取 Constractor 对象的方法有4个,此处不多赘述。

3.      使用 clone() 方法

Object 类是所有类的直接或间接父类,Object 类中提供了 实例方法 native(),在给定对象的基础上,创建一个完全相同的对象。步骤如下:

想要使用 clone() 方法创建对象的类,实现 Cloneable 接口。

在类的内部,重写 Object 类的 clone() 方法。

示例代码:

cdec0645add3fc3c328197dda5c76203.pngObjectToCreate

备注:

没有实现 Cloneable 接口,会抛出 CloneNotSupportedException 异常。

Object 类提供的 clone() 方法,访问权限是 protected,所以如果不重写 clone() 方法,是没有权限调用的。

Object 类的 clone() 方法,是 native 方法。

4.      使用反序列化的 readObject() 方法

这个方法一共分两步:

将对象序列化,存储到一个文件中。

从文件中反序列化,得到类对象。

序列化:

想要序列化对象的类,实现Serializable接口。

使用文件输出流FileOutputStream创建存储序列化之后对象的文件。

使用对象输出流ObjectOutputStream的实例方法writeObject(obj)。

判断类中是否存在,名为writeReplace(),返回类型为Object的方法,若有,写入这个方法的返回值;否则,写入obj对象。

反序列化:

使用文件输入流FileInputStream找到存储序列化对象的文件。

使用对象输入流ObjectInputStream的实例方法readObject()。

判断类中是否存在,名为readResolve(),返回类型为Object的方法,若有读取这个对象;否则,反序列化文件中的对象流。

示例代码:

cdec0645add3fc3c328197dda5c76203.pngObjectToCreate

cdec0645add3fc3c328197dda5c76203.pngMethodSerialable

cdec0645add3fc3c328197dda5c76203.pngMethodAntiSerialable

备注:

在类中,writeReplace()和readResoleve()是两个非常特殊的方法,其特征签名需要严格限制:方法名限定,参数个数限定为0,返回类型必须是Object,不能为Object的子类,但是可以抛出不同的异常。访问修饰符没有限制,但一般推荐为private,防止误操作。其特殊的地方还在于将其设为private方法,没有其他方法调用的情况下,编译器不会发出警告。

5.总结

Java创建对象的4种方法:第一种是最常用的;第二种方法深入至源码会指向sun.reflect.ConstructorAccessor类,JDK中似乎没有提供继续深入下去的源码,但是既然是调用构造器的方法,那么与第一种方法一样,创建的对象是存储在堆(Heap)中的;第三种方法是要实现特定的接口才可以使用,而且是通过调用native方法,也就是非Java代码(很大可能是C)实现的,也就是说,这个方法产生的对象,可能不会被GC回收(个人的想法),因为GC是用来回收Java代码创造的对象,所以要慎用;第四种方法在序列化的时候,需要实现特定的接口,而在反序列化时就不关心这一点了,它是将对象暂存于其他媒介中,在反序列化的时候将对象存于堆中。

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值