Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承构造函数调用结果_Java_Inheritance_Constructor - Fatal编程技术网

Java 继承构造函数调用结果

Java 继承构造函数调用结果,java,inheritance,constructor,Java,Inheritance,Constructor,有两个班。一个是从另一个继承来的。测试结果令我惊讶 因为我调用了子类构造函数及其方法。但是我不会像这样调用超级类构造函数newcougar().go()。但输出显示调用超类构造函数的结果。你能解释一下为什么会这样吗 public class Feline { public String type = "f"; public Feline() { System.out.println("feline"); } } public class Cougar extends Feline

有两个班。一个是从另一个继承来的。测试结果令我惊讶 因为我调用了子类构造函数及其方法。但是我不会像这样调用超级类构造函数
newcougar().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);
}

}
输出:猫 美洲狮
如果构造函数没有显式调用超类构造函数,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");
    }
    ...
}
这是因为线

new Cougar().go();
在“go”方法中,您重新定义了变量“type”。

我希望这是有意义的。

当我们调用子类构造函数时,java编译器会自动调用超级类 若它不存在于超类中,我们将得到编译时错误。 如果Object是我们类的超类,那么就没有问题,因为Object不包含arg构造函数

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


当您调用派生类的无参数构造函数时,运行时会在执行派生类构造函数之前自动调用无参数基类构造函数。由于这种行为,您将猫科美洲狮视为输出中的前两个字符串

现在,对于输出的'cc'部分,您没有在Cougar类中定义新的字符串类型变量。如果go()方法/函数中的超类是同一个“type”变量,并将其设置为“c”。这就是您在输出中获得“c”的原因

制作美洲狮如下。语法是C#


您无法避免对超类构造函数的调用。检查编辑后的答案以获得可能的解决方案在您的解决方案中,美洲豹不延伸猫科动物。这是一个错误,美洲豹延伸猫科动物是因为通常都在尝试新的美洲豹();而不是新的美洲狮;但结果却是猫科美洲狮。这意味着超级构造函数也被调用。在我的问题的超类没有私有字段中,原因表明你可以有私有字段。谢谢你的回答,但我的问题是,为什么基类构造函数在调用派生类时调用而不调用子类是Java运行时行为构造器。都是无参数构造函数。
 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);
    }
}