标签:简单的 pre order tle print cto xtend 空间 padding
Java对象的初始化步骤如下:
1.首先将分配给对象的存储空间初始化为二进制的零;
2.如果有继承,则先调用基类的构造器;
3.按照声明的顺序调用成员的初始化方法;
4.调用导出类的构造器主体.
看下面的例子:
class Glyph { void draw() { System.out.println("Glyph.draw()"); } Glyph() { System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); } } class RoundGlyph extends Glyph { private int radius = 1; RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph.RoundGlyph().radius = " + radius); } void draw() { System.out.println("RoundGlyph.draw().radius = " + radius); } } public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); } }
输出结果:
结果分析:
1).导出类RoundGlyph覆盖了基类Glyph中的draw()方法.当基类Glyph构造器调用draw方法时,实际会调用RoundGlyph的draw()方法;
2).由于对象初始化时,首先将分配给对象的存储空间初始化为二进制的零,因此此时radius的值为0.
结论:
1).编写构造器时有一条有效的准则:"用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法";
2).在构造器内唯一能安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法).这些方法不能被覆盖,因此也就不会出现上述令人惊讶的问题.
标签:简单的 pre order tle print cto xtend 空间 padding
原文地址:http://www.cnblogs.com/miotyan/p/7137016.html