import xxxx.testB
public class testA{
public static String test = "123";
public static void main(String args[]){
testB b = new testB(2, “234”);
b.message();
}
}
public class testB{
int num = 1;
String name = 'asd';
public testB(String num, String name){
this.num = num;
this.name = name;
}
public String message(){
System.out.print(num + "=====" + age);
}
}
- 使用javac命令编译testA,被依赖的类会首先被编译,然后引用,如果被依赖的类已经被编译直接引用,编译之后产生与平台无关的字节码文件(也是01序列组成的文件)
- main方法作为该Java程序的入口,其所在类testA的字节码文件首先被加载到方法区,然后在堆中创建一个该对象的java.lang.Class对象,用来封装类在方法区内的数据结构,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。(反射)注:该步称为类的装载
- 类的连接
3.1 验证:检验加载的类是否具有正确的结构
3.2准备:在方法区中为类变量分配内存并设置类变量默认初始值(即在图中的静态为test类变量区开辟内存并设置null的初始化值)
3.3 将类中二进制数据中的符号引用替换成直接引用
- 类的初始化,主要是对类变量的初始化(对类变量的初始化有两种,一种是直接赋值,一种是静态代码块),既将123赋值给方法区中的类变量test
注:234步称为类加载或类初始化
- 运行到main方法,发现要使用testB,testB被装载进入方法区(重复234步),之后-
5.1 声明一个testB 类型引用 b
5.2 在堆内存创建testB对象,
5.3,给对象中属性默认初始化值
5.4,属性进行显示初始化(及有没有直接在变量申明后赋值的)
5.5构造方法进栈,对对象中的属性赋值,构造方法弹栈
5.6将对象的地址值赋值给b
注:上述步骤均发生在栈中main方法的区域中
- 这时message方法入栈,执行方法,输出2====234,message方法弹栈
- main方法结束,程序正常运行结束,该jvm进程结束,该jvm进程在内存中的状态将会丢失
