学过,但是忘了或者用错了
java
反射
1.为什么是
jvm
1.初始化类出现死循环问题
public class Human<T> {
Human human = new Human();
public Human() {
}
public <T> Human<T> empty() {
return man;
}
}
1.当new Human()的时候,会出现StackOverFlow,因为给属性human赋值的过程会转移到init()(因为human = new Human(),不是默认赋值,如果是默认赋值,会在init()之前)
这时候就会出现一个问题:必须执行
2.当 human是static或者final或者static final呢?
不会死循环,因为
类的加载过程
粗体是没想起来的
1.加载,链接,初始化
加载:把磁盘上字节码文件转成二进制流,装到内存里;文件里的静态常量池->运行时常量池;属性加到方法区内存生成大Class对象存到方法区,作为各种属性的访问入口;
链接:验证、准备、解析。 准备:给类变量默认赋值。不包括final修饰的类变量(这在编译期就赋好值了)。不包括实例变量。解析:把常量池的符号引用转换为直接引用。
初始化:执行
一个对象的创建过程
1.有6步:
- 检查是否加载、链接、初始化;
- 分配内存
- 处理并发问题
- 初始化内存(相当于给各种实例属性初始化默认值)
- 设置对象头(hashCode()、锁信息等)
- 执行init