怎么理解“通过构造方法初始化name” 和 "通过初始化块初始化sex" 代码不都是一样的吗?

来源:8-10 Java 中的 static 使用之静态初始化块

re浪

2016-01-26 18:52


// 构造方法

public  HelloWorld      () { 

System.out.println("通过构造方法初始化name");

name = "tom";

}

    

    // 初始化块

System.out.println("通过初始化块初始化sex");

sex = "男";

}

    

    // 静态初始化块

static     { 

System.out.println("通过静态初始化块初始化age");

age = 20;

}

    


写回答 关注

3回答

  • 七九九
    2016-01-27 23:37:17

    说明你对程序的运行还不了解,没有真正理解这个程序。这种情况下,我建议你采用第一季教过的debug方法进行调试,弄清楚程序的执行过程。

    main方法之前完成的其实是类的申明,是所有workhorse class(主力类)都要完成的申明工作,前面的内容暂时是不工作的(除了静态初始化块)。一般情况下这种类的main方法其实是用来做测试的,所以我们debug的时候在main的第一条语句设置breakpoint。

    进入调试之后,会发现console区域立马显示了“通过静态初始化块初始化age”,这说明静态初始化块在类加载的时候就执行了,先于对象的构造。然后运行HelloWorld hello=new HelloWorld();语句就会发现,”通过初始化块初始化sex““通过构造方法初始化name”先后出现,这说明先执行了初始化块,再执行了构造方法。这是因为赋值的完成,必须在对象创建之前完成。就好比,我要去买一个某种屏幕大小(这里就是没有赋值的属性)的手机,我可以说“因为我想买5吋的手机(属性赋值),所以我选择了这款华为手机(对象创建)”,但是我不能说“因为我买了这款华为手机(对象创建),所以这款手机是5吋屏幕(属性赋值)”。这个逻辑顺序是不对的。

  • 大神一只熊
    2016-01-26 19:06:23

    代码的位置不同。紧挨着构造方法名的是构造方法,随后才是普通初始化块或静态初始化块。他们的执行顺序不同。

  • qq_生命嗜血_0
    2016-01-26 19:06:01

    构造函数初始化是在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。初始化块的用处是,如果一段初始化处理代码对所有对象完全相同,且无须接受任何参数,就可以把这段提取到初始化块中。

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

530653 学习 · 6091 问题

查看课程

相似问题