Java中的静态和重写

Java中的静态和重写,java,inheritance,static,overriding,Java,Inheritance,Static,Overriding,输出: 一, 四十 为什么会这样?请解释。您不能重写静态方法-它们静态绑定到定义它们的类。因此,与实例方法不同,它们根本不是多态的 事实上,b.multiply(5,2)应该会导致编译器警告,说静态方法调用的作用域应该是类而不是实例,因此正确的形式应该是b.multiply(5,2)(或者a.multiply(5,2))。这就澄清了实际调用的方法 如果忽略编译器警告,您很容易感到困惑:-)通过引用调用静态方法是一个非常糟糕的主意-它会使代码变得混乱 这些线路: public class B {

输出:

一,

四十


为什么会这样?请解释。

您不能重写
静态方法-它们静态绑定到定义它们的类。因此,与实例方法不同,它们根本不是多态的

事实上,
b.multiply(5,2)
应该会导致编译器警告,说
静态
方法调用的作用域应该是类而不是实例,因此正确的形式应该是
b.multiply(5,2)
(或者
a.multiply(5,2)
)。这就澄清了实际调用的方法


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

通过引用调用静态方法是一个非常糟糕的主意-它会使代码变得混乱

这些线路:


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;
    }

}
这些数据被编译成:

B b = new A();
System.out.println(b.multiply(5,2));
System.out.println(b.multiply1(5,2));
请注意,这些调用根本不依赖于
b
。实际上,
b
可以为null。绑定是基于编译时类型
b
执行的,在执行时忽略其值


多态性在静态方法中根本不会发生。

因为b是类型b。如果您使用eclipse,您将注意到一个警告,它指示了同样多的多态性

类型B中的静态方法multiply(int,int)应该以静态方式访问


小监督;multiply1()不是静态的,因此它被编译成
b.multiply1(5,2)
,这解释了40(来自A)和1(来自b)。感谢您的澄清。请更正你的答案。乘法1不是静态方法。请参阅
B b = new A();
System.out.println(B.multiply(5,2));
System.out.println(B.multiply1(5,2));