![](/img/trans.png)
[英]Java: Avoid warning “Overridable method call in constructor” by using final setters
[英]Is every method in Java overridable
Java中的每個方法都是可覆蓋的嗎? 我知道在定義為虛擬的C#方法中可以覆蓋,這是如何在Java中實現的?
並非每個方法都可以覆蓋:您不能覆蓋final
, private
和static
。
以下是這在實踐中意味着什么的一個小樣本:
class Base {
public final void fun1() {
}
private void fun2() {
System.out.println("Base::fun2");
}
public void fun2Call() {
fun2();
}
}
class Rextester extends Base
{
/*
@Override
public void fun1() { // compile error, because Base::fun1 is final
}
*/
// if @Override is uncommented, it will protect you from overriding private methods
// otherwise you will not get any compile time error.
//@Override
private void fun2() {
System.out.println("Rextester::fun2");
}
public static void main(String args[])
{
Base b = new Rextester();
b.fun2Call(); // will output Base::fun2,
// if you change private to protected or public
// then you will see Rextester::fun2 in output
}
}
我認為static
方法覆蓋與private
方法覆蓋的情況相同,至少你會得到類似的行為。 當然,將static
方法更改為public
或protected
仍然不允許覆蓋它。
final,static和private方法不可覆蓋。 其余的都是。
最終防止覆蓋,因為,這就是它的意思。
static意味着屬於Class而不是實例。
私人 - 沒有知名度,沒有超越。
此外,JIT在將方法視為不可覆蓋時更快樂,因為它意味着方法的單態分派,這意味着它是內聯方法的完美候選者,因為沒有其他實例可以覆蓋此方法。 這對你來說可能並不重要,但它幾乎加速了這個方法。
不,不是全部。 標有final
, private
, static
修飾符的方法根本不可覆蓋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.