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