为什么编译器在重写子类时降低方法的可见性时会给出错误消息?为什么不能减少Java子类中方法的可见性?
41
A
回答
65
因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskov substitution principle)。
如果子类突然丢失了基类的一个属性(例如公共方法),那么它将不再是基类的有效替代品。
1
因为子类型必须可用作其超类型的实例。
18
因为如果这是允许的,下面的情况是可能的:
从类父类子继承。 Parent有一个公共方法foo
,Sub使该方法变为私有。现在,下面的代码将编译很好,因为bar
声明的类型是父:
Parent bar = new Sub();
bar.foo();
然而,目前尚不清楚这应该如何表现。一种可能性是让它导致运行时错误。另一种方法是简单地允许它,这样就可以从外部调用一个私有方法,只需转换到父类即可。这些替代方法都不可接受,所以不允许。
相关问题
- 1. 什么可以减少MySqls的性能?
- 2. 为什么Java不允许减少父方法的可见性,但允许增加它们?
- 3. 我为什么不能减少的继承静态方法
- 4. 意义“不能减少继承方法的可见性”与接口
- 5. 为什么模板化基类中的方法不可见?
- 6. 为什么不能在子类中看到父类的方法?
- 7. 的Java为什么这种方法不可见
- 8. 为什么我可以增加子类中重载方法的可见性,它不是安全风险吗?
- 9. 哪个类不能成为java中的子类,为什么?
- 10. 减少的Java方法
- 11. 为什么动态类型方法不可见?
- 12. 减少创建新列表的方法,为什么不定义?
- 13. 在Java中,为什么在父类和子类中声明的变量在子类的实例中不可见?
- 14. 为什么参数的专用字段对Java 6中的泛型方法可见但对Java 7不可见?
- 15. 为什么不能Java请参见
- 16. 为什么不调用子类方法?
- 17. 什么是减少几何的复杂性的最好方法
- 18. Java中的类之间的方法可见性
- 19. 为什么受保护的方法不能从子类访问?
- 20. 为什么跳过只能用于动态方法的可见性检查?
- 21. 为什么这个语法没有减少/减少冲突?
- 22. 子类可以影响虚拟方法的可见性吗?
- 23. 为什么laravel 5.4看不见()方法
- 24. 减少分类方法中的类可以提高准确性吗?
- 25. 为什么我不能在Swift中减少内部整数?
- 26. 为什么我不能在减少逻辑中引用键?
- 27. 为什么n减少?
- 28. 为什么多处理性能不可见?
- 29. 在ArrayList中的子对象的属性和方法不可见
- 30. 为什么方法引用不能应用于子类?
但是,为什么我们不允许覆盖受保护的方法并将其更改为私有方法?由于公共接口仍然是相同的,所以它不会以这种方式破坏LSP。 – Pacerier 2014-08-23 07:32:40
公共接口不会改变,但受保护的。父类中的代码不能访问它自己的血肉和血液:( – Elazar 2015-09-07 22:08:30