Ćaskanje sa Sanmej o Java modifikatorima za kontrolu pristupa
„Da prvo prodiskutujemo zašto je potrebna kontrola pristupa. Zapravo smo već pomenuo to kada smo govorili o klasama i objektima, a danas ćemo o tome detaljno da porazgovaramo, Sanmej", rekao sam odmah, idući pravo na stvar. „Sanmej, otvori umnu mapu i ne zaboravi da zapisuješ."
„Dobro", odgovorila je Sanmej.
Razmotrimo dva scenarija:
Scenarij 1: inženjer A napisao je klasu ClassA, ali ne želi da drugi inženjeri uopšte pristupaju toj klasi. Kako to rešiti?
Scenarij 2: inženjer A napisao je klasu ClassA u kojoj postoje dve metode, fun1 i fun2, a želi da samo fun1 bude vidljiva spolja — odnosno, kada drugi inženjeri pozivaju ClassA, smeju da pozivaju samo fun1. Kako to rešiti?
Upravo tu na scenu stupa kontrola pristupa.
U Javi su dostupne četiri vrste kontrole pristupa:
- podrazumevani pristup (pristup na nivou paketa)
- public
- private
- protected
Klasa se može modifikovati samo podrazumevanim pristupom ili sa public. Na primer:
public class Wanger{}ili
class Wanger{}Ali promenljive i metode mogu da koriste sve navedene modifikatore.
1. Modifikacija klase
- Podrazumevani pristup (pristup na nivou paketa): kada se koristi za modifikaciju klase, znači da je ta klasa vidljiva samo ostalim klasama u istom paketu.
- public: kada se koristi za modifikaciju klase, znači da je ta klasa vidljiva svim ostalim klasama.
Primer 1:
Main.java:
package com.tobetterjavaer.test1;
public class Main {
public static void main(String\[\] args) {
People people = new People("Tom");
System.out.println(people.getName());
}
}People.java
package com.tobetterjavaer.test1;
class People {//podrazumevani pristup (pristup na nivou paketa)
private String name = null;
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}Iz koda se vidi da je klasa People modifikovana podrazumevanim pristupom, a pošto se klasa People i klasa Main nalaze u istom paketu, klasa People je za klasu Main vidljiva.
Primer 2:
People.java
package com.tobetterjavaer.test2;
class People {//podrazumevani pristup (pristup na nivou paketa)
private String name = null;
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}Šta se sada dešava kada klasa People i klasa Main nisu u istom paketu?
Evo greške koju klasa Main prijavljuje:

Poruka kaže da klasa People u klasi Main nije vidljiva. Otuda se vidi da klasa modifikovana podrazumevanim pristupom jeste vidljiva samo ostalim klasama u istom paketu, dok klasama u različitim paketima nije vidljiva.
Kao što sugerise predlog za brzo ispravljanje na gornjoj slici, dovoljno je podrazumevani pristup klase People promeniti u public i klasa People postaje vidljiva za klasu Main.
2. Modifikacija metoda i promenljivih
- Podrazumevani pristup (pristup na nivou paketa): ako su metoda ili promenljiva neke klase modifikovani pristupom na nivou paketa, to znači da se ta metoda ili promenljiva mogu eksplicitno pozivati samo iz drugih klasa u istom paketu; iz klasa u drugim paketima ne mogu se eksplicitno pozivati.
- private: ako su metoda ili promenljiva neke klase modifikovani sa private, toj metodi ili promenljivoj može se pristupiti samo unutar same klase; izvan klase i iz drugih klasa ne može im se eksplicitno pristupiti.
- protected: ako su metoda ili promenljiva neke klase modifikovani sa protected, klase u istom paketu mogu da im pristupaju. Za klase iz drugih paketa, pristup je dozvoljen samo klasama koje nasleđuju tu klasu.
- public: metode ili promenljive modifikovane sa public vidljive su svuda.
Primer 3:
Main.java se nije promenio.
People.java
package com.tobetterjavaer.test1;
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
String getName() { //podrazumevani pristup (pristup na nivou paketa)
return name;
}
void setName(String name) { //podrazumevani pristup (pristup na nivou paketa)
this.name = name;
}
}Sada klasa Main može eksplicitno da poziva metode getName i setName.
Međutim, ako klasa People i klasa Main nisu u istom paketu:
package com.tobetterjavaer.test2; //u drugom paketu u odnosu na klasu Main
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
String getName() { //podrazumevani pristup (pristup na nivou paketa)
return name;
}
void setName(String name) { //podrazumevani pristup (pristup na nivou paketa)
this.name = name;
}
}Tada klasa Main prijavljuje grešku:

Otuda se vidi da, ukoliko se za modifikaciju metoda ili promenljivih klase koristi podrazumevani pristup, pristup im je moguć samo iz drugih klasa u okviru istog paketa.
Primer 4:
People.java
package com.tobetterjavaer.test1;
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
protected String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
}U ovom slučaju metode getName i setName mogu se eksplicitno pozivati iz klase Main.
Ako su klasa People i klasa Main u različitim paketima:
package com.tobetterjavaer.test2;
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
protected String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
}tada klasa Main prijavljuje grešku:

Ako u paketu com.cxh.test1 definišemo klasu Man koja nasleđuje klasu People, tada se iz klase Man mogu eksplicitno pozivati metode getName i setName:
package com.tobetterjavaer.test1;
import com.tobetterjavaer.test2.People;
public class Man extends People {
public Man(String name){
super(name);
}
public String toString() {
return getName();
}
}Da dopunimo znanje o Java paketima i class fajlovima:
Paketi u Javi prvenstveno služe da spreče konflikte u imenima class fajlova i da olakšaju organizaciju i upravljanje kodom;
Za jedan Java izvorni fajl, ako postoji public klasa, sme postojati samo jedna public klasa, i tada ime izvornog fajla mora biti potpuno isto kao ime te public klase.
Uz to, ukoliko postoje i druge klase, one su izvan paketa nevidljive. Ako izvorni fajl nema public klasu, ime fajla može se zadati proizvoljno.
„Sanmej, razumeš?" upitao sam je.
„Da, jednostavno je. Drugim rečima: ono što ne želiš da drugi vide — private; ono što želiš da vide — public; ono što želiš da vidi isti razred/odeljenje — podrazumevano; ono što želiš da vidi naredni nivo — protected. Je l' tako, brate?" prilično samouvereno odgovori Sanmej.
„Nije loše, dobro si to sažela."
Izvorni link: https://www.cnblogs.com/dolphin0520/p/3734915.html Autor: Matrix Haizi, urednik: Chenmo Wang Er
