这是一个非常基本的概念,我们不能在重写时降低方法的可见性。但我想知道为什么?这里我们已经将返回类型改为默认值,这样可以访问同一个包。那么为什么不允许将返回类型改为默认值呢?我明白,如果它是私有的或受保护的,那么在这种情况下,它不能被访问,但为什么不默认?是的,已经有很多可用的线程,但我不能清楚地理解这个概念。
vuktfyat1#
这是关于SOLID规则之一,Liskov substitution principle。这是现代应用程序如何使用多态性和OOP范式。从运行时和编译时来看,它是否是包私有访问修饰符。这是不可能的,因为如果你有一个类com.yadvendra.vehicles.Car,它有一个公共方法int speed(),那么其他对象应该总是可以扩展它(添加新的逻辑,如装饰模式等)。假设你要将你的Car对象返回给其他包中的其他类,如com.yadvendra.view.CarView。这个类想要使用你的公共方法int speed(),但是它不能,因为你把它的可见性级别降低到了package-private。
com.yadvendra.vehicles.Car
int speed()
Car
com.yadvendra.view.CarView
moiiocjp2#
我明白,如果它是私有的或受保护的,那么在这种情况下,它不能被访问,但为什么不默认?默认的访问方式也是一样的。这是一个相对的比较:不允许将作用域缩小到任何限制性更强的作用域,因为它破坏了超类的约定,正如注解中所解释的那样。
旁注:你似乎明白protected比default/package-private范围更不允许。这是不正确的。protected是package-private和更多。
protected
default
package-private
hc8w905p3#
API的用户只需要知道父类,你怎么解释他们现在可以不使用某个方法,只是因为父类的实现降低了子类的可见性?
3条答案
按热度按时间vuktfyat1#
这是关于SOLID规则之一,Liskov substitution principle。这是现代应用程序如何使用多态性和OOP范式。
从运行时和编译时来看,它是否是包私有访问修饰符。
这是不可能的,因为如果你有一个类
com.yadvendra.vehicles.Car
,它有一个公共方法int speed()
,那么其他对象应该总是可以扩展它(添加新的逻辑,如装饰模式等)。假设你要将你的Car
对象返回给其他包中的其他类,如com.yadvendra.view.CarView
。这个类想要使用你的公共方法int speed()
,但是它不能,因为你把它的可见性级别降低到了package-private。moiiocjp2#
我明白,如果它是私有的或受保护的,那么在这种情况下,它不能被访问,但为什么不默认?
默认的访问方式也是一样的。这是一个相对的比较:不允许将作用域缩小到任何限制性更强的作用域,因为它破坏了超类的约定,正如注解中所解释的那样。
旁注:你似乎明白
protected
比default
/package-private
范围更不允许。这是不正确的。protected
是package-private
和更多。hc8w905p3#
API的用户只需要知道父类,你怎么解释他们现在可以不使用某个方法,只是因为父类的实现降低了子类的可见性?