隐藏在Java中的静态方法

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文档

如果父类没有无参数构造函数,则会得到编译时错误。对象确实有这样的构造函数,所以如果对象是唯一的超类,就没有问题。

在本例中,您调用的是类Two的构造函数,默认情况下,它调用类One的构造函数,并定义了方法call addValue,将10添加到value中。

所以现在是value = 10。之后,调用了类TwoaddValue方法,将20相加。最后,您将得到value = 20 + 10 = 30作为输出。


当您在创建类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个。


您正在调用两个类的构造函数。但当您隐式调用它时,将调用一个类构造函数。所以它会将10添加到您的值变量中,然后它会调用该类中的Two Constructor和add value方法。所以它会给你的值变量再加上20。所以答案是30。