继承构造函数调用结果

时间:2014-12-03 11:31:20

标签: java inheritance constructor

有两个班级。一个继承自另一个。测试结果让我很吃惊 因为我调用了子类构造函数及其方法。但是我不像这样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

4 个答案:

答案 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构造函数。

原因 - 调用超级构造函数的原因是,如果超类可以拥有需要由其构造函数初始化的私有字段。

Refer this link for more info.

答案 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);
    }
}
相关问题