Java中的静态方法是继承的吗?

新手上路,请多包涵

我正在阅读 Khalid Mughal 的 A Programmer’s Guide to Java™ SCJP Certification

在继承章节中,它解释了

成员的继承与其声明的可访问性密切相关。如果超类成员在子类中可以通过其简单名称访问(无需使用任何额外的语法,如 super),则该成员被认为是继承的

它还提到静态方法不是继承的。但是下面的代码非常好:

 class A
{
    public static void display()
    {
        System.out.println("Inside static method of superclass");
    }
}

class B extends A
{
    public void show()
    {
        // This works - accessing display() by its simple name -
        // meaning it is inherited according to the book.
        display();
    }
}

我怎样才能在课堂上直接使用 display() B ?更重要的是, B.display() 也有效。

书上的解释只适用于实例方法吗?

原文由 Algorithmist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 492
2 个回答

所有可访问的方法都由子类继承。

来自 Sun Java 教程

子类继承其父类的所有公共和受保护成员,无论子类在哪个包中。如果子类与其父类在同一个包中,它也继承父类的包私有成员。您可以按原样使用继承的成员、替换它们、隐藏它们或用新成员补充它们

继承的静态(类)方法和继承的非静态(实例)方法的唯一区别是,当您编写具有相同签名的新静态方法时,旧的静态方法只是被隐藏,而不是被覆盖。

页面 上看覆盖和隐藏的区别。

隐藏和覆盖之间的区别具有重要意义。被调用的重写方法的版本是子类中的版本。被调用的隐藏方法的版本取决于它是从超类还是从子类调用

原文由 yincrash 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以体验以下代码的不同之处,这是对您的代码稍作修改。

 class A {
    public static void display() {
        System.out.println("Inside static method of superclass");
    }
}

class B extends A {
    public void show() {
        display();
    }

    public static void display() {
        System.out.println("Inside static method of this class");
    }
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        // prints: Inside static method of this class
        b.display();

        A a = new B();
        // prints: Inside static method of superclass
        a.display();
    }
}

这是因为静态方法是类方法。

A.display() 和 B.display() 将调用各自类的方法。

原文由 Gaurav 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题