Java中的每个方法都是可覆盖的

时间:2014-04-17 13:33:54

标签: java oop

Java中的每个方法都是可覆盖的吗?我知道在C#方法中定义为virtual可以被覆盖,这是如何在Java中实现的?

3 个答案:

答案 0 :(得分:13)

并非每个方法都可以覆盖:您无法覆盖finalprivatestatic的方法。

下面的

是这在实践中意味着什么的一个小样本:

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方法更改为publicprotected仍然不允许您覆盖它。

答案 1 :(得分:4)

final,static和private方法不可覆盖。其余的都是。

  

最终会阻止覆盖,因为这就是它的意图。

     

静态表示属于 Class 而非实例。

     

私人 - 没有可见性,没有覆盖。

此外,当JIT将方法视为不可覆盖时,JIT会更高兴,因为它意味着方法的单态分派,这意味着它是用于内联方法的完美候选,因为没有其他方法可以覆盖此实例的实例。这对你来说可能并不重要,但它几乎加速了这个方法。

答案 2 :(得分:1)

不,不是全部都是。标有finalprivatestatic修饰符的方法根本无法覆盖。