今天上JAVA实验课是,发现子类重写方法调用父类被重写方法时,如果父类方法是递归形式,却是调用了子类的方法。
代码如下子类重写方法class GCD
{
public int f(int a, int b)
{
if (b == 0)
return a;
return f(b, a % b);//当为子类调用时,这句却是调用了调用子类中的f,导致递归错误
}
}
class LCM extends GCD
{
public int f(int a, int b)
{
return a * b / super.f(a, b);//调用父类中的f
}
}
class MAIN
{
public static void main(String args[])
{
LCM lcm = new LCM();
System.out.println(lcm.f(10, 8));
}
}
有什么办法让父类的方法调用父类被重写的方法,或者是指明调用某个类的方法

解决方案 »

  1.   

    class GCD
    {
    public int f(int a, int b)
    {
    if (b == 0)
    return a;
    return f(b, a % b);//当为子类调用时,这句却是调用了调用子类中的f,导致递归错误
    }
    } 你这个方法本身就是无限递归,只要调用这个方法 ,就会无限递归,无论怎样继承重写.因为父类调用只是父类的方法.
      

  2.   

    有什么办法让父类的方法调用父类被重写的方法,或者是指明调用某个类的方法
    Java中还没见过这么做, 如果是C++的话,那是可以的
      

  3.   

    答:要不就将该递归方法:
    public int f(int a, int b) 加上:final算了。
      

  4.   

    执行
    GCD gcd = new GCD();
    System.out.println(gcd.f(10, 8));
    是没有问题,可以得到预期的结果,说明GCD类编写没有问题
    另外在C++的继承中的确不会出现这种问题
      

  5.   

    java中的非final方法(private方法是隐式final的)都有可能被子类覆盖,如果你要保证一个方法不被子类覆盖,那么就应该设为final的。
      

  6.   

    这么说为了防止一个递归方法被子类覆盖一定要加上final,这是解释型语言的缺陷吗?
      

  7.   

    有的时候其实不必要钻牛角尖,软件开发的最终目的就是要解决问题(满足客户需求)
    其实解决你这个问题的最简单方法就是将子类中的public int f(int a, int b) 

    return a * b / super.f(a, b);//调用父类中的f 

    方法重新命名
      

  8.   

    答:是的。除非方法是final或private。JAVA中的final方法就是对应着CPP中的非virtual函数。
      

  9.   

    如果你的方法不是final或private的就有肯能会出错
      

  10.   

    一个对象默认肯定调用方法的最终版本
    SUPER确定了调用方法的所在层次
    所以super的方法限制调用父类的版本
    但该方法中调用的递归方法将调用最终版本
    父类方法中的递归方法 应该写个新的方法
      

  11.   

    貌似没有办法在本类中调用被覆盖方法
    想办法区别 除了以上的final private外
    还可以改名 不改名也可以通过参数变化来解除覆盖
    因为看程序本身也没有这种业务上的继承需要
      

  12.   

    static  不过貌似离题了  这已经不属于覆盖的范围了class GCD { 
    public static int f(int a, int b) { 
    if (b == 0) 
    return a; 
    return f(b, a % b);// 


    class LCM extends GCD { 
    public static int f(int a, int b) { 
    return a * b / GCD.f(a, b);//

    } class MAIN 

    public static void main(String args[]) 

    LCM lcm = new LCM(); 
    System.out.println(lcm.f(10, 8));