Java中对象实例化的顺序

来源:互联网 发布:如何开通淘宝直播间 编辑:程序博客网 时间:2024/04/30 13:44
 

我认为要学好一门编程语言,深刻理解它的运行顺序是至关重要的,这能很大程度的减少我们的错误率。

Java是一门完全面对对象的程序,可以说是目前对面对对象思想支持最好的一门编程语言。我测试了一下java中对象实例化顺序。

测试结果如下:

1.       第一步,调用构造函数。

2.       第二步,如果在构造函数的第一行发现有super(参数)那么就调用父类的带相应参数的构造函数,如果没有发现super (参数)那么就调用父类的默认构造函数,不管那一种再调用构造函数的第2行之前都将进入下面的第三步。

3.       第三步,在调用构造函数的第2行之前,将跳到程序的第一行,开始实例化我们在函数,和构造函数外定义的变量,和常量(静态变量不一样,他们在程序字节码被加载时就已完成),然后再跳到构造函数的第二行开始执行。

从这三步我们将不难知道:

1.       为什么super(…)一定要放在子类构造函数的第一行才能通过编译,放在别的地方不行。

2.       就能很好的解释下面的现象class Father{

Public father(){ System.out.println(“1”)

 }

public father(String name){System.out.println(“2”);    }

}

public class child extends Father{

public child(String name){}

 public static void main(String s[]){new child(“”);}

}

public class child2 extends Father{

public child2(String name){super(name);}

public static void main(String s[]){new child2(“”);}

}

 

运行上面的的程序child为什么会打印1而不是2, 运行child2打印的是2而不是1的原因了。

 

3.       public class child3 extends child{

public child3(String name){super(name);//如果把super(name)去掉将不能通过编译

}

public static void main(String s[]){new child3(“”);}

}

如上面的程序,如果把super(name)去掉将不能通过编译,因为其父类child没有默认的构造函数,通过我们的测试知道要是没有super(name)的话,它将会找父类的默认构造函数,那当然是找不到,所以我们要调用super(name)告诉JVM我们将调用父类的那个构造函数。

今天学习日记就写到这里了