开启Java之旅——006对象的构造及初始化2(24.3.26)

文章探讨了Java中局部变量为何必须初始化,而成员变量可以不初始化的原因,涉及new关键字在JVM层面的操作,包括对象创建过程中的内存分配、初始化、并发控制以及就地初始化的概念。
摘要由CSDN通过智能技术生成

3、默认初始化

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

package com.sh.work;
public class Date1 {
    public int year;
    public int month;
    public int day;
    public Date1(int year, int month, int day) {
// 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }
    public static void main(String[] args) {
    // 此处a没有初始化,编译时报错:
    // Error:(24, 28) java: 可能尚未初始化变量a
    // int a;
    // System.out.println(a);
        Date1 d = new Date1(2021,6,9);
    }
}

要搞清楚这个过程,就需要知道 new 关键字背后所发生的一些事情:

在程序层面只是简单的一条语句,在JVM层面需要做好多事情,下面简单介绍下:

(1)检测对象对应的类是否加载了,如果没有加载则加载

(2)为对象分配内存空间

(3)处理并发安全问题比如:多个线程同时申请对象,JVM要保证给对象分配的空间不冲突

(4)初始化所分配的空间   

即:对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

(5)设置对象头信息(关于对象内存模型后面会介绍)

(6)调用构造方法,给对象中各个成员赋值

4、就地初始化

在声明成员变量时,就直接给出了初始值

package com.sh.work;

public class Date2 {
    public int year = 1900;
    public int month = 1;
    public int day = 1;
    public Date2(){
    }
    public Date2(int year, int month, int day) {
    }
    public static void main(String[] args) {
        Date2 d1 = new Date2(2021,6,9);
        Date2 d2 = new Date2();
    }
}


注意:代码编译完成后,编译器会将所有给成员初始化的这些语句添加到各个构造函数中

         

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值