关于private final修饰符(private final void inf(){})

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


猜你喜欢

转载自blog.csdn.net/m0_37687058/article/details/78535752