【发布时间】:2019-03-11 06:09:50
【问题描述】:
一个简单的例子
class A {
protected int foo(int x){
return x;
}
}
class B extends A {
public int foo(int x){
return x*x;
}
}
这在 Java 中是允许的,并且可以正常工作。但是假设在另一个包中你声明了
A b = new B();
int z = b.foo(5);
那么这将不起作用,因为显然 A foo() 是受保护的。但是,为什么首先允许在子类中有更多可访问的方法呢?有没有这样有用的案例?
【问题讨论】:
-
为什么要禁止?子类的隐私不能真正强制执行:如果你愿意,你可以创建另一个导出值的方法。
-
这就是简单的 Liskov 替换原则:子类可以更宽容地允许谁调用该方法,因为它至少和超类一样宽容。
标签: java access-modifiers