类加载过程( 二 )


 
}
 
public static void sayHello(Serializable arg) {
 
System.out.println("hello Serializable");
 
}
 
public static void sayHello(Object arg) {
 
System.out.println("hello Object");
 
}
 
public static void sayHello(char... arg) {
 
System.out.println("hello char……");
 
}
 
public static void main(String[] args) {
 
sayHello('a');
// 运行结果为hello int
//代码我给排序了,不要误解为从上往下查找哈,当找不到的情况下,实参会自动类型提示,这个查了类型自动提升过程为 char,int,long,Character,Serializable,Object,char []
}
}
 
```
-
- 动态分派
- 虚方法
- 指向常量池中的方法的符号引用
## 初始化
- 类的加载、验证、准备、初始化是先后开始的 ,  多是在初始化之前 , 加载 , 验证 , 准备必然是已经开始了 。
初始化阶段(Cinit<>)对static类变量赋初始值(非零值)
- 初始化的5个时机
- new / putstatic(调用类的static方法或static字段(非final static)的时候)
- 子类初始化的时候如果父类没有初始化 ,  那么父类会初始化
- main入口方法对应的类
- 反射
- ...忘记了
- 3种容易误以为会初始化的情况
- 子类.父类static 属性
- 这种情况只会初始化父类 ,  不会初始化子类
- 数组元素是类类型 , 那么这种类类型不会初始化 ,  除非实例化数组元素
- 访问类的final static属性 。那么这个类是不会初始化的 ,  因为final static在编译阶段就会直接保存到常量池中 ,  如果用到final static属性 ,  也只是宏替代 。




推荐阅读