【问题标题】:Inheritance constructor calling result继承构造函数调用结果
【发布时间】:2014-12-03 11:31:19
【问题描述】:

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

}

输出:猫科动物 美洲狮 cc

【问题讨论】:

    标签: java inheritance constructor


    【解决方案1】:

    如果构造函数没有显式调用超类构造函数,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");
        }
        ...
    }
    

    【讨论】:

    • 你无法避免调用超类构造函数。检查编辑后的答案以获得可能的解决方案
    • 在您的解决方案中,美洲狮不会扩展猫
    • 这是一个错误,美洲狮像往常一样延伸猫科动物
    【解决方案2】:

    因为线

    new Cougar().go();
    

    在“go”方法中,您重新定义了变量“type”。
    我希望这是有道理的。

    【讨论】:

    • 我试过 new Cougar();而不是 new Cougar().go();但结果猫美洲狮。这意味着超级构造函数也被调用了。
    【解决方案3】:

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

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

    Refer this link for more info.

    【讨论】:

    • 在我的问题的超类中没有私有字段
    • 原因表明你可以有私有字段。
    【解决方案4】:

    当您调用派生类的无参数构造函数时,运行时会在执行派生类构造函数之前自动调用无参数基类构造函数。由于这种行为,您会在输出中看到 feline cougar 作为前两个字符串。

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

    如下制作美洲狮。语法是 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);
        }
    }
    

    【讨论】:

    • 感谢您的回答,但我的问题是为什么基类构造函数调用,尽管没有调用子类
    • 在调用派生构造函数时调用基类构造函数是一种 Java 运行时行为。都是无参数构造函数。
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2023-04-03
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多