这是一个非常基本的概念,我们无法在覆盖时降低方法的可见性。但是我想知道为什么吗?
class Parent{
public void getData(){
System.out.println("Parent GetData")
}
}
class Child{
void getData(){
System.out.println("Parent GetData")
}
}
public class OverridingDemo{
public static void main(String[] args)
{
Parent p = new Child();
p.getData(); // Error
}
}
在这里,我们将返回类型更改为默认类型,以允许访问同一软件包。那么为什么不允许将返回类型更改为默认类型?
我确实知道,如果它是私有的或受保护的,那么在那种情况下就无法访问它,但是为什么不默认呢?
是的,已经有很多线程可用,但是我无法清楚地理解这个概念。
答案 0 :(得分:2)
这是有关SOLID规则之一的Liskov substitution principle。这就是现代应用程序如何使用多态和OOP范例的所有方式。
从运行时和编译时开始,是否存在程序包专用访问修饰符。
之所以无法完成,恰恰是因为如果您有一个带有公共方法com.yadvendra.vehicles.Car
的类int speed()
,那么其他对象应该总是可以对其进行扩展(添加新的逻辑,例如Decorator Pattern)等)。假设您要将Car
对象返回到其他包中的其他一些类,例如com.yadvendra.view.CarView
。此类希望使用您的公共方法int speed()
,但不能这样做,因为您将其可见性级别降低为package-private。
答案 1 :(得分:1)
我确实知道,如果它是私有的或受保护的,那么在那种情况下就无法访问它,但是为什么不默认呢?
默认访问权限没有不同。这是一个相对的比较:不允许将范围缩小到任何限制性更强的范围,仅仅是因为它破坏了超类的契约,如注释中所述。
附带说明:您似乎理解protected
的范围比default
/ package-private
范围小。这不是真的。 protected
是package-private
及更多。
答案 2 :(得分:0)
API的用户仅应知道Parent类。您如何向他们解释,他们现在可以使用某种方法,仅仅是因为如果父类的实现降低了子类的可见性,那么该方法就可以了?