Java 为什么即使我只调用了super.speak()一次,这段代码在执行时仍会打印两次“Woof”?

Java 为什么即使我只调用了super.speak()一次,这段代码在执行时仍会打印两次“Woof”?,java,inheritance,super,Java,Inheritance,Super,这是非常令人困惑的,因为我不知道为什么超级类的speak方法运行了两次,即使我只调用了一次。最终结果是Woof\n Woof\n arf arf 我不知道为什么超级类的speak方法运行了两次,即使我只调用了一次。* 你叫它两次 当你调用d.speak时直接调用它; 然后在调用b.speak时间接调用它,因为b.speak首先调用super.speak。 编辑: 因为我们在叫b说,d说- b、 speak不直接显示低音。没有打印。。。语句以显示纬向 它调用super.speak。speak只是指

这是非常令人困惑的,因为我不知道为什么超级类的speak方法运行了两次,即使我只调用了一次。最终结果是Woof\n Woof\n arf arf

我不知道为什么超级类的speak方法运行了两次,即使我只调用了一次。*

你叫它两次

当你调用d.speak时直接调用它; 然后在调用b.speak时间接调用它,因为b.speak首先调用super.speak。 编辑:

因为我们在叫b说,d说-

b、 speak不直接显示低音。没有打印。。。语句以显示纬向

它调用super.speak。speak只是指在父类(恰好是Dog类)的speak方法中执行代码。这样就显示了纬线

然后显示arf arf

因此:

d、 说话会显示低音。 b、 speak(说话)将显示woof(低音)和arf(低音)arf(低音)。 将代码更改为:

public class Dog
{
    public void speak()
    {
        System.out.println("woof!");
    }

    public static void main(String[] args)
    {
        Dog d = new Dog();
        d.speak();
        Dog b = new Beagle();
        b.speak();
    }
}

class Beagle extends Dog
{
    public void speak()
    {
        super.speak();
        System.out.println("arf arf");
    }
}

查看如上所述的输出。

请参见注释中的注释

System.out.println("Dog is about to speak:");
d.speak();
Dog b = new Beagle();
System.out.println("Beagle is about to speak:");
b.speak();

基本上,当你在比格犬课上讲super.speak时,你会打两次电话。如果要消除重复呼叫,可能需要删除super.speak呼叫。当您调用super时,您正在调用super类方法

public static void main(String[] args)
{
    Dog d = new Dog();
    d.speak();  // calls Dog.speak() -> prints "woof!"
    Dog b = new Beagle();
    b.speak(); // calls Beagle.speak() -> 
               // prints "woof!" via call to super.speak() 
               // and then "arf arf"
} 
另外,您可能希望用@Override注释Beagle.speak方法,以便可以理解您正在从超类重写该方法

旁注:
我还将主方法与超级类分离。。。如果您开始学习Java编程,我会看一看坚实的原则,第一个原则是单一责任原则。基本上这意味着每个类和方法应该只有一个职责。

因为您调用d.speak和b.speak。在Beagle中,您使用super.speak调用超类版本的重写方法。那么,当运行子类时,超类main方法中的所有内容都会自动执行吗?因为我调用了d.speak、b.speak和super.speak,所以woof不应该被打印三次吗?不,当你重写一个方法时,原始方法将不再执行,除非你调用super.xxx。。。在重写中。你可以通过添加额外的打印语句来确定顺序,或者在调试器中运行。我仍然不明白为什么它不打印三次。我没有写这段代码,所以请原谅我不理解它是如何工作的,但据我所知,woof不应该被打印三次,因为我们正在调用b.speak、d.speak和super.speak?很抱歉给您带来困惑,我对继承有点陌生。b.speak除了调用super.speak外,不打印Woof。好的,收到了。非常感谢,我想我现在更了解它了。非常感谢高级开发人员@ShyamVyas但你接受了不同的答案?
public class Main {

    public static void main(String[] args) {
        Dog d = new Dog();
        d.speak();
        Dog b = new Beagle();
        b.speak();

    }
}

class Dog
{
    public void speak()
    {
        System.out.println("woof!");
    }

}

class Beagle extends Dog
{
    @Override
    public void speak()
    {
//        super.speak();
        System.out.println("arf arf");
    }
}