隐藏在Java中的静态方法

lor*_*n99 0 java static

当我尝试运行这段代码时,它给了我30.有人可以解释一下!我知道你不能在Java中覆盖静态方法,因为,多态和静态不会一起工作.静态方法在Class上调用,而不是在实例中调用.但有人可以进一步解释这个主题.我真的不明白为什么我得到30而不是10.谢谢!

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());
}
}
Run Code Online (Sandbox Code Playgroud)

Vim*_*era 5

如果构造函数未显式调用超类构造函数,则Java编译器会自动插入对超类的无参数构造函数的调用.参考:Oracle doc

如果超类没有无参数构造函数,则会出现编译时错误.对象确实有这样的构造函数,因此如果Object是唯一的超类,则没有问题.

在您的情况下,您正在调用类的构造函数,TwoOne默认调用类的构造函数,其中addValue定义了方法调用,其中添加了10 value.

所以现在value = 10.之后,调用addValue类的方法Two增加20了值.所以最后你得到value = 20 + 10 = 30了输出.