Java 基类和导出类的初始化顺序

来源:互联网 发布:windows10推荐必备软件 编辑:程序博客网 时间:2024/06/02 05:20

摘录 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{@Overridepublic String toString() {// TODO Auto-generated method stubreturn "MyObject";}}class RoundGlyph extends Glyph {private MyObject radius = new MyObject();@Overridevoid 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) 调用导出类的构造器主体。

0 0