成员变量初始化 --《JAVA编程思想》16

今天,我们来一起了解 JAVA 类中成员初始化的相关过程。

首先,我们必须知道的是,每个基本类型的成员变量即便不进行初始化,其也会拥有默认值(char类型默认值为空字符串),每种基本类型的默认值如下:

public class InitTemplate {

    boolean bo;
    char c;
    byte by;
    short s;
    int i;
    long l;
    float f;
    double d;

    @Override
    public String toString() {
        return "InitTemplate{" +
                "bo=" + bo +
                ", c=" + c +
                ", by=" + by +
                ", s=" + s +
                ", i=" + i +
                ", l=" + l +
                ", f=" + f +
                ", d=" + d +
                '}';
    }
}
  public static void main(String[] args) {
        InitTemplate initTemplate = new InitTemplate();
        System.out.println(initTemplate.toString());
    }
InitTemplate{bo=false, c= , by=0, s=0, i=0, l=0, f=0.0, d=0.0}

如果成员变量为一个对象,又未将其初始化,则默认值为 null ,直接调用这个对象会抛出空指针异常。

我们可以在定义对象时,直接为成员变量进行初始化赋值。

public class InitTemplate {
    
   boolean bo = true;
    char c = 'c';
    byte by = 'b';
    short s = 1;
    int i = 2;
    long l = 3L;
    float f = 4.2f;
    double d = 5.6;
    Student student = new Student("小明", 12);

    
}

除此以外,还可以通过对象的构造器进行初始化(常用此种方式)。

public class InitTemplate {

    boolean bo ;
    int i ;
    double d ;

    public InitTemplate(boolean bo, int i, double d) {
        this.bo = bo;
        this.i = i;
        this.d = d;
    }
}

其次,对象类的成员变量的初始化是按顺序执行:静态对象成员>非静态对象成员>构造方法

public class Bowl {

    public Bowl(int i) {
        System.out.println("我是第" + i + "只碗");
    }

}
public class Table {

    static Bowl bowl1 = new Bowl(1);

    Bowl bowl2 = new Bowl(2);

    Bowl bowl3;

    public Table() {
        this.bowl3 = new Bowl(3);
    }

    public static void main(String[] args) {
        Table table1 = new Table();
        System.out.println("第二轮创建");
        Table table2 = new Table();
    }
}

我是第1只碗
我是第2只碗
我是第3只碗
第二轮创建
我是第2只碗
我是第3只碗

从上个例子,还可以得出:静态对象成员的初始化只会在类第一次加载的时候执行,并且仅执行一次。

除此之外,还可以使用静态代码块进行初始化操作,静态块用 static 关键字加上 {} 表示,只会在类第一次加载时执行,且执行一次。

public class Table {

    static Bowl bowl1;

    Bowl bowl2 = new Bowl(2);

    static {
        System.out.println("执行静态块");
        bowl1=new Bowl(1);
    }

    Bowl bowl3;

    public Table() {
        System.out.println("执行构造方法");
        this.bowl3 = new Bowl(3);
    }

    public static void main(String[] args) {
        Table table1 = new Table();
        System.out.println("第二轮创建");
        Table table2 = new Table();
    }
}
执行静态块
我是第1只碗
我是第2只碗
执行构造方法
我是第3只碗
第二轮创建
我是第2只碗
执行构造方法
我是第3只碗

其实将静态代码块的 static 关键字去除,还可以衍生成另一种用法。此时的代码块会在每次调用 new() 生成对象时执行,并且执行顺序位于构造方法之前,静态对象之后。

public class Table {

    Bowl bowl1;

    {
        System.out.println("执行初始化");
        bowl1 = new Bowl(1);
    }

    static Bowl bowl2 = new Bowl(2);


    Bowl bowl3;

    public Table() {
        System.out.println("执行构造方法");
        this.bowl3 = new Bowl(3);
    }

    public static void main(String[] args) {
        Table table1 = new Table();
        System.out.println("第二轮创建");
        Table table2 = new Table();
    }
}


我是第2只碗
执行初始化
我是第1只碗
执行构造方法
我是第3只碗
第二轮创建
执行初始化
我是第1只碗
执行构造方法
我是第3只碗

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BaymaxCS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值