有两个班级。一个继承自另一个。测试结果让我很吃惊
因为我调用了子类构造函数及其方法。但是我不像这样new Cougar().go();
调用超类构造函数。但输出显示调用了超类构造函数。你能解释一下为什么会这样吗?
public class Feline {
public String type = "f";
public Feline() {
System.out.println("feline");
}
}
public class Cougar extends Feline {
public Cougar() {
System.out.println("cougar");
}
public static void main(String[] args) {
new Cougar().go();
}
private void go() {
type = "c";
System.out.println(this.type + " " + super.type);
}
}
输出:猫科动物 美洲狮 c c
答案 0 :(得分:0)
如果构造函数没有显式调用超类构造函数,Java编译器会自动插入对超类的无参数构造函数的调用。
始终调用超类的构造函数。您可以使用" super()"来调用超类的所需构造函数。在子类构造函数的第一行。
例如:
public class Feline {
public Feline() {
System.out.println("Feline");
}
public Feline(String type) {
System.out.println(type);
}
...
}
public class Cougar extends Feline{
public Cougar() {
super("Cougar");
}
...
}
答案 1 :(得分:0)
因为线
new Cougar().go();
在“go”方法中,您重新定义了变量“type” 我希望它有意义。
答案 2 :(得分:0)
当我们调用子类构造函数时,java编译器会自动调用超类 构造函数。如果它不存在于超类中,我们将得到编译时错误。 如果Object是我们类的超类,那么没有问题,因为Object包含no-arg构造函数。
原因 - 调用超级构造函数的原因是,如果超类可以拥有需要由其构造函数初始化的私有字段。
答案 3 :(得分:0)
当您调用派生类的无参数构造函数时,运行时会在执行派生类构造函数之前自动调用无参数基类构造函数。由于这种行为,你会看到猫科动物美洲狮作为你输出中的前两个字符串。
现在对于输出的'c c'部分,您没有在Cougar类中定义新的String类型变量。如果go()方法/函数中的超类并将其设置为“c”,则使用相同的'type'变量。这就是你在输出中得到“c c”的原因。
让Cougar如下。语法是C#。
public class Cougar : Feline
{
public String type = "c";
public Cougar()
{
Console.Write("cougar ");
}
static void Main(String[] args)
{
new Cougar().go();
}
private void go()
{
Console.Write(this.type + " " + base.type);
}
}