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;
}
说明你对程序的运行还不了解,没有真正理解这个程序。这种情况下,我建议你采用第一季教过的debug方法进行调试,弄清楚程序的执行过程。
main方法之前完成的其实是类的申明,是所有workhorse class(主力类)都要完成的申明工作,前面的内容暂时是不工作的(除了静态初始化块)。一般情况下这种类的main方法其实是用来做测试的,所以我们debug的时候在main的第一条语句设置breakpoint。
进入调试之后,会发现console区域立马显示了“通过静态初始化块初始化age”,这说明静态初始化块在类加载的时候就执行了,先于对象的构造。然后运行HelloWorld hello=new HelloWorld();语句就会发现,”通过初始化块初始化sex““通过构造方法初始化name”先后出现,这说明先执行了初始化块,再执行了构造方法。这是因为赋值的完成,必须在对象创建之前完成。就好比,我要去买一个某种屏幕大小(这里就是没有赋值的属性)的手机,我可以说“因为我想买5吋的手机(属性赋值),所以我选择了这款华为手机(对象创建)”,但是我不能说“因为我买了这款华为手机(对象创建),所以这款手机是5吋屏幕(属性赋值)”。这个逻辑顺序是不对的。
代码的位置不同。紧挨着构造方法名的是构造方法,随后才是普通初始化块或静态初始化块。他们的执行顺序不同。
构造函数初始化是在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。初始化块的用处是,如果一段初始化处理代码对所有对象完全相同,且无须接受任何参数,就可以把这段提取到初始化块中。
Java入门第二季 升级版
530653 学习 · 6091 问题
相似问题