代码之家  ›  专栏  ›  技术社区  ›  Jason Rogers

Java无限循环/调用

  •  2
  • Jason Rogers  · 技术社区  · 14 年前

    您好! 今天早上我碰到了这个问题(我已经找到了解决方法),但是我很好奇为什么我的代码没有按我想要的那样工作

        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)

    2 回复  |  直到 14 年前
        1
  •  6
  •   Bozho    14 年前

    因为继承权和 polymorphism . 你已重写(用 @Override )那个 function(GL10 gl, boolean useGLUtils, boolean useMipMap) 方法,因此每次对类的实例调用此方法时 B ,将调用重写方法,而不是超类中的方法

        2
  •  1
  •   Zareth    14 年前

    它与Java的设计决策有关,使得所有的公共方法 virtual 默认情况下。在C++这样的语言中,您必须明确地声明函数是虚拟的,您可以通过上面的代码得到预期的行为。 然而,在Java中,除非使用super前缀强制调用一个更高的方法,否则调用将始终指向继承链中最远的方法。