我有以下两个类:
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->Horse在animal创建实例时只打印一次而不是在pegasus创建实例时打印?基本上它是从默认构造函数调用的.另外为什么不animal打印实例Class Animal default const?
Q2:当我创建pegasus实例时,有没有办法不调用class Animal默认构造函数并只调用class Pegasus默认构造函数?
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.当你创建一个类的实例,都在其继承层次的类必须通过在每个班至少有一个构造函数初始化.