使用继承时,对象的初始化过程

来源:互联网 发布:vb基础代码 编辑:程序博客网 时间:2024/06/06 02:02

在java中使用继承时对象的初始化过程与新建对象略有不同:

class Insect{private int i=printInit("static insect.i initialized");;protected int j;public static int m=printInit("static insect.m initialized");Insect(){System.out.println("i="+i+", j="+j);j=39;}private static int x1=printInit("static Insect.x1 initialized");static int printInit(String s){System.out.println(s);return 47;}}public class Beatle extends Insect{private int k=printInit("Beatle.k initialized");public Beatle(){System.out.println("k="+k);System.out.println("j="+j);}private static int x2=printInit("static beetle.x2 initialized");public static void main(String[] args){System.out.println("hello world constructor");Beatle h=new Beatle();}}

上述代码运行结果为:

static insect.m initializedstatic Insect.x1 initializedstatic beetle.x2 initializedhello world constructorstatic insect.i initializedi=47, j=0Beatle.k initializedk=47j=39

由此可以看出整个初始化过程应当为:

1. 编译器首先试图访问Beatle.main(),当编译器发现这是一个static方法并且初次被调用时便开始查找Beetle.class的源代码,在此过程中发现Beetle有一个基类于是便开始查找并加载Insect的代码,如果Insect仍有基类那么该过程将持续进行;

2. 代码完成以后便开始依次序对基类中的static成员进行初始化,然后是对子类中的static成员进行初始化;

3. 由于未创建对象,此时不会执行非static成员的初始化以及构造函数的调用,程序继续运行下一个语句,输出:hello world constructor

4. 下一条语句中执行了创建新对象,于是按照基类非static成员初始化→基类构造函数→子类非static成员初始化→子类构造函数的过程完成整个初始化;


总之,就是java中的文件只在使用时才进行加载;当初次创建对象或者调用static域以及static方法时,编译器会完成文件的加载以及static成员的初始化,加载顺序自顶向下;当创建新对象时,编译器会自顶向下的依次完成父类以及子类的初始化。

0 0
原创粉丝点击