1、面向对象四大特性:抽象、封装、继承、多态
抽象:分为归纳和演绎,归纳是从具体到本质,从个性到共性,演绎是联系推理。
封装:决定哪些信息公开,目的是解耦(参考迪米特法则)
继承:继承是为了复用(参考里氏替换),但滥用继承可能会导致方法污染甚至方法爆炸。
多态:通过重载动态表达需求。
2、接口和抽象类的区别
从语法上看:
1)接口不能有方法实现,包括静态方法块;
2)接口支持多基础,而静态方法不支持;
从功能上看:
接口是契约式设计,而抽象类是模板式设计。
3、内部类的好处
1)作用域不会扩展到包外
2)可以通过“外部类.内部类”的方式直接访问
3)内部类可以访问外部类的所有静态属性和方法
4、访问权限控制
对于【任何地方】、【包外子类】、【包内】、【类内】四个范围:
public 分别是可见、可见、可见、可见;
protected 分别是 不可见、可见、可见、可见;
缺省 分别是 不可见、不可见、可见、可见;
private 分别是 不可见、不可见、不可见、 可见。
5、序列化和反序列化
1)序列化的过程是把数据对象转换为二进制流的过程。
2)序列化的方式常见有三种:
① Java 原生序列化
需要实现Serializable接口,并设置serialVersionUID字段,确定是跨语言、性能一般。
② Hessian 序列化
支持跨语言看,序列化和反序列化时间较Java原生序列化短很多,并且增加了压缩编码,二进制流小很多。
Hession序列化会先序列化子类,所以会导致序列化结果中类成员变量被父类覆盖。
③ JSON 序列化
将对象转换为JSON字符串,可读性更好,方便调试。
3)序列化安全问题
通过在反序列化过程构造恶意代码实现攻击。解决方案是可以将不需要序列化的敏感字段加transient字段,或者将数据进行加密再序列化。
6、对象结构
对象在内存中包含三部分:对象头、实例数据、对齐填充。
1)对象头存储了Mark Word和类元信息,Mark Word中是哈希码、GC标记、锁信息、线程关联信息等,类元信息中类元数据(即Klass)的首地址。
2)实例数据中是对象的实例成员变量和可见的父类成员变量。
3)对齐填充是为了保证对象的大小是字节的倍数。