Присвоение переопределенного метода полю Super Class при инициализации.Почему вызывается метод подкласса? - PullRequest
0 голосов
/ 09 декабря 2018

Я выполняю приведенный ниже код и не получаю порядок инициализации, основанный на полученном выводе.

import java.util.Random;

class SuperClass{
    private int abc = this.getAnInt();
    {
        System.out.println("\nSuperClass: Inside block initializer");
        System.out.println("\tSuperClass: block Abc value: "+this.abc);
        abc = this.getAnInt();
        System.out.println("\tSuperClass: block Abc value: "+this.abc);
    }

    public SuperClass(){
        System.out.println("\nSuperClass: Inside Constructor");
        this.abc = 414;
        System.out.println("\tSuperClass: constructor Abc value: "+this.abc);
    }

    int getAnInt() {
        System.out.println("\nSuperClass: Inside getAnInt");
        System.out.println("\tSuperClass: getAnInt Abc value: "+this.abc);
        int randomInt = new Random().nextInt(21);
        System.out.println("SuperClass: getAnInt Random Int is : "+randomInt);
        return randomInt; 
    }
}

class SubClass extends SuperClass{
    private int def = this.getAnInt();
    {
        System.out.println("\nSubClass: Inside block initializer");
        System.out.println("\tSubClass: block def value: "+this.def);
        def = this.getAnInt();
        System.out.println("\tSubClass: block def value: "+this.def);
    }

    public SubClass(){
        System.out.println("\nSubClass: Inside Constructor");
        this.def = 424;
        System.out.println("\tSubClass: constructor def value: "+this.def);
    }

    @Override
    int getAnInt() {
        System.out.println("\nSubClass: Inside getAnInt");
        System.out.println("\tSubClass: getAnInt def value: "+this.def);
        int randomInt = new Random().nextInt(21);
        System.out.println("SubClass: getAnInt Random Int is : "+randomInt);
        return randomInt; 
    }
}

public class ChainingConstructor {
    public static void main(String[] args) {
        SubClass subclass = new SubClass();
        System.out.println(subclass);
    }
}

вывод -----

SubClass: Inside getAnInt
    SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 10

SuperClass: Inside block initializer
    SuperClass: block Abc value: 10

SubClass: Inside getAnInt
    SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 15
    SuperClass: block Abc value: 15

SuperClass: Inside Constructor
    SuperClass: constructor Abc value: 414

SubClass: Inside getAnInt
    SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 6

SubClass: Inside block initializer
    SubClass: block def value: 6

SubClass: Inside getAnInt
    SubClass: getAnInt def value: 6
SubClass: getAnInt Random Int is : 18
    SubClass: block def value: 18

SubClass: Inside Constructor
    SubClass: constructor def value: 424
thinkingInJava.SubClass@368239c8

Когда я изменяю доступ getAnInt () в SuperClass на private (также удаляя аннотацию @Override), он, кажется, работает как я ожидаю.

  1. статические переменные и статические инициализаторы в порядке
  2. переменные экземпляра и инициализаторы экземпляра в порядке
  3. конструкторы

т.е. я получаю следующий вывод с частным getAnInt () в SuperClass

SuperClass: Inside getAnInt
    SuperClass: getAnInt Abc value: 0
SuperClass: getAnInt Random Int is : 1

SuperClass: Inside block initializer
    SuperClass: block Abc value: 1

SuperClass: Inside getAnInt
    SuperClass: getAnInt Abc value: 1
SuperClass: getAnInt Random Int is : 14
    SuperClass: block Abc value: 14

SuperClass: Inside Constructor
    SuperClass: constructor Abc value: 414

SubClass: Inside getAnInt
    SubClass: getAnInt def value: 0
SubClass: getAnInt Random Int is : 14

SubClass: Inside block initializer
    SubClass: block def value: 14

SubClass: Inside getAnInt
    SubClass: getAnInt def value: 14
SubClass: getAnInt Random Int is : 8
    SubClass: block def value: 8

SubClass: Inside Constructor
    SubClass: constructor def value: 424
thinkingInJava.SubClass@368239c8

Мой вопрос заключается в том, что заставляет мое первое выполнение вызывать метод SubClass getAnInt () вместо вызова SuperClass getAnInt ()?

...