注册构造函数的两个OO问题

noM*_*MAD 1 java oop

我有以下两个类:

public class Animal {
    public Animal() {
        this("Animal->Horse");
        System.out.println("Class Animal default const");
    }

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

public class Pegasus extends Animal {
        public Pegasus() {
        System.out.println("Class Pegasus default const");
    }

    public static void main(String[] args)
    {
        Animal animal = new Animal("Black Horse");
        animal.name = "Pegasus";
        Pegasus pegasus = new Pegasus();
        pegasus.name = "White Horse";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,我得到:

Black Horse
Animal->Horse
Class Animal default const
Class Pegasus default const
Run Code Online (Sandbox Code Playgroud)

Q1:为什么Animal->Horseanimal创建实例时只打印一次而不是在pegasus创建实例时打印?基本上它是从默认构造函数调用的.另外为什么不animal打印实例Class Animal default const

Q2:当我创建pegasus实例时,有没有办法不调用class Animal默认构造函数并只调用class Pegasus默认构造函数?

Jon*_*eet 7

Q1:为什么Animal-> Horse只在创建动物实例时打印一次而不是在创建pegasus实例时打印?

这是倒过来-这是不是当你调用正在打印Animal(String)与构造new Animal("Black Horse"),但它当你调用正在打印Pegasus()进而调用构造函数Animal()进而调用构造函数Animal(String)构造函数.

我强烈建议你在构造函数调用后添加一行额外的诊断文本new Animal("Black Horse").这将帮助您更清楚地了解正在发生的事情.

Q2:当我创建pegasus实例时,有没有办法让它不要调用类Animal的默认构造函数

好吧,它可以调用Animal(String)构造函数,例如

super("Pegasus");
Run Code Online (Sandbox Code Playgroud)

但它必须调用一些构造函数Animal.当你创建一个类的实例,在其继承层次的类必须通过在每个班至少有一个构造函数初始化.