您好 今天早上我遇到了这个问题(我已经找到了解决办法)但是我很好奇为什么我的代码没有按照我想要的方式工作
public class classA
//(1)
public void function(GL10 gl){
function(gl,useGLUtilsBool, useMipMapBool);
}
//(2)
public void function(GL10 gl,boolean useGLUtils, boolean
useMipMap){
generateTexture(gl, useGLUtils, useMipMap);
}
}
@Override
public class classB extends
classA{
//(3)
public void function(GL10 gl, boolean useGLUtils, boolean
useMipMap) {
function(gl);
}
//(4)
@Override
public void function(GL10 gl) {
super.function(gl);
}
通常它应该做(3) - >(4) - >(1) - >(2) 但我得到(3) - >(4) - >(1) - >(3) - >(4) - >(1)......
我没有得到的是为什么classA函数(...)(1)会调用(3)而不调用(2)
答案 0 :(得分:6)
由于继承和polymorphism。您已在子类中重写(使用@Override
标记此方法)function(GL10 gl, boolean useGLUtils, boolean useMipMap)
方法,因此每次在类B
的实例上调用此方法时,都将调用重写方法,而不是超类中的一个
答案 1 :(得分:1)
它与Java的设计决策有关,默认情况下制作所有公共方法virtual。在像C ++这样明确必须将函数声明为虚拟的语言中,您将获得上述代码所期望的行为。 但是在Java中,调用将始终最终转到继承链最下面的方法,除非你使用超级前缀强制它调用更高的方法。