Java中隐藏的静态方法

Java中隐藏的静态方法,java,static,Java,Static,当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题作进一步解释吗。我真的不明白为什么我得到的是30分而不是10分。谢谢 class One { static int value = 0; One(){ addValue (); } static int addValue () { return v

当我试着运行这段代码时,它给了我30。有人能解释一下吗!我知道在Java中不能重写静态方法,因为多态性和静态方法不能一起工作。静态方法在类上调用,而不是在实例中调用。但有人能就这个话题作进一步解释吗。我真的不明白为什么我得到的是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());
}
}

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

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

在本例中,您正在调用类
Two
的构造函数,该构造函数默认调用类
One
的构造函数,该构造函数定义了方法调用
addValue
,将
值添加10


所以现在
value=10
。然后,调用类
Two
addValue
方法,将
20
添加到值中。因此,最后您将获得
value=20+10=30
作为输出。

当您在创建类2的实例时尝试最初运行此程序时,在其构造函数中有一个语句“super()”,它由编译器自动调用超类构造函数。因此,首先变量'value'的值是10,然后它增加20。最后,它的值是30,结果就是30

以下是编译器处理的代码:

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

您正在调用两个类的构造函数。但是当您隐式调用它时,您的单类构造函数将被调用。因此,它将把
10
添加到您的值变量中,然后它将调用该类中的
Two构造函数
和`addValue方法。因此,它将在您的值变量中再添加20。所以答案是30。

两类构造函数首先调用超级类(一)构造函数

在自己的类中调用addValue()。这会将值加10(0+10=10)


当一个人的构造器完成时,两个人的构造器开始。然后两个函数调用addValue()本身。这又增加了20,使值字段(由于继承,由1和2共享)总数达到30。

谢谢你们,这很有帮助。@laurenimad不客气