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);
}
}