我想知道: 为什么重写方法不能具有比重写方法更严格的访问修饰符?
例如:
public NewForm(Resources res){
TextField tf = new TextField("Hello");
tf.getAllStyles().setAlignment(Label.CENTER);
add(tf);
}
在Horse课程中,为什么我不能这样编写代码:
class Animal{
public void eat(){
System.out.println("Generic Animal Eating Generically");
}
}
class Horse extends Animal{
public void eat(){
System.out.println("Horse eating hay, oats, and horse treats");
}
}
或
private void eat(){
System.out.println("Horse eating hay, oats, and horse treats");
}
答案 0 :(得分:6)
还记得每个孩子都是父母的原则吗?
假设您已创建实例
Animal animal = new Horse();
当某人做animal.eat()
现在应该发生什么?
动物拥有eat()
方法并拥有足够的权限,同时限制了eat()
中Horse
对private
的访问权限,这意味着您只能访问该方法在马里面。长号。
答案 1 :(得分:3)
它违反了多态原则(子类实例应该可用于代替超类实例)
答案 2 :(得分:0)
这是OOP Polymorphism
的主要概念之一扩展类时,不能限制visibiliy,因为如果创建该子类的新实例,则存在概念错误。
示例:
Animal animal = new Horse();
在这种情况下,animal
方法eat
公开但horse
私有,这不起作用。创建扩展Animal
的类的实例,我希望能够访问eat
方法。
否则,您可以在子类中扩展方法可见性,例如:
class Animal{
protected void eat(){
System.out.println("Generic Animal Eating Generically");
}
}
class Horse extends Animal{
public void eat(){
System.out.println("Horse eating hay, oats, and horse treats");
}
}
答案 3 :(得分:0)
当你说马伸展动物时,就意味着你正在建立 马是动物
的关系现在假设这是可能的:
class Animal{
public void eat(){
System.out.println("Generic Animal Eating Generically");
}
}
class Horse extends Animal{
private void eat(){
System.out.println("Horse eating hay, oats, and horse treats");
}
}
假设您正在使用此层次结构的第三个类。
class B{
Animal animalInstance = new Animal() ;
animalInstance .eat();
//other code that use this instance
}
现在,如果你尝试用Horse实例替换这个animalInstance:
private Horse horseInstance = new Horse();
horseInstance .eat(); // Error! Horse doesn't expose this method to outside world!!
然后这会导致编译时错误。如果动物 实例不能被Horse实例替换,那么 Horse Isn' t An 动物的!您违反了 IS A 关系。
还有一个方面。当你说方法覆盖时,它 是运行时多态性。意味着,在运行时,编译器将检查是否 子类已覆盖此方法,然后应用子行为, 其他父母的行为。在上面的情况下,它会尝试运行马 行为,这将失败,因为马将其变为私人。
在其他情况下不会发生这种问题 - 在哪里 具有限制性较小的访问修饰符的子覆盖。
希望这会清除你的怀疑。