摘录 Java编程思想
1) 调用基类的构造器
2) 按照声明顺序调用成员的初始化方法
3) 调用到处类构造体的主体
==================================
顺序 : 层层递归到基类
按照编译,
Java中Static 相当于 一个全局变量,所以应该首先被初始化,防止引起编译错误。而且需要全部被初始化,从基类到最终的导出类。
然后 因为导出类 从基类导出,所以首先应该初始化 基类。
基类的初始化顺序 因为成员变量 只会 造成子类即导出类。 构造函数可能会使用到类中的变量,所以在调用构造器之前一定要使得成员变量即域初始化。
首先初始化 成员变量,然后初始化相应的构造器,初始化完成,接着层层初始化 后续的导出类。
=================================
2015.1.13 补充
上述的内容还不是十分完整。
首先我们先看地下的程序,介绍下 构造器内部的多态方法的行为。
- package chapter8_6;
- class Glyph {
- void draw(){System.out.println("Glyph Draw()");}
- Glyph(){
- System.out.println("Glyph() before draw()");
- draw();
- System.out.println("Glyph() after draw()");
- }
- }
- class MyObject{
- @Override
- public String toString() {
- // TODO Auto-generated method stub
- return "MyObject";
- }
- }
- class RoundGlyph extends Glyph {
- private MyObject radius = new MyObject();
- @Override
- void draw(){System.out.println("RoundGlyph Draw(), radius = "+radius);}
- public RoundGlyph(MyObject r){
- radius = r;
- System.out.println("RoundGlyph().draw(),radius = "+radius);
- }
- }
- public class PolyConstructors extends Glyph {
- public static void main(String[] args) {
- new RoundGlyph(new MyObject());
- }
- }
package chapter8_6;
class Glyph {
void draw(){System.out.println("Glyph Draw()");}
Glyph(){
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyph() after draw()");
}
}
class MyObject{
@Override
public String toString() {
// TODO Auto-generated method stub
return "MyObject";
}
}
class RoundGlyph extends Glyph {
private MyObject radius = new MyObject();
@Override
void draw(){System.out.println("RoundGlyph Draw(), radius = "+radius);}
public RoundGlyph(MyObject r){
radius = r;
System.out.println("RoundGlyph().draw(),radius = "+radius);
}
}
public class PolyConstructors extends Glyph {
public static void main(String[] args) {
new RoundGlyph(new MyObject());
}
}
===============================
// Output:
Glyph() before draw()
RoundGlyph Draw(), radius = null
Glyph() after draw()
RoundGlyph().draw(),radius = MyObject
===============================
基类构造函数中含有某个被到处类覆盖的函数,如 Draw() 在初始化 基类时候,因为到处类还没有进行初始化,但是动态绑定方法的时候绑定到了子类的方法,所以分配给对象的存储空间的初始化为二进制的零。 对于int类型 初始化为 0 对于 Object对象 初始化 为 null
初始化的实际过程是:
1) 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
2) 如前所述的那样调用基类构造器。
3) 按照声明的顺序调用成员的初始化方法。
4) 调用导出类的构造器主体。