父类构造器的隐式调用和显式调用

来源:互联网 发布:hf213网络上是什么意思 编辑:程序博客网 时间:2024/06/05 16:52

     #当调用某个类的构造器来创建Java对象时,系统总是会先调用父类的非静态初始化块进行初始化。这个调用是隐式执行的,而且父类的静态初始化块总是会被执行。接着会调用父类的一个或多个构造器执行初始化,这个调用既可以通过super进行显式调用,也可以隐式调用。

      当所有父类的非静态初始化块,构造器依次调用完成后,系统才调用本类的非静态初始化块,构造器执行初始化块,最后返回本类的实例。

      如下例:

package com.construct;class Creature{{System.out.println("Creature的非静态初始化块");} //下面定义两个构造器public Creature() {System.out.println("Creature无参数的构造器");}public Creature(String name) {//使用this调用另一个重载的,无参数的构造器this();System.out.println("Creature带有name参数的构造器,name参数:"+name);}}class Animal extends Creature{{System.out.println("Animal的非静态初始化块");}public Animal(String name) {        super(name);        System.out.println("Animal 带一个参数的构造器,name参数: "+name);}public Animal(String name ,int age) {//使用this调用另一个重载的构造器this(name);System.out.println("Animal 带两个参数的构造器,其age: "+age);}}class Wolf extends Animal{{System.out.println("Wolf的非静态初始化块");}public Wolf() {//显示调用父类的带两个参数的构造器super("灰太狼",3);System.out.println("Wolf的无参数的构造器");}public Wolf(double weight) {//使用this调用另一个重载的构造器this();System.out.println("Wolf的带weight参数的构造器,weight参数: "+weight);// TODO Auto-generated constructor stub}}public class InitTest {public static void main(String[] args) {// TODO Auto-generated method stub       new Wolf(6.6);}}

# 结果:

Creature的非静态初始化块
Creature无参数的构造器
Creature带有name参数的构造器,name参数:灰太狼
Animal的非静态初始化块
Animal 带一个参数的构造器,name参数: 灰太狼
Animal 带两个参数的构造器,其age: 3
Wolf的非静态初始化块
Wolf的无参数的构造器
Wolf的带weight参数的构造器,weight参数: 6.6


# 分析:
  上述程序是按照如下步骤进行初始化的:

    1.执行Object类的非静态初始化块(如果有的话)

    2.隐式或显式调用Object类的一个或多个构造器执行初始化

    3.执行Creature的非静态初始化块

    4.隐式或显式调用Creature类的一个或多个构造器执行初始化

    5.执行Animal的非静态初始化块

    6.隐式或显式调用Animal类的一个或多个构造器执行初始化

    7.执行Wolf的非静态初始化块

    8.隐式或显式调用Wolf类的一个或多个构造器执行初始化

0 0