隐藏在Java中的静态方法

时间:2015-03-27 06:27:42

标签: 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());
}
}

4 个答案:

答案 0 :(得分:5)

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

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

在您的情况下,您正在调用类Two的构造函数,它默认调用类One的构造函数,其中定义了方法调用addValue,其中将{10}添加到value

现在value = 10。之后,调用类addValue的{​​{1}}方法,将Two添加到值。所以最后你得到20作为输出。

答案 1 :(得分:3)

当你在创建第二类的实例时尝试最初运行这个程序时,在它的构造函数中有一个语句' super()'它由编译器自动调用超类构造函数。所以,首先是变量'值'是10,然后它增加20.最后它的值是30,你得到的结果。

这是编译器处理的代码:

Two () {
    super();   // Automatically invoked by compiler
    addValue ();
}

答案 2 :(得分:0)

您正在调用Two类的构造函数。但是当你隐式调用它时,你的One类构造函数将被调用。所以它会在你的值变量中添加10,之后它将调用该类中的Two Constructor和`addValue方法。因此它会为您的值变量添加另外20个。所以回答将是30。

答案 3 :(得分:0)

Two类构造函数首先调用超类(One)构造函数。

一个人在自己的类中调用addValue()。这会使值增加10(0 + 10 = 10)。

然后当One的构造函数完成时,Two的构造函数开始。然后两个调用addValue()本身。这增加了另外20个,使得值字段(由于继承而由One和Two共享)总共30个。