2012-07-14 32 views
9

在Java中,当我重写某个方法时,编译器会标记任何将可见性缩小为错误的尝试。例如:我不能覆盖公共方法作为保护,而我可以覆盖一个受保护的方法作为公共。为什么不允许在覆盖方法时缩小方法的范围

我很想知道这个规则背后的设计决定/思考。

+0

这个问题在几天前被问过,但是会有什么意义呢? – 2012-07-14 14:50:57

+1

http://stackoverflow.com/q/11343763/1475461看看这个上周就这个问题进行的讨论 – 2012-07-14 14:55:03

回答

14

子类应该总是满足超类的契约。请参阅Liskov Substitution principle

方法的可见性是本合同的一部分。因此,超类中公开可见的任何东西都应在子类中公开。

+1

SOLID答案....! – 2015-05-22 10:47:43

14

考虑继承自AB类。 A.m()是公开的。现在考虑下面的代码:

A obj = new B(); 
obj.m(); 

这个调用应该允许吗?是的,它应该,因为objA类型的对象!它也是B类型的一个对象,但对于使用该对象的人不一定知道。

A类型的每个对象都必须遵守A的合同(接口)。 B延伸A,因此必须遵守该合同。

3

在删除或实施访问级别时,我们应该访问相同的访问级别或更宽的访问级别。

private < (default) < protected < public 

公众是最广泛的层次。

In Interface中的所有成员都是默认公共。所以,在实施或过度消耗时,我们必须只为公众服务。

相关问题