在overriden方法中更改子实例变量

时间:2017-01-01 20:39:38

标签: java inheritance override

基本上,我的代码可以归结为以下内容。运行时,我希望得到以下输出:

Parent doing work
Child overriding. variable=5
Child overriding. variable=10
Child childMethod(). variable=10

Parent doing work
Child2 overriding. variable=5
Child2 overriding. variable=10
Child2 childMethod(). variable=10

我得到的是以下输出:

Parent doing work
Child overriding. variable=0
Child overriding. variable=10
Child childMethod(). variable=5

Parent doing work
Child2 overriding. variable=0
Child2 overriding. variable=10
Child2 childMethod(). variable=10

我对这种不匹配的理论是variable被使用"之前"它被宣布。这是基于

  1. variable根据输出(int default)将其初始值设置为0

  2. 对于课程Childvariable似乎重新获得了5的假定初始值。

  3. 这是正确的,variable被使用"之前"它被宣布?此外,为什么这是预期的行为背后有任何理由吗?

    public static void main(String[] params) {
        Parent child = new Child();
        child.childMethod();
    
        System.out.println();
    
        Parent child2 = new Child2();
        child2.childMethod();
    }
    
    public static abstract class Parent {
    
        public Parent() {
            method();
        }
    
        public void method() {
            System.out.println("Parent doing work");
        }
    
        abstract void childMethod();
    }
    
    public static class Child extends Parent {
        int variable = 5;
    
        @Override
        public void method() {
            super.method();
            System.out.println("Child overriding. variable=" + variable);
            variable = 10;
            System.out.println("Child overriding. variable=" + variable);
        }
    
        public void childMethod() {
            System.out.println("Child childMethod(). variable=" + variable);
        }
    
    }
    
    public static class Child2 extends Parent {
        int variable;
    
        @Override
        public void method() {
            super.method();
            System.out.println("Child2 overriding. variable=" + variable);
            variable = 10;
            System.out.println("Child2 overriding. variable=" + variable);
        }
    
        public void childMethod() {
            System.out.println("Child2 childMethod(). variable=" + variable);
        }
    
    }
    

1 个答案:

答案 0 :(得分:4)

这很简单。子类只在父类完成构造后初始化。在父母的构造函数中检查或修改子状态意味着您正在与未初始化的字段进行交互。

在您的情况下,您正在读取默认值0,并且在孩子初始化后您的更改将被丢弃。