题目
下列程序会输出什么结果:(E)
class Super {
public int getLength() {
return 4;
}
}
public class Sub extends Super {
public long getLength() {
return 5;
}
public static void main (String[]args) {
Super super = new Super ();
Super sub = new Sub();
System.out.printIn(super.getLength()+ “,” + sub.getLength() };
}
}
A. 4, 4
B. 4, 5
C. 5, 4
D. 5, 5
E. 代码不能被编译
运行结果:
The return type is incompatible with Super.getLength()
分析:
这个问题就是考察方法重写(override)
方法重写的规则总结为:
- “两同”方法名相同,形参列表相同(即方法签名相同)
- “两小”子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等
- “一大”子类方法的访问权限应比父类方法的访问权限更大或相等
注意:
-
覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法。
- 子类重写的方法,如果返回值为类类型,其返回值类型必须与父类返回值类型相同或为父类返回值类型的子类。
这里如果返回值类型改成 包装类型的话,有两点不满足:
- 首先父类的是Integer 子类是 Long 很明显 Long要比Integer 要大
- Integer 和 Long 不存在继承关系 ,也就没有了父类子类之说
参考资料:
重写的基本概念和条件
仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类