OBJEKTINIS PROGRAMAVIMAS
Java prieigos modifikatoriai
Prieigos modifikatoriai (angl. access modifiers) nustato, iš kurių programos vietų galima naudoti klasę, atributą, metodą ar konstruktorių. Jie padeda apsaugoti vidinę objekto būseną ir aiškiai apibrėžti viešą klasės sąsają.
Dvi modifikatorių grupės
- Prieigos modifikatoriai valdo, kur kodas yra pasiekiamas:
public,privateirprotected. - Kiti modifikatoriai suteikia kitą elgseną, pavyzdžiui,
static ,finalarbaabstract.
Šioje pamokoje nagrinėjami būtent prieigos lygiai.
Aukščiausio lygio klasių prieiga
Aukščiausio lygio klasei galima suteikti public arba paketo prieigą, nenurodant modifikatoriaus:
| Prieiga | Pasiekiamumas |
|---|---|
public | Iš bet kurio paketo, jei klasė tinkamai importuota |
| Paketo prieiga | Tik iš to paties paketo; modifikatorius nerašomas |
// Failas: Knyga.java
public class Knyga {
// Klasė pasiekiama ir iš kitų paketų
}
// Modifikatorius nenurodytas – paketo prieiga
class KnygosPagalbininkas {
// Klasė pasiekiama tik tame pačiame pakete
}Čia tik parodomos dvi klasių deklaracijos. Nė viena klasė neturi main() ar println().
public class Knygagali būti naudojama ir iš kitų paketų.- Viešos klasės failo vardas turi sutapti su klasės vardu:
Knyga.java. - Prie
KnygosPagalbininkasneparašytas joks prieigos modifikatorius. - Todėl ši klasė turi paketo prieigą ir ją gali naudoti tik to paties paketo kodas.
default nėra čia rašomas raktažodis.Sąvoka „numatytoji prieiga“ reiškia, kad prieigos modifikatorius tiesiog nenurodytas.
Atributų, metodų ir konstruktorių prieiga
| Modifikatorius | Ta pati klasė | Tas pats paketas | Poklasis kitame pakete | Kitos klasės kitame pakete |
|---|---|---|---|---|
private | ✅ Taip | ❌ Ne | ❌ Ne | ❌ Ne |
| (numatytoji) | ✅ Taip | ✅ Taip | ❌ Ne | ❌ Ne |
protected | ✅ Taip | ✅ Taip | ✅ Taip* | ❌ Ne |
public | ✅ Taip | ✅ Taip | ✅ Taip | ✅ Taip |
protected prieiga kitame pakete turi papildomą taisyklę.Poklasis narį pasiekia per paveldėjimą – per save arba savo poklasio objektą. Jis negali naudoti protected nario per bet kokį atskirai gautą tėvinės klasės objektą.
public ir private pavyzdys
Viešas knygos pavadinimas pasiekiamas iš išorės, tačiau perskaitytų puslapių skaičius saugomas klasės viduje. Išorinis kodas reikšmę gauna per viešą metodą:
class Knyga {
public String pavadinimas = "Mažasis princas";
private int perskaitytaPuslapiu = 40;
public int gautiPerskaitytusPuslapius() {
return perskaitytaPuslapiu;
}
}
public class Main {
public static void main(String[] args) {
Knyga knyga = new Knyga();
System.out.println(knyga.pavadinimas);
System.out.println(knyga.gautiPerskaitytusPuslapius());
}
}Mažasis princas
40
- Atributas
pavadinimaspažymėtaspublic, todėlMainjį pasiekia tiesiogiai. - Atributas
perskaitytaPuslapiupažymėtasprivate, todėl iš išorės jo tiesiogiai pasiekti negalima. - Viešas metodas
gautiPerskaitytusPuslapius()veikia pačios klasės viduje ir gali perskaityti privatų atributą. Mainiškviečia šį metodą ir saugiai gauna skaičių40.
Tiesioginis privataus atributo naudojimas atrodytų taip:
Knyga knyga = new Knyga();
System.out.println(knyga.perskaitytaPuslapiu);error: perskaitytaPuslapiu has private access in Knyga
- Kodas bando pasiekti
knyga.perskaitytaPuslapiune iš pačiosKnygaklasės. - Modifikatorius
privateleidžia lauką naudoti tik klasės viduje. - Kompiliatorius sustabdo programą, todėl šis klaidingas fragmentas konsolės išvesties neturi.
- Teisingas kelias yra naudoti klasės suteiktą viešą metodą.
Paketo prieiga
Kai modifikatorius nenurodytas, klasės narys pasiekiamas tik tame pačiame pakete. Tai naudinga vidinėms vieno modulio detalėms, kurių nereikia atverti visai programai.
package lt.pavyzdys.knygos;
class KnygosPagalbininkas {
int puslapiuSkaicius = 96;
void rodytiPuslapius() {
System.out.println("Puslapių: " + puslapiuSkaicius);
}
}
public class Main {
public static void main(String[] args) {
KnygosPagalbininkas pagalbininkas = new KnygosPagalbininkas();
pagalbininkas.rodytiPuslapius();
}
}Puslapių: 96
- Abi klasės priklauso tam pačiam paketui
lt.pavyzdys.knygos. - Prie
KnygosPagalbininkas, jo atributo ir metodo neparašytas modifikatorius. - Tai reiškia, kad visi jie pasiekiami tame pačiame pakete.
Mainsukuria pagalbininko objektą ir iškviečia jo metodą.- Jeigu
Mainbūtų kitame pakete, toks naudojimas nebūtų leidžiamas.
Ką iš tikrųjų leidžia protected?
protected lengviausia suprasti kaip dviejų leidimų derinį. Narį gali naudoti bet kuri klasė tame pačiame pakete. Be to, jį per paveldėjimą gali naudoti poklasis, net jei poklasis yra kitame pakete.
protected nėra „pasiekiamas visur“. Kitame pakete jis suteikia papildomą prieigą būtent poklasiui ir būtent per paveldėjimą.
Toliau klasės sąmoningai įdėtos į du skirtingus paketus. Jei jos būtų tame pačiame pakete, pavyzdys neparodytų svarbiausio protected skirtumo:
// Failas: biblioteka/Leidinys.java
package biblioteka;
public class Leidinys {
protected String pavadinimas = "Mažasis princas";
protected void rodytiPavadinima() {
System.out.println(pavadinimas);
}
}
// Failas: parduotuve/Knyga.java
package parduotuve;
import biblioteka.Leidinys;
public class Knyga extends Leidinys {
public void rodytiInformacija() {
// Leidžiama, nes Knyga paveldi iš Leidinys
this.rodytiPavadinima();
System.out.println(this.pavadinimas);
System.out.println("Tai yra knyga");
}
public static void main(String[] args) {
Knyga knyga = new Knyga();
knyga.rodytiInformacija();
// Negalima: kitame pakete protected narys
// nepasiekiamas per paprastą Leidinys objektą.
// Leidinys leidinys = new Leidinys();
// leidinys.rodytiPavadinima();
}
}Mažasis princas
Mažasis princas
Tai yra knyga
Leidinysyra paketebiblioteka. Jis turiprotectedatributąpavadinimasir metodąrodytiPavadinima().Knygayra kitame pakete –parduotuve. Vadinasi, vien buvimo tame pačiame pakete taisyklė jai nepadeda.Knyga extends LeidinyspadaroKnygaklasęLeidinyspoklasiu.- Dėl paveldėjimo
Knygaviduje galima rašytithis.rodytiPavadinima()irthis.pavadinimas. - Pirmoji eilutė atsiranda iš paveldėto metodo, antroji – tiesiogiai perskaičius paveldėtą atributą, trečioji – iš pačios
Knygaklasės. - Tačiau
Knyganegali sukurti paprastoLeidinysobjekto ir per jį pasiektiprotectedmetodo. Komentaruose parodytos eilutės būtų kompiliavimo klaida.
| Modifikatorius | Ar Knyga kitame pakete galėtų narį naudoti? | Kodėl? |
|---|---|---|
private | ❌ Ne | Narys tiesiogiai pasiekiamas tik pačioje Leidinys klasėje. |
| Numatytoji prieiga | ❌ Ne | Knyga yra kitame pakete. |
protected | ✅ Taip, per paveldėjimą | Knyga yra Leidinys poklasis. |
public | ✅ Taip | Viešas narys pasiekiamas ir be specialios poklasio išimties. |
private – tik klasė; numatytoji prieiga – paketas; protected – paketas ir poklasiai; public – visur.
Konstruktoriaus prieigos ribojimas
Prieigos modifikatorius gali valdyti ir tai, kas gali kurti klasės objektus:
public class BibliotekosInformacija {
private BibliotekosInformacija() {
// Objektų iš išorės kurti negalima
}
public static void rodytiPavadinima() {
System.out.println("Miesto biblioteka");
}
public static void main(String[] args) {
BibliotekosInformacija.rodytiPavadinima();
}
}Miesto biblioteka
- Klasės konstruktorius pažymėtas
private, todėl kitos klasės negali rašytinew BibliotekosInformacija(). - Tačiau viešas
staticmetodas priklauso pačiai klasei ir objektui jo nereikia. - Metodas iškviečiamas per klasės pavadinimą
BibliotekosInformacija.rodytiPavadinima(). - Toks sprendimas tinka pagalbinėms klasėms, kurios teikia tik statinius veiksmus arba pačios kontroliuoja objektų kūrimą.
Kokį prieigos lygį rinktis?
- Pradėk nuo siauriausios reikalingos prieigos.
- Objekto vidinius atributus dažniausiai žymėk
private. publicpalik sąmoningai kuriamai klasės sąsajai.protectednaudok tik kai paveldinčios klasės iš tikrųjų turi pasiekti narį.- Paketo prieiga tinka susijusių to paties paketo klasių vidiniam bendradarbiavimui.

