覆盖方法时,为什么我可以增加访问但不减少访问?

yes*_*per 62 java inheritance access-modifiers

为什么Java指定覆盖方法的访问说明符可以允许比重写方法更多但不是更少的访问?例如,超类中的受保护实例方法可以在子类中公开,但不是私有的.

Pat*_*k87 70

这是OOP中的一个基本原则:子类是父类的完全成熟实例,因此必须至少提供与父类相同的接口.使受保护/公共事物不那么明显会违反这一想法; 您可以使子类不可用作父类的实例.


Mau*_*res 34

想象一下这两个类:

public class Animal {
  public String getName() { return this.name; }
}

public class Lion extends Animal {
  private String getName() { return this.name; }
}
Run Code Online (Sandbox Code Playgroud)

我可以写这段代码:

Animal lion = new Lion();
System.out.println( lion.getName() );
Run Code Online (Sandbox Code Playgroud)

它必须是有效的,因为在Animal上方法getName()是公共的,即使它在Lion上是私有的.所以不可能在子类上使事情变得不那么明显,因为一旦有了超类引用,就可以访问这些东西了.

  • 这就是Liskov替换原理的含义。 (2认同)

Vin*_*ran 9

举个例子

 class Person{
 public void display(){
      //some operation
    }
 }

class Employee extends Person{
   private void display(){
       //some operation
   }
 }
Run Code Online (Sandbox Code Playgroud)

典型的重写发生在以下情况中

Person p=new Employee();
Run Code Online (Sandbox Code Playgroud)

p当我们调用p.display()时,这是类型为Person(超类)的对象引用 .由于访问修饰符更具限制性,因此对象引用p 无法访问Employee类型的子对象


Oli*_*rth 8

因为它会很奇怪:

class A {
    public void blah() {}
}

class B extends A {
    private void blah() {}
}


B b = new B();
A a = b;
b.blah();  // Can't do it!
a.blah();  // Can do it, even though it's the same object!
Run Code Online (Sandbox Code Playgroud)