8-1 程序改错--质数。指出以下程序段的错误(2分),并改正(3分)
isPrime方法用于检查参数num是否是质数。
public boolean isPrime(int num){
boolean result = false;
for(int i=2; i<num; i++){ if(num%i==0) break; }
if(i>=num) { result = true; }
return result;
}
解答:
语法错误:i定义在for循环的循环条件中,故i的作用域只在for循环的循环体中,循环结束i被回收,在if(i>=num)中i未定义,故应在for循环之上定义i,扩大i的作用域;
算法错误:该算法未考虑i小于2的情况,显然负数、0、1都不是质数,故应在循环判断前增加特判if(num < 2)时直接返回false。
修改代码如下:
public static boolean isPrime(int num) {
boolean result = false;
if (num < 2) {
return result;
}
int i;
for (i = 2; i < num; i++) {
if (num % i == 0) break;
}
if (i >= num) {
result = true;
}
return result;
}
8-2 程序改错--接口。指出下面方法的错误(2分),并改正(3分)
类Reader实现了Readable接口。
interface Readable { void read(); }
class Reader implements Readable {
void read() { System.out.println("I Can read it."); }
}
解答:
语法错误:对于Java的接口,其中的方法如果没有修饰符修饰,默认都是public abstract修饰的,这时Reader类实现Readable接口,所实现的成员方法read()也应由public修饰。
修改代码如下:
interface Readable {
void read();
}
class Reader implements Readable {
public void read() {
System.out.println("I Can read it.");
}
}
8-3 程序改错--重载。指出下面方法的错误(2分),并改正(3分)
main方法调用重载的max方法求2个数的最大值。
public class Error03 {
public static double max(int a, double b) { return a > b ? a : b; }
public static double max(double a, int b) { return a > b ? a : b; }
public static void main(String[] args) { double c = max(10, 100); }
}
解答:
语法错误:
首先对于两个max方法,它们的数据类型(均为double)相同,且参数列表不同,符合方法重载的规则;
但在main方法中的调用存在歧义,调用max(10,100)时,两个参数默认视作int类型,int类型的参数可以赋值给double类型的变量(存在隐式类型转换),此时两个互相重载的方法都可以接收main方法中的传参,方法调用不明确,解决方法为调用max时,其中一个参数的末尾加上L(即显式声明这是一个double类型参数)。
修改代码如下(以调用第二个max方法为例):
public class Main {
public static double max(int a, double b) {
return a > b ? a : b;
}
public static double max(double a, int b) {
return a > b ? a : b;
}
public static void main(String[] args) {
double c = max(10L, 100);
}
}
8-4 程序改错--重写。指出下面方法的错误(2分),并改正(3分)
子类Child覆盖了父类Parent中的output方法。
class Parent{
public final void output() { System.out.println("Parent"); }
}
class Child extends Parent{
public void output() { System.out.println("Child");
}
解答:
语法错误①:Child类这部分的代码少了一个右花括号即”}”,根据就近原则会优先和其中重写的方法output的左括号结合,此时划分Child类的作用域仅有左花括号无右花括号,应在Child类的结束位置加上右花括号
(虽然我觉得很可能是出题人不小心漏了);语法错误②:对于Parent类,其中的output方法被final关键字修饰,则认为此方法是最终方法,不允许被重写,应去掉final关键字。
修改代码如下:
class Parent {
public void output() {
System.out.println("Parent");
}
}
class Child extends Parent {
public void output() {
System.out.println("Child");
}
}