Java变量初始化过程详解

博主举办了一场party,派对里供应了苹果apple和香蕉banana;
前来参加的派对人都属于派对成员类PartyMember类中的对象;
每当使用new关键字调用构造方法创建一个对象的时候需要传入实参声明该对象自己需要多少个apple和banana;

吝啬的JVM给出的默认值竟然x心x狂地都是0个?!
而慷慨的博主给出的初始值是8个apple和9个banana,并且让每个对象在创建时都要当着博主的面在非静态代码块里个吃一个apple和banana!!
现在有一个怯怯的新对象却只想要1个apple和2个banana…

到底这两个实例属性(非静态变量)的初始化过程是什么样的?
来参加party的萌新最终到底得到了几个apple和banana??


以下是实例代码的截图:(文本形式的源码在文末给出)
这里写图片描述

当调试程序单步执行的时候
进入程序入口main方法


原始状态(还未创建对象):
这里写图片描述


步骤一:创建赤裸裸的对象,获取默认值

执行第23行,
这里写图片描述
执行后便创建了一个对象
(也仅仅是创建了一个对象,但是并没有真正传入实参1和2的值
此时:实例属性this.apple 和 this.banana均为int型数据的默认值0);
这里写图片描述


步骤二:获取初始值

程序跳转至第8行后,保持默认值0,
这里写图片描述
这里写图片描述

紧接着,跳转到第5行执行,
这里写图片描述
执行后:this.apple == 8,
这里写图片描述
然后执行第6行,
这里写图片描述
执行后:this.banana == 9;
这里写图片描述


步骤三:获取非静态代码块中的值:

执行第16行,执行后:this.apple做自减运算后 == 7;
这里写图片描述
这里写图片描述
执行第17行,执行后:this.banana做自减运算后 == 8;
这里写图片描述
这里写图片描述


步骤四:获取调用构造方法中实参的值:

给刚刚创建的该对象赋以实参的值1和2:
程序跳转至第9行执行,执行后:this.apple ==1,
这里写图片描述
这里写图片描述
然后执行第10行,执行后:this.banana == 2;
这里写图片描述
这里写图片描述


以下是在整个运行过程中控制台中的输出:
这里写图片描述


以下是示例源代码:

package test.initiallization;

public class PartyMember {

    /**
     * 非静态变量(实例属性)
     */
    int apple = 8;
    int banana = 9;

    /**
     * 构造方法
     */
    public PartyMember(int apple, int banana) {
        this.apple = apple;
        this.banana = banana;
        System.out.println("构造方法中:");
        System.out.println(this.apple + " " + this.banana);
    }

    /**
     * 非静态代码块
     */
    {
        this.apple--;
        this.banana--;
        System.out.println("非静态代码块中:");
        System.out.println(this.apple + " " + this.banana);
    }

    /**
     * main方法
     */
    public static void main(String[] args) {
        new PartyMember(1, 2);
    }
}

总结:

如若不考虑静态代码块static{ }中调用构造方法创建对象后
再赋给实例属性值的情况,实例属性(非静态变量)的初始化过程简述为:

用new创建并初始化对象步骤:

1、给对象的实例变量(非“常量”)分配内存空间,默认初始化成员变量;
2、成员变量声明时的初始化
3、初始化块初始化(又称为构造代码块或非静态代码块);
4、构造方法初始化

默认值 –> 初始值 –> 非静态代码块中的值 –> 构造方法中的值

展开阅读全文

没有更多推荐了,返回首页