java - 为什么我不能降低继承的静态方法的可见性

标签 java inheritance overriding static-methods

不允许重写和降低继承方法的可见性,但重点是无论如何你都不能重写静态方法:

If a subclass defines a static method with the same signature as a static method in the superclass, then the method in the subclass hides the one in the superclass.

那么为什么第二个隐藏可以,而第一个则不行?

public class Base {

  public static void foo(){
      System.out.println("Base");
  }
}

隐藏1:

public class Sub extends Base {

  static void foo(){          //cannot reduce visibility error!
      System.out.println("Sub");
  }
}

隐藏2:

public class Sub extends Base {
  public static void foo(){   //OK
      System.out.println("Sub");
  }
}

最佳答案

原因是,您可能希望将子类的实例作为父类(super class)的类型提供给使用者。该消费者尝试运行他用来运行的(公共(public))方法,因为它是公共(public)的,但您通过保护它来隐藏它。为了防止这种情况发生,引入了这条规则。 (问题是可见性,而不是静态!)。 尽管我不得不承认,这种推理并不完全适用于静态方法,只是当消费者想要直接拥有一个子类(作为子类),就像他用来运行父类(super class)一样。

关于java - 为什么我不能降低继承的静态方法的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136020/

相关文章:

Java继承抽象类

java - 处理父类(super class)型的所有子类型

Python:__init__ 中的继承和默认值

java - 使用按钮切换 VideoView 的音频

Java 和 crossdomain.xml

java - 这段Java代码中的 'static'是什么意思?

java - 方法和重写扩展类

java - java中静态方法覆盖的奇怪情况

java - 如何重写库类的方法或分配参数值?

java - Selenium 3.12 在 driver.quit() @ FireFox 60/Win 7 Home Premium/Java 10.0.1/GeckoDriver 0.20.1 上显示错误