Luokan attribuuteille ja metodeille on suojaustasot, jotka oletuksena ovat pakettikohtaisia, eli metodeja voi kutsua kuka tahansa samaan pakettiin kirjoitetun luokan metodi. Erityisesti kuka tahansa samassa paketissa oleva metodi voi muuttaa attribuuttien arvoja ilman että olio tätä itse huomaa.
|
Kuka
voi käyttää metodia/attribuuttia
|
|||
Suojaus
|
kaikki
|
aliluokk.
metodit
|
paketin
metodit
|
luokan
metodit
|
private
|
|
|
|
x
|
package
|
|
|
x
|
x
|
protected
|
|
x
|
x
|
x
|
public
|
x
|
x
|
x
|
x
|
Kirjoitamme ensin testiluokan:
/** * Testiohjelma Aika-luokalle * @author Vesa Lappalainen * @version 1.0, 01.02.2003 * */ public class Aikatesti { public static void main(String[] args) { Aika a1 = new Aika(12,15); Aika a2 = new Aika(13,16); Aika a3 = new Aika(14,25); a1.lisaa(55); a1.tulosta(); a2.lisaa(27); a2.tulosta(); a3.lisaa(39); a3.tulosta(); } }
Jos esimerkkimme metodi lisaa esiteltäisiin:
private void lisaa(int lisa_min) {
niin testiohjelma lakkaisi toimimasta, koska esimerkiksi pääohjelman kutsu
a1.lisaa(55)
tulisi laittomaksi luokan jäsenen lisaa ollessa yksityinen ( private).
Erityisen tärkeää on kuitenkin että ei voida kirjoittaa testiohjelmassa
a1.h = 28; // private-attribuuttiin ei saa viitata
Käytännössä attribuutit kannattaa lähes poikkeuksetta kirjoittaa yksityisiksi. Kaikista pahinta mitä olio-ohjelmoija voi tehdä on kirjoittaa julkisia attribuutteja.
Nyt vasta alkaakin olio-ohjelmoinnin hienoudet! Aloittelijasta saattaa tuntua että mitä turhaa tehdään asioista monimutkaisempaa kun se onkaan! Väärinkäytetyt ja virheelliset arvot muuttujilla on ollut ohjelmoinnin kiusa alusta alkaen. Nyt meillä on mahdollisuus päästä niistä eroon kapseloinnin (jotkut sanovat kotelointi, encapsulation) ansiosta. Eli kaikki arvojen muutokset (eli olio tapauksessa olion tilojen muutokset) voidaan suorittaa kontrolloidusta, vain olion itse siihen suostuessa. Mutta miten sitten alustuksen tapauksessa?