【问题标题】:Static methods hiding in Java [duplicate]隐藏在Java中的静态方法[重复]
【发布时间】:2015-05-31 10:05:05
【问题描述】:

当我尝试运行这段代码时,它给了我 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 static


    【解决方案1】:

    二类构造函数首先调用超类(一)构造函数。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        这是编译器处理的代码:

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

        【讨论】:

        • 谢谢你们,这有帮助。
        • @LaureenImad 不客气
        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-29
          • 2012-11-07
          • 2011-01-03
          • 2011-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多