今天上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));
}
}
有什么办法让父类的方法调用父类被重写的方法,或者是指明调用某个类的方法
代码如下子类重写方法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));
}
}
有什么办法让父类的方法调用父类被重写的方法,或者是指明调用某个类的方法
{
public int f(int a, int b)
{
if (b == 0)
return a;
return f(b, a % b);//当为子类调用时,这句却是调用了调用子类中的f,导致递归错误
}
} 你这个方法本身就是无限递归,只要调用这个方法 ,就会无限递归,无论怎样继承重写.因为父类调用只是父类的方法.
Java中还没见过这么做, 如果是C++的话,那是可以的
public int f(int a, int b) 加上:final算了。
GCD gcd = new GCD();
System.out.println(gcd.f(10, 8));
是没有问题,可以得到预期的结果,说明GCD类编写没有问题
另外在C++的继承中的确不会出现这种问题
其实解决你这个问题的最简单方法就是将子类中的public int f(int a, int b)
{
return a * b / super.f(a, b);//调用父类中的f
}
方法重新命名
SUPER确定了调用方法的所在层次
所以super的方法限制调用父类的版本
但该方法中调用的递归方法将调用最终版本
父类方法中的递归方法 应该写个新的方法
想办法区别 除了以上的final private外
还可以改名 不改名也可以通过参数变化来解除覆盖
因为看程序本身也没有这种业务上的继承需要
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));
}
}