java - 父构造函数调用的方法表现为子方法

标签 java class polymorphism hierarchy

我正在 java 中测试一些多态性,我的代码如下所示:

class Base {
        int value = 0;
        public Base(){
            System.out.println("Came Here And Value is: " + value);
            addValue();
        }
        String addValue(){
            System.out.println("Calling Bases' addValue and value is currently: " + value);
            value += 10;
            return "";
        }
        int getValue(){
            return value;
        }
}
class Derived extends Base{
        public Derived(){
            System.out.println("Calling Derived constructor and value currently is: " + value);
            addValue();
        }
        String addValue(){
            System.out.println("Came to Deriveds' addValue and value now is: " + value);
            value += 20;
            return "";
        }
        int getValue(){
            return value;
        }
}
public class MyClass {
    public static void main(String [] args){
       Base b = new Derived();
       System.out.println(b.getValue());

    }
}

这里的事情是,它打印 40,但我猜它应该打印 30。我的想法是:new Derived 首先调用 new Base,它调用 addValue()并且(如Base中定义的addValue()将值加10)此时值应为10。然后,Derived 的 addValue()被称为使值 30(因为派生中定义的 addValue() 将值增加 20)。但是相反,Base 调用它的 child 的 addValue() .有人可以解释发生了什么吗?

最佳答案

你思维过程中的错误观念被加粗了:

new Derived first calls new Base, which calls addValue() and (as addValue() defined in Base adds up value by 10) value should be 10 at that time. then, Derived's addValue() is called which makes value 30 (because addValue() defined in Derived adds value up by 20).

尽管 addValue 被放置在基类构造函数中,它仍然在 this 上调用 addValue,如下所示:

this.addValue();

嗯,什么是this?它是一个 Derived 类实例。派生类的 addValue 有什么作用?它加了 20。这就是你得到 40 的原因。

关于java - 父构造函数调用的方法表现为子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45264611/

相关文章:

java - Android - ListView 中的多个 TextView

java - 如何检查 String 是否包含 SimpleDateFormat 中的日期并检索日期?

java - Apache 负载均衡器与纯 java 应用程序

c++初学者使用字符串时出现段错误

c++ - DLL 如何访问 EXE 类?

java - 如何在方法签名中使用泛型类型?

c# - 如何在引用之前确保类是有效的?

java - 如何有效控制实现多接口(interface)的类对象?

c++ - 如何包装抽象类的指针列表?

Java:父方法访问子类的静态变量?