在java程序中,创建java对象,其初始化顺序总是先调用最顶层父类的初始化操作,包括初始化块和构造器,然后再向下调用其他类的初始化操作。
类和实例的初始化顺序可以参考
先看看代码例子
package java_zhaohuaxishi; class GrandFather{ { System.out.println("GrandFather--非静态代码块"); } public GrandFather(){ System.out.println("GrandFather--无参构造器"); } public GrandFather(String name){ this(); System.out.println("GrandFather--有参构造器"+"名字:"+name); } } class Father extends GrandFather{ { System.out.println("Father--非静态代码块"); } public Father(){ System.out.println("Father--无参构造器"); } public Father(String name){ super(name); System.out.println("Father--有参构造器"+"名字:"+name); } } class Son extends Father{ { System.out.println("Son--非静态代码块"); } public Son(){ super("向上"); System.out.println("Son--无惨构造器"); } public Son(String name) { this(); System.out.println("Son--有参构造器"+"名字:"+name); } } public class ConstructorTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new Son("小明"); } }
程序运行结果如下
GrandFather--非静态代码块 GrandFather--无参构造器 GrandFather--有参构造器名字:向上 Father--非静态代码块 Father--有参构造器名字:向上 Son--非静态代码块 Son--无惨构造器 Son--有参构造器名字:小明
从上述结果看到,构造器的初始化过程实际上会根据具体调用this或者super的方法来进行,是一个递归操作。
构造器使用super显式调用的是父类的构造器,再根据具体的参数执行父类的具体构造器;而this也是显示调用本类的构造器,也会根据参数来执行。
然而,当子类构造器中没有显示使用super和this的话,则会在子类构造器执行之前隐式调用父类无参构造器。
我把上述代码中
public Son(){ //super("向上"); System.out.println("Son--无惨构造器"); }
super带参调用注释掉,则输出结果如下:
GrandFather--非静态代码块 GrandFather--无参构造器 Father--非静态代码块 Father--无参构造器 Son--非静态代码块 Son--无惨构造器 Son--有参构造器名字:小明
值得注意的是:super和this的调用必须作为构造器第一行代码,且最多只能选其中一种来进行调用。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-14 00:44:31