JAVA方法的重写与重载的原则

来源:互联网 发布:2k16捏脸数据 编辑:程序博客网 时间:2024/05/17 00:00

重写的原则

请看这道题:

QUESTION NO: 10
Click the Exhibit button.
Which statement is true about theclasses and interfaces in the exhibit?



A. Compilation willsucceed for all classes and interfaces.
B. Compilation of classC will fail because of an error in line 2.
C. Compilation of classC will fail because of an error in line 6.
D. Compilation of classAImpl will fail because of an error in line 2.

这道题就是涉及到继承时候方法的重写问题,重写要遵循以下原则:

1.重写方法必须和被重写方法有相同的方法名称、参数列表、返回值类型;(注:返回值可以为父类中返回值的子类型.参数若为子类,则不是重写是重载)

2.重写方法不能使用比被重写方法更严格的访问权限;

3.重写方法不能声明抛出比被重写方法范围更大的异常类型。

这里C的第二行,返回类型是AImpl ,它是A的子类,是允许的,但是第六行Object显示不是String 或String的子类,因此会报错。

Answer: C

关于第二点,实际上如果子类写一个访问更宽松的方法,实际上相当于另写了一个方法,并不会报错,但是如果用父类refer 的子类实例调用此方法可能会出错的。

关于第三点,实测如果子类不抛异常,也没有报错。

例如:

class Foo{public int a = 3;private void addFive(){a +=5;System.out.print("f ");}}public class Bar extends Foo{public int a = 8;public void addFive(){this.a +=5;System.out.print("b ");}public static void main(String[] args) {// TODO Auto-generated method stubFoo f = new Bar();f.addFive();//不合法!System.out.print(f.a);}}

属性的重写

看以下代码输出什么?
class Foo{public int a = 3;public void addFive(){a +=5;System.out.print("f ");}}public class Bar extends Foo{public int a = 8;public void addFive(){this.a +=5;System.out.print("b ");}public static void main(String[] args) {Foo f = new Bar();f.addFive();System.out.print(f.a);}}
实际上在内存中重写的方法被覆盖了,所以先输出b 
f.a输出的结果实际上是3,也就是说子类的属性a并没有覆盖父类的a. 在内存中属性并不会覆盖,当调用的时候要看实例的句柄是父类还是它本身,这里Foo f = new Bar();因此调用f.a时候实际上输出的时候Foo的a属性。


重载的原则

看下面题,更复杂

QUESTION NO: 17Given:1. public class Blip {2. protected int blipvert(int x) {return 0; }3. }4. class Vert extends Blip {5. // insert code here6. }Which five methods, insertedindependently at line 5, will compile? (Choose five.)A. public int blipvert(int x) {return 0; }B. private int blipvert(int x) {return 0; }C. private int blipvert(long x) {return 0; }D. protected long blipvert(int x) {return 0; }E. protected int blipvert(long x) {return 0; }F. protected long blipvert(long x) {return 0; }G. protected long blipvert(int x,int y) { return 0; }

上面有重写的原则了,这里考察的更多,综合考察重写与重载,重载的原则如下:

1.方法名必须相同。 
2.方法的参数类型和参数个数两者至少有一不同。 (参数为子类也算不同。 int 和Integer也算不同,都算重载)
3.方法的修饰符和返回值类型可以不同。 

我们来分析答案:

A. public int blipvert(int x) {return 0; }   符合重写原则,权限更松

B. private int blipvert(int x) {return 0; } 属于重写,但权限更严格,因此×

C. private int blipvert(long x) {return 0; } 符合重载原则

D. protected long blipvert(int x) {return 0; } 返回类型变化,不属于重写。不符合重载原则 ×

E. protected int blipvert(long x) {return 0; } 参数变化,重载

F. protected long blipvert(long x) {return 0; } 参数变化,重载

G. protected long blipvert(int x,int y) { return 0; } 符合重载原则


因此答案是

Answer: A,C,E,F,G


题库下载:http://download.csdn.net/detail/magic_wz/6556627

参考:http://meikebo.iteye.com/blog/1698380



原创粉丝点击