Java构造函数多次调用?

时间:2018-10-21 22:55:02

标签: java

我构建了一个程序来测试Java继承,有几个类:

public class Animal {
    String name = "";
    String kind = "";

    public Animal() {
        System.out.println(desc());
    }

    public Animal(String name) {
        this.name = name;
        System.out.println(desc());
    }


    String desc() {
        if (name == "") {
            return "Je suis un animal.";
        } else {
            return "Je suis un animal de nom " + name + ".";
        }
    }
}




public class Mamifere extends Animal {    
    public Mamifere() {
        System.out.println(desc());
    }

    public Mamifere(String name) {
        this.name = name;
        System.out.println(desc());
    }

    String desc() {
        return super.desc() + " Je suis un mamifère.";
    }    
}

public class Homme extends Mamifere {    
    public Homme() {
        System.out.println(desc());
    }

    public Homme(String name) {
        this.name = name;
        System.out.println(desc());
    }

    String desc() {
        return super.desc() + " Je suis un homme.";
    }    
}

public class Chien extends Mamifere {    
    public Chien() {
        System.out.println(desc());
    }

    public Chien(String name) {
        this.name = name;
        System.out.println(desc());
    }

    String desc() {
        return super.desc() + " Je suis un chien.";
    }    
}

当我运行此代码时:

public class TestAnimal {

    public static void main(String[] args) {
        Animal[] animaux = new Animal[5];
        animaux[0] = new Animal("Truc");
        animaux[1] = new Animal();
        animaux[2] = new Chien("Medor");
        animaux[3] = new Homme();
        animaux[4] = new Homme("Robert");

    }

}

我得到以下输出:

Je suis un animal de nom Truc.
Je suis un animal.
Je suis un animal. Je suis un mamifère. Je suis un chien.
Je suis un animal. Je suis un mamifère. Je suis un chien.
Je suis un animal de nom Medor. Je suis un mamifère. Je suis un chien.
Je suis un animal. Je suis un mamifère. Je suis un homme.
Je suis un animal. Je suis un mamifère. Je suis un homme.
Je suis un animal. Je suis un mamifère. Je suis un homme.
Je suis un animal. Je suis un mamifère. Je suis un homme.
Je suis un animal. Je suis un mamifère. Je suis un homme.
Je suis un animal de nom Robert. Je suis un mamifère. Je suis un homme.

为什么用参数少了构造函数构造的对象有这么多重复?

谢谢

1 个答案:

答案 0 :(得分:1)

随着Chien扩展MammifereMamifere扩展Animal:当您想实例化一个Chien时,它也会像原样构建一个Mamifere超级类型,因此它也建立了Animal,因为它也是超级类型

  • 您正在看到desc构造函数启动的Chien方法
  • 您正在看到desc构造函数启动的Mamifere方法
  • 您看到的是desc构造函数发起的Animal方法

Homme