使用限制性更强的访问修饰符覆盖方法

时间:2017-07-14 06:57:22

标签: java

我想知道: 为什么重写方法不能具有比重写方法更严格的访问修饰符?

例如:

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");
}

4 个答案:

答案 0 :(得分:6)

还记得每个孩子都是父母的原则吗?

假设您已创建实例

Animal animal = new Horse();

当某人做animal.eat()现在应该发生什么?

动物拥有eat()方法并拥有足够的权限,同时限制了eat()Horseprivate的访问权限,这意味着您只能访问该方法在马里面。长号。

答案 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)

  1. 当你说马伸展动物时,就意味着你正在建立 马是动物

    的关系

    现在假设这是可能的:

    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 关系。

  2. 还有一个方面。当你说方法覆盖时,它 是运行时多态性。意味着,在运行时,编译器将检查是否 子类已覆盖此方法,然后应用子行为, 其他父母的行为。在上面的情况下,它会尝试运行马 行为,这将失败,因为马将其变为私人。

    在其他情况下不会发生这种问题 - 在哪里 具有限制性较小的访问修饰符的子覆盖。

  3. 希望这会清除你的怀疑。