序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。

内存回收线程可以释放无用的对象内存
构造函数必须与public 类同名,方法可以和类同名

java哪些属性不可以序列化 什么对象不能序列化_子类


不可变类(Immutable Class)是一旦被实例化就不会改变自身状态(或值)的类。

String就是一种典型的不可变类。

不可变类的主要用途是在多线程环境下确保对象的线程安全。

不可变类一般建议使用final来修饰(比如String就是final类),否则子类可以通过继承不可变类的方式,增加setter方法,从而改变对象的状态,破坏了不可变的约束。

final的作用:

1. 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。

2. 修饰方法,方法不可被重写,但是还是可以重载

3. 修饰类,类不可继承。

java哪些属性不可以序列化 什么对象不能序列化_抽象类_02


A:正确main方法是入口

B:J2SDK当然不仅仅包含java API

C:jar选项是java.exe 的选项

D:Appletviewer是运行applet的, applet 不用main方法,继承applet类即可。

java哪些属性不可以序列化 什么对象不能序列化_子类_03


1、基本型和基本型封装型进行“==“ 运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

i==j ,这个是基本类型与 Integer 的比较, j 会自动拆箱成 int 类型,然后比较的是值。因此返回真。

j.equals(i) ,调用 equals 方法后,这个 i 会自动装箱成 Integer 类型,然后再比较值,所以也返回真

switch语句后的控制表达式只能是short、char、int、long整数类型和枚举类型,不能是float,double和boolean类型(不能是浮点型和布尔型)。String类型是java7开始支持。

java哪些属性不可以序列化 什么对象不能序列化_子类_04

  1. 一个子类只能继承一个抽象类,但能实现多个接口
  2. 抽象类可以有构造方法,接口没有构造方法
  3. 抽象类可以有普通成员变量,接口没有普通成员变量
  4. 抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
  5. 抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法
  6. 抽象类可以有静态方法,接口不能有静态方法
  7. 抽象类中的方法可以是public、protected;接口方法只有public

java哪些属性不可以序列化 什么对象不能序列化_java哪些属性不可以序列化_05


构造函数的作用是完成对象的初始化。当程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化。而选项B、D中,对象的初始化并不是通过构造函数完成的,而是读取别的内存区域中的对象的各个域来完成。

java哪些属性不可以序列化 什么对象不能序列化_不可变类_06


内部类其实和类的属性没什么区别,只是在声明的时候必须是Outer.Inner a,就像int a 一样,至于静态内部类和非静态内部类new的时候有点区别,Outer.Inner a=new Outer().new Inner()(非静态,先有Outer对象才能有属性) Outer.Inner a=new Outer.Inner()要把Outer.Inner看成一部分,就像类变量一样局部变量必须先初始化

java哪些属性不可以序列化 什么对象不能序列化_抽象类_07


1.静态内部类才可以声明静态方法

2.静态方法不可以使用非静态变量

3.抽象方法不可以有函数体

java哪些属性不可以序列化 什么对象不能序列化_子类_08


java哪些属性不可以序列化 什么对象不能序列化_java哪些属性不可以序列化_09


这是静态分派的过程,在编译时已经决定了使用super的方法,因为subToSuper 是指super对象,可是为什么会选择collection呢,for循环出来他们实际上指的是collection对象表示的,即类似于Collection col = new HashSet<>();这样传入方法getType()中的参数就是col,左边是静态类型,右边是实际类型。由于重载实际上是使用静态分派的,重载时是通过参数的静态类型而不是实际类型作为判定依据的。详细参考深入理解java虚拟机248页解释。

考察点1:重载静态多分派——根据传入重载方法的参数类型,选择更加合适的一个重载方法

考察点2:static方法不能被子类覆写,在子类中定义了和父类完全相同的static方法,则父类的static方法被隐藏,Son.staticmethod()或new Son().staticmethod()都是调用的子类的static方法,如果是Father.staticmethod()或者Father f = new Son(); f.staticmethod()调用的都是父类的static方法。

考察点3:此题如果都不是static方法,则最终的结果是A. 调用子类的getType,输出collection

java哪些属性不可以序列化 什么对象不能序列化_抽象类_10

  1. HashMap,TreeMap 未进行同步考虑,是线程不安全的
  2. HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
  3. Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
    List list = Collections.synchronizedList(new ArrayList());
    Set set = Collections.synchronizedSet(new HashSet());