java - Java 中的静态和覆盖

标签 java inheritance static overriding


public class B {

    static int i =1;

    public static int multiply(int a,int b)
    {
        return i;
    }

    public int multiply1(int a,int b)
    {
        return i;
    }

    public static void main(String args[])
    {
        B b = new A();
        System.out.println(b.multiply(5,2));
        System.out.println(b.multiply1(5,2));
    }
}

class A extends B
{
    static int i =8;

    public static int multiply(int a,int b)
    {
        return 5*i;
    }

    public int multiply1(int a,int b)
    {
        return 5*i;
    }

}

输出:

1

40

为什么会这样?请解释。

最佳答案

您不能覆盖 static 方法 - 它们静态绑定(bind)到定义它们的类。因此,与实例方法不同,它们根本不是多态的。

事实上,b.multiply(5,2) 应该会导致编译器警告,说明 static 方法调用的范围应该是类而不是实例,因此正确的形式是 B.multiply(5,2)(或 A.multiply(5,2))。这随后阐明了实际调用了哪个方法。

如果省略编译器警告,您很容易感到困惑:-)

关于java - Java 中的静态和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3060443/

相关文章:

java - Chrome 将连字符 "-"附加到下载的 CSV 文件

c# - 如何清理?

java - Java 和 Hibernate 的继承 - 更新类型转换

java - 使用 Class.forName 实例化嵌套的静态类

c# - 静态类最佳实践

java - 获取垃圾收集的历史数据

Java 库通过 ssh 在远程服务器上运行多个不相关的命令

Java-Eclipse : Externalize Strings?

在父类(super class)中创建时的 Java 调用函数

静态 vs 函数静态 vs 成员函数静态的 C++ 内存布局