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

Mic*_*l27 4 java oop

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

mar*_*inj 13

并非每个方法都可以覆盖:您不能覆盖那些方法final,privatestatic.

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为static方法覆盖与方法覆盖的情况相同private,至少你会得到类似的行为.当然改变static方法public或者protected仍然不允许你覆盖它.

  • 所以这是正确的,但考虑补充说OP的问题的具体答案是否定的,并非每个方法都可以重写.另外,我不认为java具有C#与"虚方法"的区别 (2认同)