Java中的静态方法隐藏

18 浏览
0 Comments

Java中的静态方法隐藏

这个问题已经有答案了:

为什么Java不允许覆盖静态方法?

当我尝试运行这段代码时,它给我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());
}
}

admin 更改状态以发布 2023年5月23日
0
0 Comments

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

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

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

0
0 Comments

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

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

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

因此现在value = 10。之后,调用了类TwoaddValue方法,在值上添加20。因此,您最终获得的value=20+10=30作为输出。

0