Dostęp do prywatnych pól poprzez super()

0

Hej, w trakcie ogarniania modyfikatorów dostępu zrobiłem takie coś.

class Base {
    private int x;
    private int y;

    Base(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}
class Child extends Base {
    Child(int x, int y) {
        super(x, y);
    }
}

W konstruktorze Child wywołuję konstruktor klasy Base jednak ma ona pola prywatne. Dlaczego potem w klasie Child mogę normalnie operować na x oraz y skoro ich nie dziedziczę? (są private). Czy super zmienia cos w temacie?

0

w klasie Child operujesz na parametrach konstruktora a nie na polach klasy bazowej

0

Ale nie zmienia to faktu, że potem tworząc obiekt klasy Child mam dostęp do x oraz y choć miały one modyfikator private.

0

nie, nie masz do nich nigdy bezposredniego dostepu. to ze jestes w stanie je zainicjalizowac przez konstruktor albo uzywac publicznych akcesorow to raczej oczywiste, jak niby mialoby to dzialac wg ciebie? co chcesz tak w ogole osiagnac? odziedziczyc po Base ale nie ustawiac x/y? nie ma takiej mozliwosci (bo nie ma to sensu).

0

Ten przykład tak na szybkiego wymyśliłem. Chodzi mi o różnice miedzy protected/private. Protected pozwala dziedziczyć pola a private nie. Tak to rozumiem. W takim razie jak zrobić np klasę która ma pola x, y, z oraz podklase, która dziedziczy po niej ale nie ma zawierać pola np. y. W konstruktorze nadklasy chcemy 3 parametry, a w podklasie tylko dwa. Czy to ma sens, czy taka operacja nie powinna mieć miejsca?

0

Albo inaczej. Co dałaby mi zmiana modyfikatorow dostępu z private na protected w powyższym przykładzie, skoro działanie i tak jest takie same?

0

gdyby pola byly protected to mozesz sobie np w klasie Child stworzyc metode ktora uzywa tych pol tak jakby byly zdeklarowane w niej, jesli sa private to nie masz do nich bezposredniego dostepu.

0

Super to wywołanie konstruktora klasy, po której dziedziczyłeś, i tego używasz w konstruktorze klasy dziedziczącej, bo po to chyba dziedziczyłeś, a że dostęp może być poprzez jakieś metody to nie ma znaczenia czy to protect czy private, bo konstruktor (super) jest publiczną metodą konstruktora klasy dziedziczonej.

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