是"继承"正确的术语来解释超类的静态方法可以通过子类访问吗?

14 java polymorphism inheritance static static-methods

澄清:这个问题不是关于访问修饰符

确认Bm()和bm()语句都适用于以下代码:

class A {
  static void m() { //some code }
}

class B extends A {
}

class Example {
  public static void main (String [] args) {
    B.m(); // running A's m() static method
  }

  public void try() {
    B b = new B();
    b.m(); // running A's m() static method
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我们可以说"静态方法是继承的"吗?

如果"inherited"是正确的术语,如果我们向B类添加一个方法,我们将使用相同的静态类签名:

class A {
  static void m() { //some code }
}

class B extends A {
  static void m() { //some code }
}

class Example {
  public static void main (String [] args) {
    B.m(); // running B's m() static method
  }

  public void try() {
    B b = new B();
    b.m(); // running B's m() static method

    A a = new B();
    a.m(); // running A's m() static method, no polymorphism
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请注意我们没有多态性,是否正确的术语表示"静态方法是继承但未被覆盖,子类静态方法隐藏超类静态方法"?

最后疑问,对于这两个术语,"继承"和"覆盖",哪一个与"多态"一词直接相关?

Jon*_*eet 28

是的,我认为"继承"在这里是正确的术语,即使它不像它那样具有描述性.从Java语言规范的8.4.8节:

类C继承自其直接超类,并直接超级接口超类和超级接口的所有非私有方法(无论是否为抽象),这些方法是公共的,受保护的或在与C相同的包中使用默认访问声明,并且都不会被覆盖(§8.4) .8.1)也没有隐藏(§8.4.8.2)在课堂上的声明.

没有指定实例方法,但都是对什么是允许隐藏或覆盖什么,这是没有意义的,如果是静态方法的具体限制不能继承.

实际上,我只是简单地将静态方法视为"无需资格即可访问",而不是其他任何东西,因为它们不参与多态等等.我认为值得非常清楚 - 例如,一个静态方法可以隐藏继承的,但不能覆盖它.

换句话说,虽然我认为"继承"在技术上是正确的,但我会尽量避免使用它而不做任何进一步的解释.

对于你的第二个问题,我会说基于上面的内容,覆盖与多态性有关,但继承不一定.

(我还强烈建议你避免调用静态方法"via"变量,并且还要使用声明静态方法的类的名称,无论你在哪里指定名称.我知道这不是问题的一部分,但是我以为我只是添加它...)

  • @Downvoter:您是否不同意规范或我的解释? (13认同)