在Java中,当我重写某个方法时,编译器会标记任何将可见性缩小为错误的尝试。例如:我不能覆盖公共方法作为保护,而我可以覆盖一个受保护的方法作为公共。为什么不允许在覆盖方法时缩小方法的范围
我很想知道这个规则背后的设计决定/思考。
在Java中,当我重写某个方法时,编译器会标记任何将可见性缩小为错误的尝试。例如:我不能覆盖公共方法作为保护,而我可以覆盖一个受保护的方法作为公共。为什么不允许在覆盖方法时缩小方法的范围
我很想知道这个规则背后的设计决定/思考。
子类应该总是满足超类的契约。请参阅Liskov Substitution principle。
方法的可见性是本合同的一部分。因此,超类中公开可见的任何东西都应在子类中公开。
SOLID答案....! – 2015-05-22 10:47:43
考虑继承自A
的B
类。 A.m()
是公开的。现在考虑下面的代码:
A obj = new B();
obj.m();
这个调用应该允许吗?是的,它应该,因为obj
是A
类型的对象!它也是B
类型的一个对象,但对于使用该对象的人不一定知道。
A
类型的每个对象都必须遵守A
的合同(接口)。 B
延伸A
,因此必须遵守该合同。
在删除或实施访问级别时,我们应该访问相同的访问级别或更宽的访问级别。
private < (default) < protected < public
公众是最广泛的层次。
In Interface中的所有成员都是默认公共。所以,在实施或过度消耗时,我们必须只为公众服务。
这个问题在几天前被问过,但是会有什么意义呢? – 2012-07-14 14:50:57
http://stackoverflow.com/q/11343763/1475461看看这个上周就这个问题进行的讨论 – 2012-07-14 14:55:03