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进程在内存中的状态将会丢失