课后整理总结-10.8
课件2及相关作业的整理总结:
动手动脑问题:
1.为何此代码不能编译通过:
原因是上方创建新对象时没有参数,而下方对于构造函数的定义是有一个参数的,因此出现问题。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。解决方法:在上方加入参数或去掉下面的参数定义。
2.TestStaticInitializeBlock.java的运行结果
由结果可知,顺序为:1>各类的静态初始化块2>类的非静态初始化块3>类的构造函数4>子类的非静态初始化块5>子类的构造函数
各类的静态初始化块首先执行,因为static初始化块是在构造函数之前执行的。执行顺序先静态再非静态。
初始化是在类加载的时候完成的,而构造方法生成对象,生成对象是在类加载完成之后完成的。因此先加载,后生成对象,故先执行初始化块。
构造方法在初始化块后执行。在执行完非静态代码块后,会立即执行其构造函数,然后执行子类的非静态代码块,然后执行子类的构造方法
课件上的实验代码:总结Java字段初始化的规律
先说结论,初始化时优先级1>类的构造函数2>类的初始化块3>在执行类成员的时候默认给出的值, 另外顺序也会影响优先级
第一处未调用,初始化块在后来赋值之前,因此输出的为100即为赋值值;
第二处调用了构造方法,因此输出的为构造方法规定的300;
顺序的影响:如果我们把初始化块的顺序颠倒,结果如下:
-byAurora