Java相关
内部类
我们所知道的:
- 非静态内部类持有外部类引用;静态内部类不持有外部类引用
编译:
内部类与外部类在编译期都是顶级类,此时看做两个不同的类。但是,因为编译期会给外部类或者内部类的private成员和方法生成access&**方法。以达到内部类可以访问外部类的私有成员,外部类一样可以访问内部类的私有成员。所以和普通的两个不同的类还是不一样的
匿名内部类
按道理,补丁热修复是允许增加类的。但是添加一个匿名内部类的话,还是会提示新增了方法,这是会引发错误的
增加/减少匿名内部类,实际上对于热部署是无解的。应该极力避免
如果必须加入,要插入外部类的末尾
静态成员
类加载时机
什么时候会尝试加载一个类呢
- new一个类的对象
- 调用类的静态方法
- 获取类的静态成员
clinit
clinit方法会在类加载后,进行类初始化的时候调用。热修复是不支持的修复的。只能冷启动生效
init
在类加载后,对类对象进行初始化的时候会调用类的构造方法,会调用到init方法,来对非静态成员和方法进行初始化。对热部署没有影响
所以在创建一个类的对象的时候,流程应该是:
- 加载类,
- 调用clinit进行静态初始化,
- 调用构造函数,
- 调用init进行非静态初始化