由于Java中的运行时方法绑定功能,方法覆盖起作用。因此,如果我们强制Java编译器对方法进行静态绑定,则可以防止该方法在派生类中被覆盖。
我们可以通过3种方式防止Java中的方法覆盖
通过在基类中创建final方法
通过在基类中使方法静态化
通过在基类中将方法设为私有
通过将一个方法设为final,我们添加了一个限制,即派生类不能覆盖这个特定的方法。
class Base { public void show() { System.out.println("Base class show() method"); } public final void test() { System.out.println("Base class test() method"); } } class Derived extends Base { public void show() { System.out.println("Derived class show() method"); } //不能重写test()方法,因为它在基类中是final /* * public void test() { System.out.println("Derived class test() method"); } */ } public class Test { public static void main(String[] args) { Base ref = new Derived(); //调用final 方法 test() ref.test(); //调用重写的方法 show () ref.show(); } }
输出结果
Base class test() method Derived class show() method
我们不能覆盖派生类中的静态方法,因为静态方法是与类而不是与对象链接的。这意味着,当我们调用静态方法时,JVM不会像对所有非静态方法一样将此引用传递给它。因此,静态方法无法进行运行时绑定。
class Base { public void show() { System.out.println("Base class show() method"); } public static void test() { System.out.println("Base class test() method"); } } class Derived extends Base { public void show() { System.out.println("Derived class show() method"); } //将被视为新方法 public static void test() { System.out.println("Derived class test() method"); } } public class Test { public static void main(String[] args) { Base ref = new Derived(); //它将调用 Base 类的 test () ,因为它具有静态绑定 ref.test(); //调用重写的方法 show () ref.show(); } }
输出结果
Base class test() method Derived class show() method
基类的私有方法在派生类中不可见,因此不能覆盖它们。
class Base { public void show() { System.out.println("Base class show() method"); } private void test() { System.out.println("Base class test() method"); } } class Derived extends Base { public void show() { System.out.println("Derived class show() method"); } //这不是替代方法,将被视为其他方法。 public void test() { System.out.println("Derived class test() method"); } } public class Test { public static void main(String[] args) { Base ref = new Derived(); //无法调用私有方法test(),此行将给出编译时错误 //ref.test(); //调用重写的方法 show () ref.show(); } }
输出结果
Derived class show() method