Czemu konstruktor klasy A wywoluje metode klasy B?

0

Czemu gdy sie odwolam do konstruktora A z klasy B, konstruktor w klasie A wywoluje metode initialize z klasy B a nie swoj

public class Solution {
    public static void main(String[] args) {
        new B(6);
    }

    public static class A {
        private int f1 = 7;

        public A(int f1) {
            this.f1 = f1;
            initialize();
        }

        protected void initialize() {  //gdy zmienie modyfikator dostepu na private dziala wszystko cacy
            System.out.println(f1);
        }
    }

    public static class B extends A {
        protected int f1 = 3;

        public B(int f1) {
            super(f1);
            this.f1 += f1;
            initialize();
        }

        protected void initialize() {
            System.out.println(f1);
        }
    }
}
4

Bo tak działa polimorfizm. Jeśli robisz Override metody, to z punktu widzenia klasy pochodnej widzisz tylko tą "nadpisaną" wersje, chyba ze użyjesz super. Nie ma znaczenia że jesteś w kontruktorze klasy A, bo mimo wszystko this jest typu B

3

Dodajmy jeszcze że w Javie override (nadpisanie metody) jest implicit (nie trzeba żadnego dodatkowego słowa override).
Radzę na initialzie w klasie B przyczepić @Override wtedy kod będzie jaśniejszy. Dobra praktyka to nie wołanie metod wirtualnych w konstruktorach. Dodaj final do metody to wtedy nie będzie się jej dało nadpisać (prywatnych też się nieda BTW).

2

Mini uwaga - w C++ było inaczej polimorfizm nie działał w ramach konstruktora. W dawnych czasach, kiedy robiliśmy przeobiektowany kod i przeskakiwaliśmy między C++ i Javą robiło to trochę zamieszania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1