Koja je razlika između javnog, sigurnog, skupnog i privatnog u Javi?

U Javi postoje jasna pravila o tome kada će se koristiti svaki od modifikatora pristupa, odnosno zadani (privatni paket), public , protected i private , izrada class i interface i obrada nasljedstvom?

2722
18 окт. set intrepion 18 list . 2008-10-18 22:53 '08 u 22:53 2008-10-18 22:53
@ 27 odgovora

Službeni vodič vam može biti od pomoći.

 │ C │ P │ Podklasa cl Podklasa │ W │ │ l │ a │ (isti pkg) │ (diff pkg) │ o │ │ a │ c │ │ │ r │ │ s │ k │ │ │ l │ │ s │ a │ │ │ d │ │ g │ │ │ │ E │ │ │ │ ────────────┼─── + + ───┼──────────┼──────────┼──── javna │ + │ + │ + │ + │ + │ ────────────┼───────┼──────────┼──────────┼───┼ zaštićeni │ + │ + │ + │ + │ │ ────────────┼───────┼──────────┼──────────┼───┼ nema modifikatora │ + │ + │ + │ │ │ ────────────┼───────┼──────────┼──────────┼───┼ privatni + │ │ │ │ │  +: dostupno prazno: nije dostupno
4983
18 окт. Odgovor koji je dao David S. 18. listopada 2008-10-18 22:57 '08 u 22:57 2008-10-18 22:57

(Caveat: Ja nisam programer za Javu, ja sam programer na Perlu. Perl nema formalne zaštite, možda zato dobro razumijem problem :))

privatni

Mislite li da se to može vidjeti samo u klasi u kojoj je deklarirana.

Privatni paket

Može se prikazati i koristiti samo u paketu u kojem je deklariran. To je zadana vrijednost u Javi (koju neki smatraju pogreškom).

zaštićen

Privatni + paket može se vidjeti u potklasama ili članu paketa.

javnost

Svatko to može vidjeti.

border=0

objavljen

Vidljivo izvan koda koji ja kontroliram. (Iako ovo nije Java sintaksa, važno je za ovu raspravu).

C ++ definira dodatnu razinu, nazvanu "prijatelj", i što manje znate, to bolje.

Kada biste trebali koristiti što? Cijela ideja je enkapsulacija za sakrivanje informacija. Koliko god je to moguće, želite sakriti pojedinosti o tome kako se nešto radi od vaših korisnika. Zašto? Zato što ih kasnije možete promijeniti i ne razbiti nikoga. To vam omogućuje da optimizirate, reorganizirate, redizajnirate i ispravite pogreške bez straha da netko koristi taj kôd koji ste upravo revidirali.

Stoga je pravilo da stvari budu vidljive onako kako bi trebale biti. Počnite s privatnim i samo dodajte više vidljivosti po potrebi. Objavite samo ono što je apsolutno nužno za korisnika da zna, svaki detalj koji objavite stvara vašu sposobnost za redizajniranje sustava.

Ako želite da korisnici prilagode ponašanje umjesto otvorenih utroba kako bi ih mogli redefinirati, često je bolje povući te crijeva u objekt i učiniti ovo sučelje javno dostupnim. Dakle, oni jednostavno mogu povezati novi objekt. Na primjer, ako pišete CD player i želite da se "idi nađi informacije o ovom CD-u" bitovi konfiguriraju umjesto da objavljuju ove metode, uključili biste sve te funkcije u svoj objekt i napravili svoj objekt za dobivanje / postavljanje općenito dostupni, stoga, škrtost da razotkrije vaše hrabrosti, potiče dobar sastav i razdvajanje problema.

Osobno se držim samo "privatnih" i "javnih". Mnogi OO jezici imaju ovo. "Zaštićena" može biti korisna, ali je zapravo varalica. Čim je sučelje više nego privatno, ono je izvan vaše kontrole i morate pogledati u kôd kako bi ga drugi pronašli.

Tu se pojavljuje ideja “objavljivanja”. Promjena sučelja (refactoring) zahtijeva da pronađete sav kôd koji ga koristi i promijenite ga. Ako je sučelje privatno, nema problema. Ako je zaštićen, morate pronaći sve svoje podrazrede. Ako je javni, morate pronaći sav kôd koji koristi vaš kôd. Ponekad je to moguće, na primjer, ako radite s korporativnim kodom koji se koristi samo za internu upotrebu, nije važno je li sučelje otvoreno. Možete izvaditi sav kôd iz korporativnog spremišta. Ali ako je sučelje "objavljeno", ako postoji kôd koji ga koristi izvan vaše kontrole, bit ćete zatvoreni. Morate podržati ovo sučelje ili kôd za kršenje rizika. Čak se i sigurna sučelja mogu smatrati objavljenim (tako da ne brinem o sigurnosti).

Mnogi jezici smatraju da je hijerarhijska priroda javnog / zaštićenog / privatnog sustava previše restriktivna i nedosljedna stvarnosti. U tu svrhu postoji pojam klase, ali ovo je drugačija predstava.

397
19 окт. Odgovor dao Schwern 19. listopada 2008-10-19 00:17 '08 u 0:17 2008-10-19 00:17

Ovo je najbolja verzija tablice. (Budućnost je s stupcem za module.)

2019

10 нояб. odgovor od aioobe 10. studenog 2015-11-10 13:27 '15 u 13:27 2015-11-10 13:27
  | highest precedence <---------> lowest precedence *———————————————+———————————————+———————————+———————————————+——————— \ xCanBeSeenBy | this | any class | this subclass | any \__________ | class | in same | in another | class \ | nonsubbed | package | package | Modifier of x \ | | | | ————————————————*———————————————+———————————+———————————————+——————— public | ✔ | ✔ | ✔ | ✔ ————————————————+———————————————+———————————+———————————————+——————— protected | ✔ | ✔ | ✔ | ✘ ————————————————+———————————————+———————————+———————————————+——————— package-private | | | | (no modifier) | ✔ | ✔ | ✘ | ✘ ————————————————+———————————————+———————————+———————————————+——————— private | ✔ | ✘ | ✘ | ✘ 
177
10 янв. Odgovor dao Abdull 10. siječnja 2013-01-10 00:42 '13 u 0:42 2013-01-10 00:42

Jednostavno pravilo. Počnite s proglašavanjem svih privatnih. A onda napredak prema javnosti prema potrebi, a dizajn to opravdava.

Prilikom izlaganja izlagača, zapitajte se jeste li odabrali ili odabrali apstrakciju. Prvi je ono što želite izbjeći, jer će uvesti previše ovisnosti o stvarnom prikazu, a ne o njegovom promatranom ponašanju.

U pravilu, pokušavam izbjeći nadjačavanje implementacije metode potklasiranjem; Previše je lako utopiti logiku. Objavite sažetke zaštićenih metoda ako ih namjeravate poništiti.

Također, upotrijebite @Override zabilješku kada redefinirate tako da se stvari ne prekinu pri reorganizaciji.

142
18 окт. Odgovor je dao John Nilsson 18. listopada 2008-10-18 23:00 '08 u 23:00 2008-10-18 23:00

To je zapravo malo kompliciranije od jednostavnih mreža. Mreža označava je li pristup dopušten, ali što je točno pristup? Osim toga, razine pristupa međusobno djeluju s ugniježđenim klasama i nasljeđivanjem na složene načine.

Zadani pristup (označen odsutnošću ključne riječi) također se naziva paket-privatan . Iznimka: u sučelju nijedan modifikator ne znači otvoreni pristup; ne-javni modifikatori su zabranjeni. Konstante kontinuuma uvijek su javne.

rezime

Je li dopušten pristup članu s navedenim specifikatorom pristupa?

  • Član private : samo ako je član definiran u istoj klasi kao i pozivni kôd.
  • Korisnik je zatvoreni paket: samo ako je pozivni kôd unutar člana koji odmah uključuje paket.
  • Member protected : isti paket, ili ako je član definiran u superklasi klase koja sadrži pozivni kod.
  • Član public : Da.

S kojima se povezuju specifikatori pristupa

Lokalne varijable i formalni parametri ne mogu prihvatiti specifikatore pristupa. Budući da su inherentno nedostupni izvana u skladu s pravilima za određivanje vidnog polja, oni su zapravo zatvoreni.

Za klase u gornjem oknu dopušteni su samo public i privatni paket. Pretpostavlja se da je ovaj izbor dizajna zbog činjenice da će protected i private biti suvišne na razini paketa (nema nasljeđivanja paketa).

Svi atributi pristupa su mogući za članove razreda (konstruktori, metode i statičke funkcije člana, ugniježđene klase).

Povezano: Java pristupačnost

red

Specifikatori pristupa mogu se strogo naručiti.

public> protected> package-private> private

znači da public ima najviše pristupa, najmanje private . Svaka referenca koja je dostupna privatnom članu vrijedi i za člana privatnog paketa; svako upućivanje na člana privatnog paketa vrijedi za zaštićenog člana i tako dalje. (Pružanje pristupa zaštićenim članovima drugim klasama u jednom paketu smatralo se pogreškom.)

bilješke

  • Klasnim metodama dopušten je pristup privatnim članovima drugih objekata iste klase. Točnije, metoda klase C može pristupiti privatnim članovima C objekata bilo kojeg potklasa C. Java ne podržava ograničenje pristupa samo za instance prema klasi. (Usporedite s Scala-om, koji je podržava pomoću private[this] .)
  • Za kreiranje objekta potreban vam je pristup konstruktoru. Dakle, ako su svi konstruktori privatni, klasa se može kreirati samo pomoću koda koji živi unutar klase (obično statičke tvorničke metode ili inicijalizatori statičkih varijabli). Slično za konstruktore, privatno-privatne ili zaštićene.
    • Samo prisutnost privatnih konstruktora također znači da klasa ne može biti podklasificirana izvana, budući da Java zahtijeva od konstruktora podrazreda da implicitno ili eksplicitno nazovu konstrukt superklase. (Međutim, može sadržavati ugniježdenu klasu koja ga podklasira.)

Unutarnje klase

Također trebate uzeti u obzir ugniježđena područja, kao što su unutarnje klase. Primjer složenosti je da unutarnje klase imaju članove koji sami mogu koristiti modifikatore pristupa. Prema tome, možete imati privatnu unutarnju klasu s otvorenim članom; može pristupiti članu? (Vidi dolje.) Opće pravilo je da pogledate opseg i razmislite rekurzivno da vidite možete li pristupiti svakoj razini.

Međutim, to je prilično teško, a za potpune informacije pogledajte specifikaciju jezika Java . (Da, u prošlosti su postojale pogreške kompilatora.)

Da bi razumjeli kako oni djeluju, razmotrite ovaj primjer. Možda "curenje" privatnih unutarnjih klasa; To je obično upozorenje:

 class Test { public static void main(final String ... args) { System.out.println(Example.leakPrivateClass()); // OK Example.leakPrivateClass().secretMethod(); // error } } class Example { private static class NestedClass { public void secretMethod() { System.out.println("Hello"); } } public static NestedClass leakPrivateClass() { return new NestedClass(); } } 

Izlaz kompajlera:

 Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface Example.leakPrivateClass().secretMethod(); // error ^ 1 error 

Neka povezana pitanja:

99
13 сент. Odgovor je dat mehaničkom pužu 13. rujna 2012-09-13 10:38 '12 u 10:38 am 2012-09-13 10:38

Kao pravilo:

  • privatno : klasa.
  • zadano (ili paket-privatno): područje paketa.
  • protected : opseg paketa + dijete (na primjer paket, ali ga možemo podklasirati iz različitih paketa). Zaštićeni modifikator uvijek čuva odnos roditelj-dijete.
  • public : svugdje.

Kao rezultat toga, ako prava pristupa podijelimo na tri prava:

  • (D) izravna (poziv iz metode unutar istog razreda).
  • (R) (poziv metode pomoću reference klase ili sintakse "dot").
  • (I) nheritance (preko podskupine).

onda imamo ovu jednostavnu tablicu:

 +—-———————————————+————————————+———————————+ | | Same | Different | | | Package | Packages | +—————————————————+————————————+———————————+ | private | D | | +—————————————————+————————————+———————————+ | package-private | | | | (no modifier) | DRI | | +—————————————————+————————————+———————————+ | protected | DRI | I | +—————————————————+————————————+———————————+ | public | DRI | RI | +—————————————————+————————————+———————————+ 
72
18 дек. Odgovor daje nxhoaf 18 dec. 2012-12-18 21:01 '12 u 21:01 2012-12-18 21:01

U vrlo kratkom roku

  • public : dostupan svugdje.
  • protected : pristup razredima u istom paketu i podklasama koji se nalaze u bilo kojem paketu.
  • default (nije naveden nikakav modifikator): dostupno klasama istog paketa.
  • private : dostupno samo u jednoj klasi.
46
27 окт. odgovor je dao Ravi 27. listopada. 2012-10-27 20:49 '12 u 20:49 2012-10-27 20:49

Najsitniji modifikator pristupa u Javi protected . Znamo da izgleda kao zadani modifikator s jednom iznimkom u kojoj je mogu vidjeti podklase. Ali kako? Evo primjera za koji se nadam da će razjasniti konfuziju:

  • Pretpostavimo da imamo dvije klase; Father i Son , svaki u svom paketu:

     package fatherpackage; public class Father { } ------------------------------------------- package sonpackage; public class Son extends Father { } 
  • Dodajte zaštićenu metodu foo() Father .

     package fatherpackage; public class Father { protected void foo(){} } 
  • Metoda foo() može se pozvati u četiri konteksta:

    • Unutar klase koja je u istom paketu u kojem foo() definiran foo() ( fatherpackage ):

       package fatherpackage; public class SomeClass { public void someMethod(Father f, Son s) { f.foo(); s.foo(); } } 
    • Unutar potklase u trenutnoj instanci putem this ili super :

       package sonpackage; public class Son extends Father { public void sonMethod() { this.foo(); super.foo(); } } 
    • U vezi čiji je tip iste klase:

       package fatherpackage; public class Father { public void fatherMethod(Father f) { f.foo(); // valid even if foo() is private } } ------------------------------------------- package sonpackage; public class Son extends Father { public void sonMethod(Son s) { s.foo(); } } 
    • U vezi čiji je tip roditeljske klase, a nalazi se unutar paketa u kojem foo() definiran foo() ( fatherpackage ) [Ovo može biti uključeno unutar nema konteksta. 1]:

       package fatherpackage; public class Son extends Father { public void sonMethod(Father f) { f.foo(); } } 
  • Sljedeće situacije su nevažeće.

    • U vezi, čija je vrsta roditeljske klase, a izvan paketa, gdje foo() definiran foo() ( fatherpackage ):

       package sonpackage; public class Son extends Father { public void sonMethod(Father f) { f.foo(); // compilation error } } 
    • Podklasa u paketu podrazreda (podrazred nasljeđuje zaštićene članove od roditelja i čini ih zatvorenima za ne-potklase):

       package sonpackage; public class SomeClass { public void someMethod(Son s) throws Exception { s.foo(); // compilation error } } 
37
15 нояб. odgovor je dan Eng.Fouad 15 nov. 2013-11-15 23:06 '13 u 23:06 2013-11-15 23:06

privatni

  • Metode, varijable i konstruktori

Metode, varijable i konstruktori deklarirani kao privatni mogu biti dostupni samo u deklariranoj klasi.

  • Klasa i sučelje

Privatni modifikator koji je dostupan je najrestriktivnija razina pristupa. Klasa i sučelja ne mogu biti privatni.

primjedba

Varijable koje su deklarirane kao privatne mogu biti dostupne izvan klase ako klasa ima javne metode dobivanja. Varijable, metode i konstruktori deklarirani zaštićeni u nadklasi mogu biti dostupni samo potklasama drugog paketa ili bilo kojoj klasi paketa klase zaštićenih članova. <h / ">

zaštićen

  • Klasa i sučelje

Modifikator sigurnog pristupa ne može se primijeniti na klasu i sučelja.

Metode, polja se mogu proglasiti zaštićenim, međutim, metode i polja u sučelju ne mogu se proglasiti zaštićenim.

primjedba

Zaštićeni pristup daje podklasi mogućnost korištenja pomoćne metode ili varijable, ne dopuštajući nevezanoj klasi da je pokuša koristiti.

<h / ">

javnost

Klasa, metoda, konstruktor, sučelje, itd., Proglašeni javnim, mogu se pristupiti iz bilo koje druge klase.

Stoga se poljima, metodama, blokovima deklariranim unutar otvorene klase može pristupiti iz bilo koje klase koja pripada Java svemiru.

  • Razni paketi

Međutim, ako je otvorena klasa kojoj pokušavamo pristupiti u drugom paketu, onda javna klasa i dalje mora biti uvezena.

Zbog nasljeđivanja klasa, sve javne metode i varijable klasa nasljeđuju podklase.

<h / ">

Zadano - nema ključne riječi:

Zadani modifikator pristupa znači da ne izričito deklariramo modifikator pristupa za klasu, polje, metodu itd.

  • Unutar istih paketa

Varijabla ili metoda deklarirana bez modifikatora kontrole pristupa dostupna je za bilo koju drugu klasu u istom paketu. Polja u sučelju su implicitno javna statička konačna, a metode u sučelju su po defaultu javne.

primjedba

Ne možemo nadjačati statična polja. Ako ga pokušate zamijeniti, pogreška se neće prikazati, ali ne radi, osim za nas.

Odgovori na pitanja

Reference linkova

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

27
22 янв. Odgovor daje Nambi Jan 22 2014-01-22 16:08 '14 u 16:08 2014-01-22 16:08

Privatno : ograničen pristup samo klasi

Zadano (bez modifikatora) : ograničen pristup klasi i paketu

Zaštićeni : ograničen pristup razredu, paketu i potklasama (unutar i izvan)

Javno : pristup razredu, paketu (sve) i potklasama ... Ukratko, svugdje.

17
18 июня '14 в 10:13 2014-06-18 10:13 odgovor je dat samkit shah 18. lipnja 14. u 10:13 2014-06-18 10:13

Razlika se može naći u već spomenutim vezama, ali se onaj koji se koristi obično svodi na "načelo najmanjeg znanja". Dopustite samo minimalnu vidljivost koja je potrebna.

15
ответ дан Joe Phillips 18 окт. '08 в 23:00 2008-10-18 23:00