Pannaanpa vielä tyhmä kyssäri:
Jos mulla on yliluokassa Auto attribuutti vaikka
private String väri;
Aliluokassa Henkilöauto konstruktori:
public Henkilöauto (String väri, ...omat attribuutit){ super(väri); . . . }
Miten saan aliluokassa tulostettua tuon private-attribuutin?
Esim.
public void tulosta() { "Auton väri on: " + väri+ ...);
Ei mene läpi, tulee valitusta että väri has private access in Auto. Jos vaihtaa tuon yliluokan attribuutin protected-tyyppiseksi, sitten niitä pääsisi suoraan räpläämään (tulostamaan). Apina vaan haluaa, että ne on private-tyyppisiä :). Super-määre ei vissiin onnaa. Pitääkö tonne yliluokkaan laittaa palautusmetodit - ei kai sentäs. Kai tähän on taas joku ylisimppeli ratkaisu, ei vaan tajua :).
Esim. se getVari() metodi sinne yläluokkaan (super pois, tilalle vaikka this.vari = vari;)
Sehän on pakko heittää superilla yliluokkaan, kun se on sieltä peritty. Eikö?
Voit muuttaa yläluokassa olevan värin tyypiksi protected, jolloin peritty luokka voi suoraan käyttää sitä (kuten myös kaikki muut samassa paketissa olevat luokat, mikä on vähän huonoa, jos et käytä useampia paketteja).
private muuttuja näkyy vain omassa luokassa, protected näkyy perityissä luokissa ja kaikissa saman paketin luokissa ja public kaikille luokille. Lisäksi, jos tyyppi-määritteen jättää pois, näkyy muuttuja kaikille saman paketin luokille.
Private muuttujan saamiseksi ulos jostain muusta luokasta kuin omasta ei ole mahdollista ilman luokassa olevaa palautusmetodia, ei edes perityissä luokissa. Sen takia niitä nimetää _private_ muuttujiksi.
Eli yläluokkaan getVäri (ja säilytetään se super(väri)) on ainoa ratkaisu, jos haluat säilyttää sen private tyypin.
Joo, tarkoitus on juurikin pitää attribuutit private-tyyppisinä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.