繁体   English   中英

在Java中继承静态方法?

[英]Inheriting static methods in Java?

所以我知道在Java中,当您有一个静态方法时,应该以ClassName.method()格式调用它,而不是使用与实例方法相同的结构,即:

ClassName myObject = new ClassName();
myObject.method();

但是,如果您以这种方式进行操作,它将仍然是有效的代码并且可以正常工作。 假设我决定在有问题的方法是静态的情况下执行此操作,并具有以下设置:

public SuperClass {
    public static int foo(int x) {
        return x;
    }
}

public SubClass extends SuperClass {
    public static int foo(int x) { // Overriding foo() in SuperClass
        return x + 1;
    }
}

public MyDriver {
    public static void main(String[] args) {
        SuperClass myObject = new SubClass(); // Upcasting.
        System.out.println(myObject.foo(5));  // This should polymorphically print 6
    }
}

但是,屏幕上显示的是5,而不是6。为什么?

静态方法仅适用于定义它们的类,并且不能覆盖它们。

调用myObject.foo(5) ,实际上是在调用SuperClass.foo(5) ,因为您将myObject声明为SuperClass ,而不管是否将其实例化为一个。

调用静态方法的正确方法是直接从声明其的类中调用它,因此,如果要调用SubClass.foo() ,则必须从一个显式声明的SubClass实例(意味着没有向上转换)中调用它,或者您需要像这样调用SubClass.foo()

简单的答案是,从实例调用静态方法的评估结果是从没有实例而不是实例类型的声明类型调用那些相同的方法。

我不确定,但是如果将代码编译成字节码,实例静态方法调用实际上将被编译成对声明类型的直接调用,我不会感到惊讶。

编辑:赞成票使我的注意力回到了这一点上,我整理了说明以使其更清楚,并纠正了一些可忽略的语法错误。 希望对以后的读者有所帮助。

静态方法不依赖于实例,它们属于类并且仅属于类,实际上,如果您具有静态方法,则始终将始终访问一个唯一的实例。

   myObject.foo(5) 

只是捷径,你真正在做的是

   SuperClass.foo(5)

应该避免使用类的实例来调用该类的静态方法,因为这会引起混乱。 如果您需要多态调用任何方法,请使其成为实例方法。 您不能多态调用静态方法。 调用SuperClass调用的原因是因为这是myObject在编译时的明显类。 在以下情况下也可以看到这种效果:

public void doSomething(SuperClass param) {
    System.out.println("SuperClass");
}

public void doSomething(SubClass param) {
    System.out.println("SubClass");
}

public void test() {
    SuperClass myObject = new SubClass();
    doSomething(myObject);
}

如果调用test(),则将打印SuperClass

静态方法被JVM视为全局方法,它们根本没有绑定到对象实例。 顺便说一句,您只能重载静态方法,但不能覆盖。 因此,请检查“用于覆盖和隐藏文档的Oracle文档”

定义与超类的方法具有相同签名的方法:

----------------------------------------- 超类实例方法 超类静态方法
子类实例方法 重写 产生编译时错误
子类的静态方法 生成一个编译时错误 隐藏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM