Java 为什么即使我只调用了super.speak()一次,这段代码在执行时仍会打印两次“Woof”?
这是非常令人困惑的,因为我不知道为什么超级类的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(低音)。 将代码更改为: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只是指
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");
}
}