Static methods hiding in Java
当我尝试运行这段代码时,它给了我30。有人能解释一下吗?我知道您不能重写Java中的静态方法,因为多态性和静态不能一起工作。静态方法是在类上调用的,而不是在实例中。但有人能就这个问题作进一步解释吗?我真的不明白为什么我得到的是30分而不是10分。谢谢!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class One { static int value = 0; One(){ addValue (); } static int addValue () { return value+=10; } int getValue () { return value; } } class Two extends One { Two () { addValue (); } static int addValue () { return value+=20; } public static void main(String[] args ) { One t = new Two (); System.out.println(t.getValue()); } } |
如果构造函数没有显式调用超类构造函数,则Java编译器自动将调用插入到超类的无参数构造函数中。参考:Oracle文档
如果父类没有无参数构造函数,则会得到编译时错误。对象确实有这样的构造函数,所以如果对象是唯一的超类,就没有问题。
在本例中,您调用的是类
所以现在是
当您在创建类2的实例时尝试最初运行此程序时,在其构造函数内有一个语句"super()",它由编译器自动调用超类构造函数。所以,首先变量'value'的值是10,然后它增加20。最后,它的值是30,这是您得到的结果。
下面是编译器处理的代码:
1 2 3 4 | Two () { super(); // Automatically invoked by compiler addValue (); } |
两类构造函数首先调用超级类(一)构造函数。
有人在自己的类中调用addValue()。这会将值增加10(0+10=10)。
当一个人的构造器完成时,两个人的构造器就开始了。然后两个调用addValue()本身。这又增加了20个,使值字段(由于继承,由1和2共享)总计为30个。
您正在调用两个类的构造函数。但当您隐式调用它时,将调用一个类构造函数。所以它会将