Vra

In Java is daar duidelike reëls oor wanneer om elkeen van toegangswysigers te gebruik, naamlik die verstek (pakket privaat), public, protected en private, terwyl jy maak class en interface en te doen het met erfenis?

Was dit nuttig?

Oplossing

Die amptelike handleiding van 'n paar gebruik om u mag wees .

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

 + : accessible         blank : not accessible

Ander wenke

(Waarskuwing:Ek is nie 'n Java-programmeerder nie, ek is 'n Perl-programmeerder.Perl het geen formele beskerming nie en dit is miskien hoekom ek die probleem so goed verstaan ​​:) )

Privaat

Soos jy sou dink, net die klas waarin dit verklaar is, kan dit sien.

Pakket Privaat

Kan slegs gesien en gebruik word deur die pakket waarin dit verklaar is.Dit is die verstek in Java (wat sommige as 'n fout beskou).

Beskerm

Pakket Privaat + kan deur subklasse of pakketlid gesien word.

Publiek

Almal kan dit sien.

Gepubliseer

Sigbaar buite die kode wat ek beheer.(Terwyl dit nie Java-sintaksis is nie, is dit belangrik vir hierdie bespreking).

C++ definieer 'n bykomende vlak genaamd "vriend" en hoe minder jy daarvan weet, hoe beter.

Wanneer moet jy wat gebruik?Die hele idee is inkapseling om inligting weg te steek.So veel as moontlik wil jy die detail van hoe iets gedoen word van jou gebruikers wegsteek.Hoekom?Want dan kan jy hulle later verander en nie iemand se kode breek nie.Dit laat jou toe om foute te optimaliseer, herontwerp en reg te stel sonder om bekommerd te wees dat iemand daardie kode gebruik het wat jy pas opgeknap het.

Dus, die reël is om dinge net so sigbaar te maak as wat dit moet wees.Begin met privaat en voeg net meer sigbaarheid by soos nodig.Maak net dit openbaar wat absoluut noodsaaklik is vir die gebruiker om te weet, elke detail wat jy openbaar maak, belemmer jou vermoë om die stelsel te herontwerp.

As jy wil hê dat gebruikers in staat moet wees om gedrag aan te pas, eerder as om internals openbaar te maak sodat hulle dit kan ignoreer, is dit dikwels 'n beter idee om daardie guts in 'n voorwerp in te druk en daardie koppelvlak publiek te maak.Op hierdie manier kan hulle eenvoudig 'n nuwe voorwerp inprop.Byvoorbeeld, as jy besig was om 'n CD-speler te skryf en die "gaan soek inligting oor hierdie CD"-bietjie aanpasbaar wou hê, eerder as om daardie metodes openbaar te maak, sal jy al daardie funksionaliteit in sy eie voorwerp plaas en net jou objek getter/setter publiek maak .Om suinig te wees om jou ingewande te ontbloot moedig dus goeie samestelling en skeiding van bekommernisse aan

Persoonlik hou ek net by "privaat" en "publiek".Baie OO-tale het dit net."Beskerm" kan handig wees, maar dit is regtig 'n kullery.Sodra 'n koppelvlak meer as privaat is, is dit buite jou beheer en moet jy in ander mense se kode gaan soek om gebruike te vind.

Dit is waar die idee van "gepubliseer" inkom.Om 'n koppelvlak te verander (herfaktorering daarvan) vereis dat jy al die kode vind wat dit gebruik en dit ook verander.As die koppelvlak privaat is, is daar geen probleem nie.As dit beskerm is moet jy al jou subklasse gaan soek.As dit publiek is moet jy al die kode gaan soek wat jou kode gebruik.Soms is dit moontlik, byvoorbeeld as jy aan korporatiewe kode werk wat slegs vir interne gebruik is, maak dit nie saak of 'n koppelvlak publiek is nie.U kan al die kode uit die korporatiewe bewaarplek haal.Maar as 'n koppelvlak "gepubliseer" is, as daar kode is wat dit buite jou beheer gebruik, dan word jy uitgeput.Jy moet daardie koppelvlak ondersteun of die risiko loop om kode te breek.Selfs beskermde koppelvlakke kan as gepubliseer beskou word (dit is hoekom ek my nie aan beskerm steur nie).

Baie tale vind die hiërargiese aard van publiek/beskermd/privaat te beperkend en nie in lyn met die werklikheid nie.Vir daardie doel is daar die konsep van a eienskap klas, maar dit is 'n ander vertoning.

Hier is 'n beter weergawe van die tafel. (Future proof met 'n kolom vir modules.)

 Java Toegang Wysigers

Verduidelikings

  • private lid (i) is net toeganklik binne dieselfde klas as dit verklaar.

  • 'n Lid met nie toegang wysiger (j) is slegs toeganklik binne klasse in dieselfde pakket.

  • beskerm lid (k) is toeganklik binne alle klasse in dieselfde pakket en binne subklasse in ander pakkette.

  • openbare lid (l) is toeganklik vir alle klasse (tensy dit woonagtig is in 'n module wat nie die pakket verklaar in) nie uitvoer.


Watter wysiger om van te kies?

Toegang wysigers is 'n hulpmiddel om jou te help om ongeluk te voorkom breek inkapseling (*) . Vra jouself as jy die lid aan iets wat interne om die klas, pakket, klas hiërargie of nie interne glad wees van plan, en kies toegang vlak dienooreenkomstig.

Voorbeelde:

  • 'n veld long internalCounter moet waarskynlik private wees, want dit is wispelturig en 'n implementering detail.
  • 'n klas wat net moet aangehaal in 'n fabriek klas (in dieselfde pakket) moet 'n pakket beperk konstruktor het, aangesien dit nie moontlik sou wees om dit direk te roep van buite die pakket.
  • 'n Interne void beforeRender() metode genoem reg voor lewering en gebruik as 'n haak in subklasse moet beskerm word.
  • 'n void saveGame(File dst) metode wat genoem word uit die GUI-kode moet publiek wees.

(*) Wat is Enkapsulering presies?

                | 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         |       ✔       |     ✘     |       ✘       |   ✘    

Maklike reël.Begin deur alles privaat te verklaar.En vorder dan na die publiek soos die behoeftes ontstaan ​​en ontwerp dit regverdig.

Wanneer lede blootstel, vra jouself af of jy voorstellingskeuses of abstraksiekeuses blootstel.Die eerste is iets wat jy wil vermy, aangesien dit te veel afhanklikhede van die werklike voorstelling eerder as van die waarneembare gedrag daarvan sal inbring.

As 'n algemene reël probeer ek om metode-implementerings te vermy deur subklassering;dit is te maklik om die logika te verknoei.Verklaar abstrakte beskermde metodes as jy van plan is om dit te ignoreer.

Gebruik ook die @Override-aantekening wanneer dit oorheers word om te keer dat dinge breek wanneer jy herfaktoreer.

Dit is eintlik 'n bietjie meer ingewikkeld as 'n eenvoudige rooster toon. Die rooster vir jou vertel of 'n toegang toegelaat word, maar wat presies 'n toegang uitmaak? Ook, toegang vlakke interaksie met geneste klasse en erfenis in komplekse maniere.

Die "standaard" toegang (wat deur die afwesigheid van 'n navraag) is ook 'n beroep pakket -private . Uitsondering: in 'n koppelvlak, geen wysiger beteken toegang publiek; behalwe openbare wysigers is verbode. Enum konstantes is altyd publiek.

Opsomming

Is 'n toegang tot 'n lid met hierdie toegang specific toegelaat?

  • Lid is private: Slegs indien lid binne dieselfde klas word gedefinieer as 'n beroep kode
  • .
  • Lid is pakket private: Slegs indien die roeping kode is binne onmiddellik omringende pakket die lid se
  • .
  • Lid is protected:. Dieselfde pakket, of as lid word gedefinieer in 'n superklas van die klas met die roeping kode
  • Lid is public:. Ja

Wat toegang spesifiseerders van toepassing op

Plaaslike veranderlikes en formele parameters kan nie toegang spesifiseerders neem. Omdat hulle inherent ontoeganklik vir die buite volgens omvangsbepaling reëls, hulle is effektief private.

Vir klasse in die top omvang, net public en pakket-private toegelaat. Hierdie ontwerp keuse is vermoedelik omdat protected en private oorbodig by die pakket vlak sou wees (daar is geen erfdeel van pakkette).

Al die toegang spesifiseerders is moontlik op klaslede (konstruktors, metodes en statiese lid funksies, geneste klasse).

Verwante: Java Klas Toeganklikheid

Bestel

Die toegang spesifiseerders kan streng beveel

  

openbare> beskerm> pakket-private> private

Dit beteken dat public bied die mees toegang, private die minste. Enige verwysing moontlik op 'n private lid is ook geldig vir 'n pakket-private lid; enige verwysing na 'n pakket-private lid is geldig op 'n beskermde lid, en so aan. (Gee toegang tot beskermde lede na ander klasse in dieselfde pakket was beskou as 'n fout.)

Notes

  • metodes se A-klas is toegelaat word om toegang tot private lede van ander voorwerpe van die dieselfde klas. Meer presies, 'n metode van klas C toegang private lede van C op voorwerpe van enige subklas van C. Java ondersteun nie die beperking van toegang deur byvoorbeeld net deur die klas. (Vergelyk met Scala, wat beteken ondersteun dit met behulp van private[this].)
  • Jy moet toegang tot 'n konstruktor om 'n voorwerp te bou. So as al vervaardigerskampioenskap is privaat, die klas kan slegs gebou word deur kode lewe binne die klas (tipies statiese fabriek metodes of statiese veranderlike initializers). Net so vir pakket-private of beskerm vervaardigerskampioenskap.
    • Slegs met private vervaardigerskampioenskap beteken ook dat die klas nie ekstern kan subclassed, aangesien Java vereis vervaardigerskampioenskap 'n subklas se implisiet of uitdruklik noem 'n superklas constructor. (Dit kan egter bevat 'n geneste klas dat dit subklasse.)

Inner klasse

Jy moet ook oorweeg geneste bestekke, soos innerlike klasse. 'N Voorbeeld van die kompleksiteit is dat innerlike klasse het lede wat hulself toegang wysigers kan neem. Sodat jy kan 'n private innerlike klas met 'n openbare lid het; kan die lid verkry word? (Sien hieronder.) Die algemene reël is om te kyk na die omvang en dink rekursief om te sien of jy kan toegang tot elke vlak.

Dit is egter baie ingewikkeld, en vir volledige besonderhede, raadpleeg die Java taal spesifikasie . (Ja, daar het samesteller foute in die reeds verlede.)

Vir 'n voorsmakie van hoe hierdie interaksie, oorweeg hierdie voorbeeld. Dit is moontlik om "lek" private innerlike klasse; Dit is gewoonlik 'n waarskuwing:

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();
    }
}

Vertalerkonstruksie uitset:

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

Sommige verwante vrae:

As 'n reël van die duim:

  • private:. Klas omvang
  • default (of package-private):. Pakket omvang
  • protected: package scope + child (soos pakket, maar ons kan dit oorerf van verskillende pakkette). Die beskermde wysiger hou altyd die "ouer-kind" verhouding.
  • public:. Oral

As gevolg hiervan, as ons verdeel toegang regte in drie regte:

  • (D) irect (roep van 'n metode in dieselfde klas, of via "hierdie" syntax).
  • (R) eference (roep 'n metode met behulp van 'n verwysing na die klas, of via "dot" syntax).
  • (I) nheritance (via subclassing).

dan moet ons hierdie eenvoudige tabel:

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

In 'n baie kort

  • public: toeganklik van oral.
  • protected:. Toeganklik deur die klasse van dieselfde pakket en die subklasse woonagtig in enige pakket
  • verstek (geen wysiger gespesifiseerde):. Toeganklik deur die klasse van dieselfde pakket
  • private:. Toeganklik binne net dieselfde klas

Die mees misverstaan ​​toegangswysiger in Java is protected.Ons weet dat dit soortgelyk is aan die verstek wysiger met een uitsondering waarin subklasse dit kan sien.Maar hoe?Hier is 'n voorbeeld wat hopelik die verwarring verduidelik:

  • Aanvaar dat ons 2 klasse het; Father en Son, elk in sy eie pakket:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • Kom ons voeg 'n beskermde metode by foo() aan Father.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • Die metode foo() kan in 4 kontekste genoem word:

    1. Binne 'n klas wat geleë is in dieselfde pakket waar foo() is gedefinieer (fatherpackage):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. Binne 'n subklas, op die huidige instansie via this of super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. Op 'n verwysing waarvan die tipe dieselfde klas is:

      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();
          }
      }
      
    4. Op 'n verwysing wie se tipe die ouerklas is en dit is binne die pakket waar foo() is gedefinieer (fatherpackage) [Dit kan binne konteks no.1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • Die volgende situasies is nie geldig nie.

    1. Op 'n verwysing wie se tipe die ouerklas is en dit is buite die pakket waar foo() is gedefinieer (fatherpackage):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. 'n Nie-subklas binne 'n pakket van 'n subklas ('n Subklas erf die beskermde lede van sy ouer, en dit maak hulle privaat vir nie-subklasse):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      

Privaat

  • Metodes, veranderlikes en konstrukteurs

Metodes, veranderlikes en Konstrukteurs wat privaat verklaar is, kan slegs binne die verklaarde klas self verkry word.

  • Klas en koppelvlak

Privaattoegangswysiger is die mees beperkende toegangsvlak.Klas en koppelvlakke kan nie privaat wees nie.

Let wel

Veranderlikes wat privaat verklaar is, kan buite die klas verkry word as publieke getermetodes in die klas teenwoordig is.Veranderlikes, metodes en konstruktors wat in 'n superklas as beskerm verklaar word, kan slegs deur die subklasse in 'n ander pakket of enige klas binne die pakket van die beskermde ledeklas verkry word.


Beskerm

  • Klas en koppelvlak

Die beskermde toegang wysiger kan nie op klas en koppelvlakke toegepas word nie.

Metodes, velde kan beskerm verklaar word, maar metodes en velde in 'n koppelvlak kan nie beskerm verklaar word nie.

Let wel

Beskermde toegang gee die subklas 'n kans om die helper-metode of veranderlike te gebruik, terwyl 'n nie-verwante klas verhoed om dit te probeer gebruik.


Publiek

'n Klas, metode, konstruktor, koppelvlak ens wat publiek verklaar is, kan vanaf enige ander klas verkry word.

Daarom kan velde, metodes, blokke wat in 'n publieke klas verklaar is, verkry word vanaf enige klas wat aan die Java-heelal behoort.

  • Verskillende pakkette

Maar as die publieke klas wat ons probeer om toegang te verkry in 'n ander pakket is, moet die publieke klas steeds ingevoer word.

As gevolg van klasoorerwing word alle publieke metodes en veranderlikes van 'n klas deur sy subklasse geërf.


Verstek - Geen sleutelwoord:

Verstektoegangswysiger beteken dat ons nie 'n toegangswysiger vir 'n klas, veld, metode, ens.

  • Binne dieselfde pakkette

'n Veranderlike of metode verklaar sonder enige toegangsbeheer wysiger is beskikbaar vir enige ander klas in dieselfde pakket.Die velde in 'n koppelvlak is implisiet publiek statiese finaal en die metodes in 'n koppelvlak is by verstek publiek.

Let wel

Ons kan nie die statiese velde ignoreer nie. As u probeer om dit te ignoreer, toon dit geen fout nie, maar dit werk nie wat ons behalwe nie.

Verwante antwoorde

Verwysings skakels

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

Private : Beperk toegang tot klas net

Standaard (geen wysiger) : Beperk toegang tot klas en pakket

Beskermde : Beperk toegang tot klas, pakket en subklasse (beide binne en buite pakket)

Openbare :. Toeganklik vir klas, pakket (al), en subklasse ... In kort, oral

Die verskil kan gevind word in die skakels reeds maar watter een om te gebruik gewoonlik kom neer op die "beginsel van kleinste Knowledge". Net toelaat dat die minste sigbaarheid wat nodig is.

Toegang wysigers is daar om toegang op verskeie vlakke beperk.

Openbare:. Dit is basies so eenvoudig as wat jy kan toegang vanaf enige klas of dit in dieselfde pakket of nie

Om toegang as jy in dieselfde pakket wat jy kan direk toegang, maar as jy in 'n ander pakket dan kan jy 'n voorwerp van die klas te skep.

Standaard:. Dit is toeganklik in dieselfde pakket van enige van die klas van pakket

Om toegang kan jy 'n voorwerp van die klas te skep. Maar jy kan nie hierdie veranderlike toegang buitekant van die pakket.

Beskermde: kan jy toegang veranderlikes in dieselfde pakket asook subklas in enige ander pakket. so basies dit is verstek + Geërf gedrag.

Om toegang tot beskermde gebied omskryf in basis klas wat jy kan voorwerp van kind klas te skep.

Private:. kan toegang in dieselfde klas wees

In nie-statiese metodes kan jy direk toegang as gevolg van hierdie verwysing (ook in vervaardigerskampioenskap) maar om toegang in statiese metodes wat jy nodig het om objek van die klas te skep.

Toegang wysigers in Java.

toegang Java wysigers gebruik word om toegangsbeheer in Java te voorsien.

1. Standaard:

Toeganklik vir die klasse in dieselfde pakket net.

Byvoorbeeld,

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B{
  public static void main(String args[]){
   A obj = new A(); // Compile Time Error
   obj.msg(); // Compile Time Error
  }
}

Dit toegang is meer beperk as openbare en beskerm, maar minder beperkte as private.

2. Openbare

Kan verkry word vanaf enige plek. (Global Access)

Byvoorbeeld,

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}
  

Uitgawe: Hallo

3. Private

toeganklike net binne dieselfde klas.

As jy probeer om toegang te verkry tot private lede op een klas in 'n ander sal gooi saam te stel fout. Byvoorbeeld,

class A{
  private int data = 40;
  private void msg(){System.out.println("Hello java");}
}

public class Simple{
  public static void main(String args[]){
    A obj = new A();
    System.out.println(obj.data); // Compile Time Error
    obj.msg(); // Compile Time Error
  }
}

4. Beskerm

slegs toeganklik is vir die klasse in dieselfde pakket en die subklasse

Byvoorbeeld,

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}
  

Uitgawe: Hallo

 Tik beeld beskrywing hier

Ek wil net 'n detail wat baie algemeen verkeerd is het aan te spreek, onder meer deur die meeste van die antwoorde op hierdie bladsy. "Standaard" toegang (wanneer daar geen toegang wysiger teenwoordig is) is nie altyd dieselfde as pakket-private . Dit hang af van wat die ding is.

  • tipes Nie-lid (dit wil sê, klasse, enums, interfaces, en tipes body nie binne 'n ander tipe verklaar) is pakket-private by verstek. ( JLS §6.6.1 )

  • lede en konstruktors Klas is pakket-private by verstek. ( JLS §6.6.1 )

  • Enum vervaardigerskampioenskap is private by verstek . (Inderdaad, enum contructors moet wees private, en dit is 'n fout om te probeer hulle openbare of beskerm te maak). Enum konstantes is publiek, en moenie toelaat dat enige toegang specific. Ander lede van enums is pakket-private by verstek. ( JLS §8.9 )

  • Alle lede van koppelvlakke en tipes body is openbare by verstek . (Trouens, lede van koppelvlakke en tipes body moet openbare wees, en dit is 'n fout om te probeer om hulle private of beskermde maak.) (JLS §9.3 tot 9.5 )

  • openbare -. Toeganklik vanaf enige plek in die aansoek

  • verstek -. Toeganklik vanaf pakket

  • beskerm - toeganklik vanaf pakket en sub-klasse in ander pakket. sowel

  • private -. Toeganklik vanaf sy klas net

Sigbaar aan die pakket. Die verstek. Geen wysigers nodig.

Sigbaar aan die klas net ( private ).

Sigbaar aan die wêreld ( openbare ).

Sigbaar aan die pakket en alle subklasse ( beskerm ).

Veranderlikes en metodes kan verklaar sonder enige wysigers wat geroep is. Standaard voorbeelde:

String name = "john";

public int age(){
    return age;
}

Private toegang wysiger - private:

Metodes, veranderlikes en konstruktors dat private verklaar kan slegs verkry word binne die verklaarde klas self. Die private toegang wysiger is die mees beperkende toegang vlak. Klas en koppelvlakke kan nie privaat wees.

Veranderlikes wat private verklaar kan verkry word buite die klas as openbare lucky metodes teenwoordig in die klas is.

Die gebruik van die private wysiger is die belangrikste manier waarop 'n voorwerp saamvat self en huide data van die buitewêreld.

Voorbeelde:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

Openbare toegang wysiger - openbare:

'n klas, metode, konstruktor, koppelvlak, ens verklaar publiek kan verkry word vanaf 'n ander klas. Daarom velde, metodes, blokke in 'n openbare klas verklaar kan verkry word vanaf enige klas wat aan die Java heelal.

As die publiek klas ons probeer om toegang is in 'n ander pakket, dan is die openbare klas moet nog ingevoer.

As gevolg van die klas erfenis, alle openbare metodes en veranderlikes van 'n klas is geërf deur sy subklasse.

Voorbeeld:

public void cal(){

}

Beskermde toegang wysiger - beskerm:

Veranderlikes, metodes en konstruktors wat verklaar beskerm in 'n superklas kan verkry word slegs deur die subklasse in 'n ander pakket of enige klas binne die pakket van die klas die beskermde lede.

Die beskermde toegang wysiger kan nie toegepas word om die klas en koppelvlakke. Metodes, kan velde verklaar beskerm egter metodes en velde in 'n koppelvlak nie verklaar kan word beskerm.

Beskermde toegang gee die subklas 'n kans om die helper metode of veranderlike te gebruik, terwyl die voorkoming van 'n nonrelated klas van probeer om dit te gebruik.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

Hierdie blad skryf goed oor die beskermde & verstek toegang wysiger

.... Beskerm: beskerm toegang wysiger is die 'n bietjie lastig en jy kan sê, is 'n superstel van die verstek toegang wysiger. Beskerm lede is dieselfde as die standaard lede sover die toegang in dieselfde pakket betref. Die verskil is dat die beskermde lede is ook toeganklik vir die subklasse van die klas waarin die lid verklaar wat buite die pakket waarin die ouer klas teenwoordig is.

Maar hierdie beskermde lede is "toeganklik buite die pakket slegs deur erfenis". d.w.z jy kan direk toegang tot 'n beskermde lid van 'n klas in sy subklas teenwoordig in 'n ander pakket asof die lid teenwoordig is in die subklas self is. Maar dit beskerm lid sal nie toeganklik in die subklas buite die pakket deur gebruik te maak van verwysing ouer klas se. ....

David se antwoord bied die betekenis van elke toegang wysiger. Soos vir wanneer om elke gebruik, sou ek raai die maak van openbare alle klasse en die metodes van elke klas wat bedoel is vir eksterne gebruik (sy API), en alles anders private.

Met verloop van tyd sal jy 'n sin vir wanneer 'n paar klasse pakket-private maak en wanneer om sekere metodes beskerm vir gebruik in subklasse verklaar ontwikkel.

Let wel:. Dit is net 'n aanvulling vir die aanvaarde antwoord

Dit is wat verband hou met Java Toegang Wysigers .

Van Java Toegang Wysigers :

  

'n Java toegang wysiger spesifiseer wat klasse kan toegang tot 'n gegewe   klas en sy buiteveld, konstruktors en metodes. Toegang wysigers kan   word vir 'n klas apart gespesifiseer, sy konstruktors, velde en   metodes. Java toegang wysigers word ook soms in die daaglikse verwys   toespraak as Java toegang spesifiseerders, maar die korrekte naam is Java toegang   wysigers. Klasse, velde, konstruktors en metodes kan 'n mens hê   vier verskillende toegang Java wysigers:

     
      
  • Lys item
  •   
  • private
  •   
  • verstek (pakket)
  •   
  • beskerm
  •   
  • openbare
  •   

Van beheer van toegang tot die lede van 'n Klas tutoriale:

  

Toegang vlak wysigers bepaal of ander klasse 'n kan gebruik   spesifieke veld of roep 'n bepaalde metode. Daar is twee vlakke   van toegangsbeheer:

     
      
  • Op die boonste vlak-publiek, of pakket-private (geen eksplisiete wysiger).
  •   
  • By die lid vlak-openbare, private, beskerm, of pakket-private (geen eksplisiete wysiger).
  •   
     

'n klas kan verklaar word met die wysiger publiek, in welke geval dit   klas is sigbaar vir alle klasse oral. As 'n klas het geen wysiger   (Die verstek, ook bekend as pakket-private), dit is net sigbaar   binne sy eie pakket

     

Die volgende tabel toon die toegang tot lede toegelaat by elke   wysiger.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝
     

Die eerste data kolom dui aan of die klas self het toegang tot   die lid bepaal deur die toegang vlak. Soos jy kan sien, 'n klas altyd   het toegang tot sy eie lede. Die tweede kolom dui aan of   klasse in dieselfde pakket as die klas (ongeag hul   ouerskap) het toegang tot die lid. Die derde kolom dui   of subklasse van die klas buite hierdie pakket verklaar het   toegang tot die lid. Die vierde kolom dui aan of alle klasse   het toegang tot die lid.

     

Toegang vlakke beïnvloed jy op twee maniere. Eerstens, wanneer jy gebruik klasse wat   kom uit 'n ander bron, soos die klasse in die Java platform,   toegang vlakke bepaal watter lede van dié klasse jou eie   klasse kan gebruik. Tweedens, wanneer jy 'n klas te skryf, moet jy besluit   wat toegang vlak elke lid veranderlike en elke metode in jou klas   behoort te hê.

Openbare Beskermde Standaard en private is toegang wysigers.

Hulle is bedoel vir inkapseling, of wegkruip en wys inhoud van die klas.

  1. Klas kan wees openbare of standaard
  2. lede
  3. Klas kan publiek, beskerm, versuim of private.
  4. wees

Private is nie toeganklik nie buite die klas Standaard is slegs toeganklik in die pakket. Beskerm in pakket asook enige klas wat dit strek. Openbare oop vir almal.

Gewoonlik, lid veranderlikes private gedefinieer, maar lid metodes is publiek.

Ek het dikwels besef dat die onthou van die basiese konsepte van enige taal moontlik gemaak kan word deur werklike analogieë te skep.Hier is my analogie om toegangswysigers in Java te verstaan:

Kom ons neem aan dat jy 'n student aan 'n universiteit is en jy het 'n vriend wat vir jou oor die naweek kom kuier.Gestel daar is 'n groot standbeeld van die universiteit se stigter in die middel van die kampus.

  • Wanneer jy hom na die kampus bring, is die eerste ding wat jy en jou vriend sien hierdie standbeeld.Dit beteken enigiemand wat op die kampus stap, kan sonder die universiteit se toestemming na die standbeeld kyk.Dit maak die standbeeld as PUBLIEK.

  • Vervolgens wil jy jou vriend na jou koshuis neem, maar daarvoor moet jy hom as 'n besoeker registreer.Dit beteken dat hy 'n toegangspas (wat dieselfde as joune is) kry om by verskeie geboue op kampus in te kom.Dit sou sy toegangskaart as maak BESKERM.

  • Jou vriend wil by die kampus-WiFi aanmeld, maar het nie die geloofsbriewe om dit te doen nie.Die enigste manier waarop hy aanlyn kan kom, is as jy jou aanmelding met hom deel.(Onthou, elke student wat na die universiteit gaan beskik ook oor hierdie aanmeldbewyse).Dit sal jou aanmeldbewyse maak as GEEN WYSIGERS NIE.

  • Ten slotte wil jou vriend jou vorderingsverslag vir die semester lees wat op die webwerf geplaas word.Elke student het egter hul eie persoonlike aanmelding om toegang tot hierdie afdeling van die kampuswebwerf te verkry.Dit sou maak dat hierdie geloofsbriewe as PRIVAAT.

Hoop dit help!

As jy aan toegangswysigers dink, dink net so daaraan (van toepassing op albei veranderlikes en metodes):

public --> van oral af toeganklik
private --> slegs toeganklik binne dieselfde klas waar dit verklaar is

Nou ontstaan ​​die verwarring wanneer dit kom by default en protected

default --> Geen toegangswysiger sleutelwoord is teenwoordig nie.Dit beteken dit is streng binne die pakket van die klas beskikbaar. Nêrens nie buite daardie pakket kan dit verkry word.

protected --> Bietjie minder strenger as default en afgesien van dieselfde pakketklasse kan dit verkry word deur subklasse buite die pakket dit word verklaar.

Dit is alles oor inkapseling (of as Joe Phillips gesê, minste kennis ).

Begin met die mees beperkende (privaat) en kyk of jy minder beperkende wysigers later op nodig.

Ons het almal metode en lid gebruik wysigers soos private, openbare, ... maar een ding te min ontwikkelaars doen, is gebruik pakkette om organiseer -kode logies.

Byvoorbeeld: Jy kan sensitiewe sekuriteit metodes in 'n "Security" pakket sit. sit dan 'n openbare klas wat 'n paar van die sekuriteit verwante kode in hierdie pakket toegang maar hou ander sekuriteit klasse pakket private . So ander ontwikkelaars sal slegs in staat wees om die publiek sigbaar klas gebruik van buite van hierdie pakket (tensy hulle die wysiger verander). Dit is nie 'n sekuriteit funksie, maar sal op gids gebruik.

Outside world -> Package (SecurityEntryClass ---> Package private classes)

Nog 'n ding is dat klasse wat baie afhanklik is van mekaar te kan eindig in dieselfde pakket en kan uiteindelik refactored of saamgesmelt as die afhanklikheid is te sterk.

As inteendeel jy alles soos gestel openbare dit sal nie duidelik wat moet of moet nie toeganklik wees, wat kan lei tot die skryf van 'n baie javadoc (wat niks beteken dwing via die samesteller ...).

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top