Java继承中为什么不可以降低父类重写方法的访问权限

Yohns 发布于 2012/02/27 22:51
阅读 6K+
收藏 1
class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } //正确,重写父类方法,可以扩大访问权限
//private int method1(int a, int b) { return 0; } //错误,重写父类方法,不能降低了访问权限
//private long method1(int a, int b) { return 0; } //错误,重写父类方法,不能改变返回值类型
public short method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
private int method1(int a, long b) { return 0; }//正确,重载自身的方法,可以有不同的访问权限和返回值类型
} 
class B 中的这几种情况都编译过,就是不理解。
(1)为什么重写父类方法就不能降低访问权限?
(2)为什么重载自身方法就无所谓访问权限?
谢谢回答~~

以下是问题补充:

@Yohns:public short method1(int a, long b) { return 0; } private int method1(int a, long b) { return 0; } 最后两行是不能同时存在的,因为参数一样,编译器会无法识别要载入哪一个 (2012/02/28 20:15)
加载中
0
崔钢
崔钢
重载仅仅是同名的方法而已,因为参数列表不同,所以也可以看作是完全不同的方法,但是继承不同。继承父类必须和父类的接口一致,否则,从外部看来怎么知道你是其他某个类的子类呢?而这个接口,其实就是一个类的public方法集合。面向对象其实要求表里如一的,你内部使用的extends,外部就要表现出来。
0
R
Rainy
Liskov替换原则,子类对象可以被当成父类对象使用。如果可以降低子类的访问权限,那就违反了这一原则了。
ayidaweiwei
ayidaweiwei
说的很好,看了那么多解释,看了你的瞬间就懂了,谢谢.
0
鉴客
鉴客
这些问题更应该是要记住的,而不是问为什么,语言就是这样设计的
Yohns
Yohns
我觉得不是,编程语言本来就得符合逻辑思维,规则存在的情况下也要体现出合理性
0
Andre.Z
Andre.Z
假设参数类型是用的父类,然后,传个子类对象进去,父类明明有提供A方法可被访问,但是,你子类降低了访问权限,然后。。。。程序出错了!!!!别告诉我不存在前面这种参数赋值操作。
0
六只
六只
比如这样A a = new B(),B继承了A,重写父类方法s(),如果在B中变为了私有方法,那么调用a.s()会发生什么。
Yohns
Yohns
稍微有点明白了
0
Monkey
Monkey

从技术上这违背了封装性。

另外 private int method1(int a, long b) {

            return 0;

        }这个不对吧,这样的重载是不行的,重载要依靠参数区别,而不是返回类型。

Yohns
Yohns
明白,谢谢,就是忘记说明后面两个不能同时存在,因为参数相同
0
xoHome
xoHome
最后两个方法确定能同时存在? 不会报错?你打错了吧?
Yohns
Yohns
不是同时存在的,sorry,这个忘记提醒了
0
BobAlice
BobAlice
学习了,,总结的很好
0
银河缘木
银河缘木
说的很好 子类可以被父类调用,如果子类缩小了父类的访问 父类没法调了
返回顶部
顶部