学过,但是忘了或者用错了

java

反射

1.为什么是 Human,而不是 Human
image.png

jvm

1.初始化类出现死循环问题

  1. public class Human<T> {
  2. Human human = new Human();
  3. public Human() {
  4. }
  5. public <T> Human<T> empty() {
  6. return man;
  7. }
  8. }

1.当new Human()的时候,会出现StackOverFlow,因为给属性human赋值的过程会转移到init()(因为human = new Human(),不是默认赋值,如果是默认赋值,会在init()之前)
这时候就会出现一个问题:必须执行才能给human赋值,而执行又必须new Human(),即再给human赋好值。这就会出现死循环。
2.当 human是static或者final或者static final呢?
不会死循环,因为的过程中不需要给human赋值,human值是在编译期就赋好了的。而且只赋值一次。

类的加载过程

粗体是没想起来的

1.加载,链接,初始化
加载:把磁盘上字节码文件转成二进制流,装到内存里;文件里的静态常量池->运行时常量池;属性加到方法区内存生成大Class对象存到方法区,作为各种属性的访问入口;
链接:验证、准备、解析。 准备:给类变量默认赋值。不包括final修饰的类变量(这在编译期就赋好值了)。不包括实例变量。解析:把常量池的符号引用转换为直接引用。
初始化:执行,先执行父类的,在执行自己的。

一个对象的创建过程

1.有6步:

  • 检查是否加载、链接、初始化;
  • 分配内存
  • 处理并发问题
  • 初始化内存(相当于给各种实例属性初始化默认值)
  • 设置对象头(hashCode()、锁信息等)
  • 执行init