关于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并不能运行,它并不是正常覆盖,类是继承的,但是他的方法并不属于重写,也不属于自身扩展父类的方法(父类中存在),正是既与父类中有同名的方法,但是并没有进行重写。所以导致了他的不可运行