package com.lzy.JVM;
public class Demo01 {
public static void main(String[] args) {
A a=new A();
System.out.println(A.width);
}
}
class A{
public static int width=100;
static {
System.out.println("静态初始化类A");
width=300;
}
}
代码运行,首先会加载类Demo01,方法区形成Demo01类的静态数据,
同时在堆里也会形成一个对象java.lang.Class,代表Demo01类,也就是说可以通过堆里生成的对象访问方法区中Demo01的二进制结构,从而操作这个类的信息。
方法区会先形成A类的静态数据,堆里也会生成java.lang.class对象,代表A类。同样会和方法区中的A的静态数据产生联系,
类加载完之后才真正运行代码,在运行main方法时,栈中会生成一个main的方法栈帧(一个方法对应一个栈帧),代码A a=new A();前半句A a时栈中的main栈帧会生成一个a变量,此时为null;当new A()时通过new调用A类的构造器,所以会调用一个新的方法(这里的方法指A类的构造方法),因为调用了方法,所以此时栈中会形成一个新的栈帧,此时堆里生成一个A的对象,通过“=”将A对象的地址赋给a,此时a就不为空了。