Java内部类序列化

一个类能够序列化,需要满足两个条件:

  1. ​​​​​​​类本身实现序列化接口Serializable
  2. 类所有的成员属性实现序列化接口Serializable

Java的嵌套类(nested class)一共有四种:

  • static nested class 静态嵌套类 
  • inner class 内部类(非静态) 
  • local class 本地类(定义在方法内部) 
  • anonymous class 匿名类 

静态嵌套类的行为更接近普通的类,另外三个是真正的内部类。区别在于作用域的不同。

  以下是对他们的性质描述: 

è¿éåå¾çæè¿°

1、首先我们对静态嵌套类(static nested class)进行序列化。同理,也要实现序列化接口Serializable。

成功了,跟预料中一样。 

2、然后我们对内部类(inner class)进行序列化。同理,也要实现序列化接口Serializable。

异常了,提示我们外部类没有序列化。那我们就将外部类也实现序列化接口。

成功了,这是为什么呢? 

网上查了一些资料,总结如下:

所有的内部类,Local内部类,匿名内部类都可以直接访问外面的封装类的实例变量和方法。而静态嵌套类则不能。

为了实现这一行为,内部类,Local内部类,匿名内部类的实例都持有一个外部封装类实例的隐式引用,而Java对象序列化要求对象里所有的对象成员都必须实现序列化接口。

所以,嵌套类要想能够序列化,除了本身和所有成员属性都要实现序列化接口以外,要么声明为静态嵌套类,要么让外部类也实现序列化接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值