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"变量,并且还要使用声明静态方法的类的名称,无论你在哪里指定名称.我知道这不是问题的一部分,但是我以为我只是添加它...)