关于final或 private修饰父类中某方法,子类不可重写此方法,但关于private final修饰的方法,似乎可以进行覆盖,我们看以下代码
class Parents{ private final void doit(){ System.out.println("parent:doit"); } final void doit2(){ System.out.println("parent:doit2"); } public void doit3(){ System.out.println("parent:doit3"); } } class Sub extends Parents{ public final void doit(){ System.out.println("sub:doit"); } public final void doit3(){ System.out.println("sub:doit3"); } } public class FinalMethod { public static void main(String[] args) { Sub s=new Sub(); s.doit(); Parents p=s; //p.doit(); 这里不能运行,所以注释掉 p.doit2(); p.doit3(); } }
在这段代码中,由于动态绑定,p的实际类型是子类的,然后调用方法是先到子类中找,doit2在父类中找到,属于向上查找,而doit3属于重写,
然后我们回头看doit方法,doit如果是重写的话,是可以运行的,但他不能运行,所以不是重写,而是生成了一种新的方法,由于doit并没有覆盖父类中的doit,但是他们函数名相同,所以p.doit并不能运行,它并不是正常覆盖,类是继承的,但是他的方法并不属于重写,也不属于自身扩展父类的方法(父类中存在),正是既与父类中有同名的方法,但是并没有进行重写。所以导致了他的不可运行