JVM类加载机制

 public class A{
   public int age = getAge();
   public static B b;
   public static void main(){
      b = new B();

   }
   public int getAge(){
     return 1;
   }
 }

1

类加载的四个主要过程阶段

  • 验证阶段:检验class文件是否符合jvm规范,防止被篡改
  • 准备阶段:该阶段
    age的值为0,b的值为null,(八种基本属性值为0,引用类型值为Null),有static final修饰的会直接赋值,例如:static final int x=10;则默认就是10
    相当于申明变量,只是申请内存空间但是没有将对应的值织入
  • 解析阶段:这一阶段的任务就是把常量池中的符号引用转换为直接引用,说白了就是jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址
  • 初始化阶段:执行类的初始化代码,getAge()方法就在该阶段执行,另外静态代码块也在该阶段执行,如果该阶段对象有父类的话会先执行父类的初始化代码
package class08;

class Fu {

    static int a; //类变量
    int id;

    //静态代码块
    static {
        a = 10;
        System.out.println("这是FU的静态代码块" + a);
    }

    //构造代码块
    {
        id = 11;
        System.out.println("这是FU的构造代码块id:" + id);
    }

    Fu() {
        System.out.println("这是FU的无参构造函数");
    }

}
class Zi extends Fu{

    public Zi() {
        System.out.println("Zi的构造函数");
    }
    static{
        System.out.println("Zi的static代码块");
    }

    public static void main(String[] args) {
        Zi zi = new Zi();

    }
}

posted @ 2021-07-24 11:25  灰原二  阅读(65)  评论(0)    收藏  举报