为什么使用super来调用除被推翻的方法之外的其他方法?

Fan*_*ang 4 java inheritance

在oracle教程中,它说:如果你的方法覆盖了它的一个超类的方法,你可以通过使用关键字super 来调用重写的方法.

它提到了在重写方法中使用super.

但是,事实上,在我编写的示例程序中,我可以使用超级关键字来访问超类中的任何方法.

这里的问题是:为什么大多数人在网上谈论超级的使用,他们总是在谈论覆盖方法的调用?

我的意思是,为什么不建议"使用super来调用超类中的其他方法"?


顺便说一句,这里还有一个问题:我们不能在静态方法中使用super.编译器不会让我们这样做.

是因为变量"super"属于一个对象而不是类,就像关键字"this"一样?静态方法属于一类,和静态方法不具有变量"超级"?

Ric*_*gle 6

为什么在方法foo()之外使用super.foo()是一个坏主意

它表明仍然需要旧方法(并且做了与方法的子版本不同的东西),在这种情况下,你可能不应该首先覆盖它.父方法在子对象中仍然"有意义".

在同一个对象中使用但具有不同效果的两个同名方法听起来像是一个可读性的噩梦.鉴于两者都被使用,它们似乎很可能是使用不同方法名称的单独方法,使它们的细微差别清晰.

为什么使用super.foo()来引用未被覆盖的方法是一个坏主意

这在语义上是一个非常奇怪的事情.父母(非私人)方法孩子的方法,除非被覆盖,使用super.method()具有相同的效果method(),因此你没有看到这提到就不足为奇了.正如您所认为的,如果您稍后重写该方法,它也很可能在将来导致错误.

与此类似,您可以放在public界面方法的前面,但它没有任何效果.

为什么你不能使用super与静态方法

静态方法不能被覆盖,如果父类和子类恰好具有相同的方法名称,就编译器而言只是一个巧合(尽管它确实隐藏了父类中的静态方法 - 它不会覆盖它).鉴于无法使用super关键字覆盖静态方法来访问静态方法变得毫无意义.此外,您可以在Foo中访问静态方法

Foo.staticMethod();