Java中的静态和覆盖

Abh*_*ain 3 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

为什么会这样?请解释.

Pét*_*rök 5

你不能覆盖static方法 - 它们静态地绑定到它们所定义的类.因此,与实例方法不同,它们根本不是多态的.

实际上,b.multiply(5,2)应该导致编译器警告,说static方法调用应该使用类而不是实例作为范围,因此正确的形式将是B.multiply(5,2)(或A.multiply(5,2)).然后,这澄清了实际调用的方法.

如果省略编译器警告,很容易混淆:-)