程序员必知系列之Java代码的类实例化

391 阅读2分钟

这是我参与 8 月更文挑战的第 5 天,活动详情查看: 8月更文挑战

最近看了JVM相关知识,对JVM是如何运行JAVA代码过程有了一个清楚的认识,现在总结一下JAVA中类实例化过程中的内容。 现看一下下面的代码:

public class Exam5 {
    static int s;
    int i;
    int j;
    {
        int i = 1;
        i++;
        j++;
        s++;
    }
    public void test(int j){
        j++;
        i++;
        s++;
    }

    public static void main(String[] args) {
        Exam5 obj1 = new Exam5();
        Exam5 obj2 = new Exam5();
        obj1.test(10);
        obj1.test(20);
        obj1.test(30);
        System.out.println(obj1.i + "," + obj1.j);
        System.out.println(obj2.i + "," + obj2.j);

    }
}

代码解释

上面的Java代码经过编译后会变成Class文件。Class文件是针对JVM设计的一种特殊格式的文件。只要生成符合JVM规范的Class文件,那么JVM都是执行该Clss文件,这也是Java代码的一次编译,到处运行的实现前提条件。 在上述的代码中 public static void main(String[] args) {} ,它会在JVM进程中某一线程中运行时数据区域中虚拟栈中入栈,即是对应的是main方法。在虚拟机栈中的基本单位是栈帧,每一个栈帧中由局部变量表、操作数栈、动态链接、方法返回地址组成。由此可见,上面的main方法中会生成一个栈帧,栈帧中局部变量表中会有两变量值 obj1,obj2。在类实例化过程中会执行非静态代码块(i=0,j=1),其中i和j属于成员变量,s属于类变量。成员变量会在堆中存在,类变量会在方法区中存在。在执行两次的类实例化过程中,s++两次,代表s的值为2;类实例化过程中,会给i,j,s赋默认值。在调用方法中test方法被调用了三次,其中test方法中i是obj1的成员变量,所以会累加为3;由于test方法中传入了局部变量j,所以test方法中的j是局部变量,j的累加并不影响obj2中成员变量j。所以由此得出上面的代码中结果是3,1 0,1。具体的图解会补上去。