在网上看到一道面试题如下
public class Parent { public int addValue( int a, int b) { int s; s = a+b; return s; }}class Child extends Parent {}Which methods can be added into class Child? A. int addValue( int a, int b ){// do something…} B. public void addValue (){// do something…} C. public int addValue( int a ){// do something…} D. public int addValue( int a, int b )throws MyException {//do something…}
答案是B,C。
一开始还真有点迷糊,只明白考的是重写与重载这个知识点。百度一下,结合自己的理解总结如下:
编译器对方法的标识是靠方法名(方法的签名)和参数列表来确定的。显然我们就可以对在类中定义具有相同签名的方法,只需使参数列表不同即可,这就是所谓的重载。重载只是创建了一个另一个方法而已,没有什么特别的,唯一就是取了跟其他方法相同的名字而已。
重写主要用于子类和父类之间,在父类中定义了一个方法,同时在子类中对这个方法进行重写,实现子类行为的特殊化。这也是java实现多态性机制。java也定义了一些规则来约束重写机制: (1)重写方法必须和被重写方法具有相同的参数列表,返回类型必须和被重写方法的返回类型相同或者是返回类型的子类型。ps:这是必须的,不然就是方法重载了。。 (2)重写方法的访问控制修饰符不能比被重写方法更严格(比如一个在父类中声明为public的方法重写成一个PRotected的方法)。 (3)只有实例方法才能被重写,超类中的final方法不能被重写。 (4)重写方法不能抛出新的检查异常,或者是抛出比被重写方法声明的检查异常更广泛的检查异常。 (5)注意一种特殊情况:如果超类的方法版本中声明了检查异常,但重写的子类方法中没有声明,这时如果使用多态的方式进行调用,那么编译器认为你调用的是声明了异常的方法。 (6)尽管多态是在编译时确定对象的类型,但在编译时,还是根据父类的方法声明进行程序检查。因此,如果子类中定义的方法,在父类中没有定义,则会出项编译错误。
新闻热点
疑难解答