Java, ictimai, təhlükəsiz, partiyalar və xüsusi arasında fərq nədir?

Java'da, giriş modifikatorlarından hər birini, yəni standart (şəxsi paket), public , protectedprivate etməklə, classinterface devralma ilə necə istifadə edəcəyi barədə dəqiq qaydalar var?

2722
18 окт. 18 oct . 2008-10-18 22:53 '08 at 22:53 pm 2008-10-18 22:53
@ 27 cavab

Rəsmi bələdçi sizə faydalı ola bilər.

 C Subtitles Subclass Q Wi (Lk pkg) │ (diff pkg) │ │ │ │ │ │ │ │ │ │ │ │ │ ³ ³ ³ ³ ³ ³ ³ │ │ │ │ │ │ │ │ │ │ │ │ G E + ────────────────────────── ictimai + + + + + + + + + ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ qorunur + │ + + + + ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ heç bir dəyişdirici yoxdur + V + V + ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ özəlliyi  +: əlçatan boş: əlçatan deyil
4983
18 окт. David S. tərəfindən verilmiş cavabı Oct 18 2008-10-18 22:57 '08 saat 22:57 'da 2008-10-18 22:57

(Caveat: Mən bir Java programcı deyiləm, Perl proqramçıyam. Perl heç bir formal qorunması yoxdur, bəlkə də bu problemi çox yaxşı başa düşürəm :))

Şəxsi

Bunu yalnız bəyan olunduğu sinifdə görmək olarmı?

Şəxsi paket

Yalnız bəyan olunduğu paket tərəfindən göstərilə və istifadə edilə bilər. Bu Java-da (bəzi insanlar səhv hesab edir) default dəyərdir.

Qorunan

Xüsusi + paket alt siniflər və ya paketin üzvü tərəfindən görünə bilər.

İctimai

Hər kəs bunu görə bilir.

border=0

Nəşr olundu

İdarə etdiyim kodun xaricində görünür. (Bu Java sözdizimi deyilsə də, bu müzakirə üçün vacibdir).

C ++ "dost" adını əlavə səviyyədə müəyyənləşdirir və daha az tanınıb, daha yaxşıdır.

Nə vaxt istifadə etməlisiniz? Bütün fikir informasiya gizlətmək üçün encapsulation edir. Mümkün olduğunca, istifadəçilərinizdən bir şeyin necə edildiyini detalları gizlətmək istəyirsən. Niyə? Çünki daha sonra onları dəyişə və hər kəsin qarşısını ala bilməzsən. Bu, yenilənmiş olan bu kodu istifadə edən kimsə qorxusuz səhvləri optimallaşdırmağa, yenidən təşkil etməyə, düzəltməyə və düzəltməyə imkan verir.

Beləliklə, başparmak qaydası şeyləri görünən kimi görünməkdir. Şəxsi ilə başlayın və yalnız lazım olduğu qədər daha çox görünürlük əlavə edin. İstifadəçinin bilməsi üçün tamamilə zəruri olanları dərc edin, ictimaiyyətin hər bir detalını sisteminizi yenidən qurma qabiliyyətinizi yaradır.

Istədiyiniz zaman istifadəçiləri özlərini yenidən təyin edə biləcək şəkildə davranışlarını dəyişməsini istəyirlərsə, bu cəlbediciləri bir obyektə sürükləmək və bu interfeysi ictimaiyyətə çatdırmaq daha yaxşıdır. Beləliklə, onlar sadəcə yeni bir obyektə qoşula bilərlər. Məsələn, bir CD yazıcı yazırsan və "bu CD haqqında məlumatı tap" istədiyində, bu metodları yaymaqdan başqa, bütün bu funksiyaları öz obyektinizə daxil edin və getter / setter obyektinizi Buna görə ümumiyyətlə əlçatan olduğunuzda, mənfəətinizi ortaya qoymağın səliqəsizliyi, yaxşı bir tərkibi və problemlərin ayrılmasını təşviq edir.

Şəxsən mən yalnız "özəl" və "ictimai" kimi qalıram. Bir çox OO dilləri bunlardır. "Qorunan" faydalı ola bilər, amma həqiqətən də bir aldadıcıdır. İnterfeys özəllikdən daha çox qısa müddətdə nəzarəti xaricindədir və onu digər insanlara tapmaq üçün kodu axtarmaq lazımdır.

Burada "nəşriyyat" ideyası gəlir. Interferi dəyişdirmək (refactoring) onu istifadə edən və dəyişən bütün kodları tapmaq tələb edir. İnterfeys xüsusi olsa, heç bir problem yoxdur. Qorunan vəziyyətdə, bütün alt sinifləri tapmaq lazımdır. Əgər ümumi olsa, kodu istifadə etdiyiniz bütün kodları tapmaq lazımdır. Bəzən bu mümkündür, məsələn, yalnız daxili istifadə üçün istifadə olunan korporativ kodla işləsəniz, interfeysi açıq olub-olmadı. Bütün kodları korporativ depoda çıxarın. Ancaq əgər interfeys "nəşr olunarsa", nəzarətdən kənarda istifadə edən bir kod varsa, onda siz bağlanacaqsınız. Bu interfeysi və ya risk pozuntu kodunu dəstəkləməlisiniz. Hətta təhlükəsiz interfeyslər nəşr olunub (beləliklə, təhlükəsizlik barədə narahat olmayın).

Çox dildə ictimai / qorunan / xüsusi hiyerarxik təbiəti çox məhdudlaşdırıcı və reallıqla ziddiyyət təşkil edir. Bunun üçün sinif konsepsiyası var, amma bu fərqli bir nümayişdir.

397
19 окт. Schwern tərəfindən 19 oktyabrda cavab verildi 2008-10-19 00:17 '08 at 0:17 2008-10-19 00:17

Cədvəlin ən yaxşı versiyası. (Gələcək modulların sütunudur.)

2019

10 нояб. aioobe tərəfindən verilmiş cavab 10 noyabr 2015-11-10 13:27 '15 at 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 янв. Cavab Abdull Jan 10 tərəfindən verildi 2013-01-10 00:42 '13 at 0:42 2013-01-10 00:42

Sadə qayda. Bütün şəxsi elan edərək başlayın. Və sonra ehtiyaclar yarandıqca ictimaiyyətə doğru irəliləyir və dizayn onu haqlıdır.

Sərgi iştirakçılarını sərgilədikdə, özünüzdən bir seçim və ya soyuducu seçim etdiyinizi soruşun. Birincisi, qaçmaq istəməyiniz nədir, çünki o, müşahidə olunan davranışı ilə deyil, faktiki təqdimata çox çox asılılıqları təqdim edəcəkdir.

Bir qayda olaraq, mən subclassing tərəfindən bir metodun həyata keçirilməsi overriding qarşısını almaq üçün çalışırıq; məntiqi boğmaq çox asandır. Əgər onu ləğv etmək niyyətindəsinizsə, mücərrəd qorunan üsulları bildirin.

Ayrıca yenidən təşkil edərkən şeylər pozulmaması üçün yenidən təyin edərkən @ Override əlavə istifadə edin.

142
18 окт. Cavab 18 oktyabrda John Nilsson tərəfindən verildi 2008-10-18 23:00 '08 23:00 2008-10-18 23:00 'da

Bu, həqiqətən, sadə ızgaralardan daha mürəkkəbdir. Şəbəkə girişə icazə veriləcəyini göstərir, lakin tam olaraq nədir? Bundan əlavə, giriş səviyyələri iç-içə siniflər və mirasla kompleks yollarla qarşılıqlı əlaqə qurur.

Standart giriş (sözün olmaması ilə göstərilən) ayrıca paket-fərdi olaraq da adlanır. İstisna: interfeysdə heç bir dəyişən açıq giriş demək deyil; qeyri-ictimai dəyişdiricilər qadağandır. Davamlı sabitlər həmişə açıqdır.

Xülasə

Müəyyən giriş göstəricisi olan bir üzvə icazə verilirmi?

  • Üzv private : əgər üzv çağırış kodu ilə eyni sinifdə müəyyənləşdirilirsə.
  • İstifadəçi qapalı bir paketdir: yalnız zəng kodu dərhal paketi daxil edən bir üzvü içərisindədir.
  • İstifadəçi protected : eyni paket və ya üzv çağrı kodunu ehtiva edən sinifin üst sinfində müəyyənləşdirildikdə.
  • İstifadəçi public : Bəli.

Hansı məlumatlara aiddir?

Yerli dəyişənlər və formal parametrlər giriş göstəriciləri qəbul edə bilməz. Baxış sahəsinin müəyyənləşdirilməsi qaydalarına uyğun olaraq, onlar xaricdən təbiətdən əlçatan olmadığı üçün həqiqətən bağlanırlar.

Üst paneldə dərslər üçün yalnız public və xüsusi paket verilə bilər. Bu dizayn seçimi, paketin səviyyəsində protectedprivate ehtiyac duyulmayacağına görə qəbul edilir (paket mirası yoxdur).

Bütün çıxış xüsusiyyətləri sinif üzvləri (konstruktorlar, üsullar və statik üzv funksiyaları, yuvalanmış siniflər) üçün mümkündür.

İlgili: Java class accessibility

Sifariş

Access specifiers dəqiq sifariş verilə bilər.

ictimai> qorunan> paket-xüsusi> xüsusi

public ən az private , ən azı private təmin etdiyini bildirir. Xüsusi bir üzvə təqdim edilən hər hansı arayış xüsusi paketin üzvü üçün də etibarlıdır; xüsusi paketin üzvü ilə əlaqəli istinadlar qorunan bir üzv üçün etibarlıdır və s. (Bir paketdə qorunan üzvlərin digər siniflərə çıxışı təmin edilməsi səhv hesab edilmişdir).

Qeydlər

  • Class üsulları eyni sinifdə olan digər obyektlərin xüsusi üzvlərinə giriş imkanı verir. Daha doğrusu, C sinifinin bir metodu C-nin hər hansı bir alt sinifinin C obyektlərinin xüsusi üzvlərinə daxil ola bilər. Java, sinifə görə yalnız giriş məhdudiyyətini dəstəkləmir. ( private[this] istifadə edərək, dəstəkləyən Scala ilə müqayisə edin.)
  • Obyekt yaratmaq üçün konstruktordan istifadə etmək lazımdır. Beləliklə, əgər bütün konstruktorlar özəldirsə, bir sinif yalnız bir sinif daxilində yaşayan kodla (adətən statik zavod üsulları və ya statik dəyişən başlanğıclar) yaradıla bilər. Eyni şəkildə inşaatçılar üçün, özəl-özəl və ya qorunur.
    • Xüsusi konstruktorların olması yalnız sinifin xarici siniflərə təsnif edilə bilməyəcəyi deməkdir, çünki Java subclass konstruktorlarını üst sinfin konstruktorunu gizli və ya açıq şəkildə çağırmalıdır. (Lakin, alt sinifləri olan yuvalanmış bir sinif ola bilər.)

Daxili siniflər

Daxili siniflər kimi iç-içə bölgələri də nəzərə almalıyıq. Mürəkkəbliyə nümunədir ki, daxili siniflərdə giriş modifikatorlarını istifadə edə biləcək üzvlər var. Beləliklə, açıq bir üzv olan xüsusi bir daxili sinif ola bilərsiniz; bir üzvə daxil ola bilər? (Aşağıya baxın.) Ümumi qayda, hər bir səviyyəyə çıxa biləcəyinizi görmək üçün əhatə dairəsinə nəzər salmaq və recursively düşünməkdir.

Lakin, bu, olduqca çətindir və tam məlumat üçün Java > . (Bəli, keçmişdə kompüter səhvləri olmuşdur.)

Bunların necə qarşılıqlı olduğunu anlamaq üçün bu nümunəni nəzərdən keçirin. Bəlkə də özəl daxili siniflərin "sızması"; Bu adətən bir xəbərdarlıqdır:

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

Kompilyator çıxışı:

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

Bəzi suallar:

99
13 сент. Cavab 13 sentyabrda Mexanika salyangozu verilir 2012-09-13 10:38 '12 saat 10:38 'da 2012-09-13 10:38

Bir qayda olaraq,

  • Şəxsi : sinif.
  • default (və ya paket-özəl): paket sahəsi.
  • qorunur : paket əhatə dairəsi + uşaq (məsələn, bir paket, amma fərqli paketlərdən alt kassa verə bilərik). Mühafizə olunan dəyişən həmişə valideyn-uşaq münasibətini qoruyur.
  • ictimaiyyət : hər yerdə.

Nəticədə, əgər biz daxil hüquqlarını üç hüquqa bölsək:

  • (D) birbaşa (eyni sinif daxilində bir metodu çağır).
  • (R) (sinif istinadına və ya "dot" sözdiziminə əsaslanan üsul çağırışı).
  • (I) nifrət (subclassinq vasitəsilə).

bu sadə masa var:

 +—-———————————————+————————————+———————————+ | | Same | Different | | | Package | Packages | +—————————————————+————————————+———————————+ | private | D | | +—————————————————+————————————+———————————+ | package-private | | | | (no modifier) | DRI | | +—————————————————+————————————+———————————+ | protected | DRI | I | +—————————————————+————————————+———————————+ | public | DRI | RI | +—————————————————+————————————+———————————+ 
72
18 дек. Cavab nxhoaf 18 dec ilə verilir. 2012-12-18 21:01 '12 saat 09:01 'da 2012-12-18 21:01

Çox qısa

  • public : hər yerdə mövcuddur.
  • protected : hər hansı bir paketdə yerləşən eyni paket və alt siniflərdə dərslərə giriş.
  • default (heç bir dəyişən göstərilməyib): eyni paketin siniflərindən istifadə edilə bilər.
  • private : yalnız bir sinifdə mövcuddur.
46
27 окт. Cavab 27 oktyabrda Ravi tərəfindən verilir . 2012-10-27 20:49 '12 at 20:49 PM 2012-10-27 20:49

Java-da ən çox səhv anlaşılır giriş modifikatoru protected . Biz bilirik ki, bu bir alt istərin hansı bir şəkildə göründüyü bir istisna ilə bir default modifier kimi görünür. Amma necə? Ümid edirəm ki, bir qarışıqlığı təmizləyəcəyəm:

  • Təxminən 2 sinif var; FatherSon , hər paketində:

     package fatherpackage; public class Father { } ------------------------------------------- package sonpackage; public class Son extends Father { } 
  • Father qorunan foo() üsulunu əlavə edin.

     package fatherpackage; public class Father { protected void foo(){} } 
  • foo() metodu dörd kontekstdə çağırılır:

    • foo() müəyyən olduğu eyni paketdə olan bir sinifdə ( fatherpackage ):

       package fatherpackage; public class SomeClass { public void someMethod(Father f, Son s) { f.foo(); s.foo(); } } 
    • this və ya super vasitəsilə mövcud nümunədə bir alt sinif daxilində:

       package sonpackage; public class Son extends Father { public void sonMethod() { this.foo(); super.foo(); } } 
    • Növü eyni sinifdə olan bir linkdə:

       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(); } } 
    • Bir növbəsində, növü olan ana sinifdir və foo() müəyyən olduğu paketin içərisindədir ( fatherpackage ) [Bu kontekstə daxil edilə bilər. 1]:

       package fatherpackage; public class Son extends Father { public void sonMethod(Father f) { f.foo(); } } 
  • Aşağıdakı hallar etibarsızdır.

    • Bağlantının növü olan ana sinifdir və foo() ( fatherpackage ) müəyyən olduğu paket xaricindədir:

       package sonpackage; public class Son extends Father { public void sonMethod(Father f) { f.foo(); // compilation error } } 
    • Subclass paketində alt sinif (subclass, valideynlərdən qorunan üzvləri devralır və onları alt siniflərə bağlamır):

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

Şəxsi

  • Metodlar, dəyişənlər və qurucular

Bəyan edilən metodlar, dəyişənlər və konstruktorlar yalnız elan edilən sinifdə mövcud ola bilərlər.

  • Sinif və interfeys

Mövcud xüsusi modifikator ən məhdudlaşdıran giriş səviyyəsidir. Sinif və interfeys xüsusi ola bilməz.

Qeyd

Sinifdə ictimai alıcı metodları varsa, fərdi olaraq elan edilmiş dəyişənlər sinfi xaricində istifadə edilə bilər. Üstünlükdə qorunan elan edilmiş dəyişənlər, metodlar və konstruktorlar yalnız başqa bir paketin alt siniflərinə və ya qorunan üzvlərin bir sinif paketi içində hər hansı bir sinifdə əldə edilə bilər. <h / ">

Qorunan

  • Sinif və interfeys

Təhlükəsiz giriş modifikatoru sinif və interfeyslərə tətbiq oluna bilməz.

Metodlar, sahələr qorunan elan edilə bilər, ancaq interfeysdə üsullar və sahələr qorunan elan edilə bilməz.

Qeyd

Qorunan giriş subclass, qeyri-əlaqəli sinifin istifadə etməyə imkan verməyən bir köməkçi metoddan və ya dəyişəndən istifadə etməyə imkan verir.

<h / ">

İctimai

İctimaiyyətə açıqlanan bir sinif, metod, konstruktor, interfeys və sair hər hansı digər sinifdən istifadə edilə bilər.

Buna görə açıq bir sinifdə açıqlanan sahələr, üsullar, bloklar Java Universitetinə aid olan hər hansı bir sinifdən əldə edilə bilər.

  • Müxtəlif paketlər

Lakin, açıq sinifə girişməyə çalışdığımız fərqli bir paket olduğunda, ictimai sinif hələ də idxal edilməlidir.

Sinif mirasından ötəri bütün ictimai üsullar və sinif dəyişənləri alt siniflər tərəfindən miras alınır.

<h / ">

Default - Heç bir söz:

Standart giriş modifikatoru bir sinif, sahə, metod və s. Üçün giriş modifikatorunu açıq şəkildə elan etməməyimiz deməkdir.

  • Eyni paketlər içərisində

Erişiş kontrolü dəyişdiricisiz elan edilmiş dəyişən və ya üsul eyni paketin hər hansı digər sinfində mövcuddur. İnterfeys içərisindəki sahələr dolayısı ilə ictimai statik yekun hesab olunur və interfeysdəki üsullar default olaraq açıqdır.

Qeyd

Statik sahələri köçürə bilmərik. Əgər onu ləğv etməyə çalışarsanız, səhv göstərilməyəcək, lakin bizdən başqa işləmir.

Suallara cavablar

Referanslar linkləri

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

27
22 янв. Cavab Nambi Jan 22 tərəfindən verilir 2014-01-22 16:08 '14 at 16:08 2014-01-22 16:08

Şəxsi : yalnız sinifə giriş məhduddur

Standart (dəyişən yoxdur) : sinif və paketə məhdud giriş

Qorunan : sinifə, paketə və alt siniflərə (həm daxili, həm də xaricə)

İctimai : sinif, paket (bütün) və alt siniflərə giriş ... Qısası, hər yerdə.

17
18 июня '14 в 10:13 2014-06-18 10:13 Cavab 18 sentyabr '14 'də saat 10: 13-da veriləcək

Fərqi artıq qeyd olunan əlaqələrdə tapıla bilər, amma istifadə edilən adətən "Ən az məlumatın prinsipi" nin azaldılır. Yalnız lazım olan minimum görünürlüğüne icazə verin.

15
18 окт. Joe Phillips 18 oktyabr cevap verdi. 2008-10-18 23:00 '08 23:00 2008-10-18 23:00 'da

Access modifikatorları bir neçə səviyyədə çıxış məhdudlaşdırmaq üçün nəzərdə tutulmuşdur.

Nəşr :. Это в основном так же просто, как вы можете получить доступ из любого класса, будь то в одном пакете или нет.

Чтобы получить доступ, если вы находитесь в одном пакете, вы можете получить доступ напрямую, но если вы находитесь в другом пакете, вы можете создать объект класса.

По умолчанию: Он доступен в одном пакете из любого класса пакета.

Для доступа вы можете создать объект класса. Но вы не можете получить доступ к этой переменной за пределами пакета.

Защищено: вы можете получить доступ к переменным в том же пакете, а также подклассе в любом другом пакете. поэтому в основном это default + Inherited .

Для доступа к защищенному полю, определенному в базовом классе, вы можете создать объект дочернего класса.

Частный: он может иметь доступ в том же классе.

В нестатических методах вы можете получить доступ напрямую из-за ссылки this (также в конструкторах), но для доступа к статическим методам вам необходимо создать объект класса.

13
ответ дан Prashant 17 дек. '14 в 9:29 2014-12-17 09:29

Модификаторы доступа в Java.

Модификаторы доступа Java используются для обеспечения контроля доступа на Java.

1. По умолчанию:

Доступно только для классов только в одном пакете.

Məsələn,

 // 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 } } 

Этот доступ более ограничен, чем общедоступный и защищенный, но менее ограниченный, чем частный.

2. Общественные

Доступ к ним возможен из любого места. (Глобальный доступ)

Məsələn,

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

Вывод: Привет

3. Частный

Доступно только внутри одного класса.

Если вы попытаетесь получить доступ к закрытым членам одного класса в другом, это приведет к ошибке компиляции. Məsələn,

 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. Защищенный

Доступно только для классов в одном пакете и подклассах

Məsələn,

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

Вывод: Привет

2019

ответ дан Virtual 07 авг. '16 в 17:16 2016-08-07 17:16
  • общедоступный - доступен из любого места приложения.

  • default - доступен из пакета.

  • защищенный - доступен из пакета и подклассов в другом пакете. və həmçinin

  • закрытый - доступен только из его класса.

11
ответ дан Shailendra Singh 29 авг. '15 в 10:15 2015-08-29 10:15

Видимый для пакета. По умолчанию. Модификаторы не нужны.

Только для класса ( частный ).

Видно миру ( общедоступный ).

Видимый для пакета и всех подклассов ( protected ).

Переменные и методы могут быть объявлены без каких-либо модификаторов, которые вызываются. Примеры по умолчанию:

 String name = "john"; public int age(){ return age; } 

Частный приватный модификатор доступа:

Методы, переменные и конструкторы, объявленные как private, могут быть доступны только в объявленном классе. Модификатор частного доступа является самым ограничивающим уровнем доступа. Класс и интерфейсы не могут быть частными.

Переменные, объявленные как private, могут быть доступны вне класса, если в классе присутствуют общедоступные методы getter.

Использование частного модификатора является основным способом, которым объект инкапсулирует себя и скрывает данные из внешнего мира.

Nümunələr:

 Public class Details{ private String name; public void setName(String n){ this.name = n; } public String getName(){ return this.name; } } 

Модификатор общедоступного доступа - общедоступный:

Доступ к классу, методу, конструктору, интерфейсу и т.д. может быть доступен из любого другого класса. Поэтому поля, методы, блоки, объявленные внутри открытого класса, могут быть доступны из любого класса, принадлежащего юниверсу Java.

Однако, если открытый класс, к которому мы пытаемся получить доступ, находится в другом пакете, тогда публичный класс по-прежнему необходимо импортировать.

Из-за наследования классов все общедоступные методы и переменные класса наследуются подклассами.

Məsələn:

 public void cal(){ } 

Защищенный модификатор доступа - защищен:

Переменные, методы и конструкторы, которые объявлены защищенными в суперклассе, могут быть доступны только подклассам другого пакета или любому классу в пакете класса защищенных членов.

Модификатор защищенного доступа не может применяться к классу и интерфейсам. Методы, поля могут быть объявлены защищенными, однако методы и поля в интерфейсе не могут быть объявлены защищенными.

Защищенный доступ дает подклассу возможность использовать вспомогательный метод или переменную, не позволяя не связанным с ним классу пытаться использовать его.

 class Van{ protected boolean speed(){ } } class Car{ boolean speed(){ } } 
11
ответ дан amila isura 26 мая '15 в 17:54 2015-05-26 17:54

Я просто хочу обратиться к деталям, которые чрезвычайно часто ошибаются, в том числе большинством @ на этой странице. "Доступ по умолчанию" (если нет модификатора доступа) не всегда совпадает с пакетом-частным . Это зависит от того, что это такое.

  • Типы нечленов (то есть классы, перечисления, интерфейсы и типы аннотаций, не объявленные внутри другого типа) по умолчанию являются закрытыми по пакетам. ( JLS §6.6.1 )

  • Члены класса и конструкторы по умолчанию закрыты по пакетам. ( JLS §6.6.1 )

  • Конструкторы Enum по умолчанию закрыты по умолчанию . (В самом деле, enum contructors должны быть частными, и это ошибка, чтобы попытаться сделать их публичными или защищенными). Константы Enum являются общедоступными и не допускают спецификатор доступа. Другие члены перечисления по умолчанию закрыты по пакетам. ( JLS §8.9 )

  • Все члены интерфейсов и типы аннотаций общедоступны по умолчанию . (Действительно, члены интерфейсов и типы аннотаций должны быть общедоступными, и это ошибка, чтобы попытаться сделать их частными или защищенными.) ( JLS §9.3 - 9.5 )

10
ответ дан Boann 21 окт. '15 в 15:07 2015-10-21 15:07

Эта страница хорошо описывает защищенный и модифицированный по умолчанию модификатор доступа

.... Protected: Защищенный модификатор доступа немного сложнее, и вы можете сказать, что это надмножество модификатора доступа по умолчанию. Защищенные члены такие же, как и члены по умолчанию, в отношении доступа в одном пакете. Разница в том, что защищенные члены также доступны для подклассов класса, в котором объявлен член, который находится вне пакета, в котором присутствует родительский класс.

Но эти защищенные члены "доступны вне пакета только через наследование". yəni, вы можете получить доступ к защищенному элементу класса в своем подклассе, присутствующем в каком-либо другом пакете, как если бы этот член присутствовал в самом подклассе. Но этот защищенный член не будет доступен в подклассе вне пакета, используя ссылку на родительские классы. ...

9
ответ дан dameng 15 марта '12 в 14:53 2012-03-15 14:53

Ответ Дэвида дает смысл каждого модификатора доступа. Что касается того, когда использовать каждый, я предлагаю публиковать все классы и методы каждого класса, предназначенные для внешнего использования (его API), и все остальное частное.

С течением времени у вас возникнет смысл, когда нужно сделать некоторые классы private-private и когда объявлять определенные методы, защищенные для использования в подклассах.

8
ответ дан Dov Wasserman 19 окт. '08 в 6:18 2008-10-19 06:18

Qeyd Это только дополнение для принятого ответа.

Это связано с Java модификаторами доступа .

Из Модификаторы Java-доступа :

Модификатор доступа Java указывает, какие классы могут получить доступ к данному класс и его поля, конструкторы и методы. Модификаторы доступа могут отдельно указывается для класса, его конструкторов, полей и методы. Модификаторы доступа Java также иногда упоминаются в ежедневных речь как спецификаторы доступа Java, но правильное имя - это доступ к Java модификаторы. Классы, поля, конструкторы и методы могут иметь один из четыре разных модификатора доступа Java:

  • Siyahı maddələri
  • частным
  • default (пакет)
  • защищенный
  • общественности

От Управление доступом к членам класса :

Модификаторы уровня доступа определяют, могут ли другие классы использовать или указать конкретный метод. Существует два уровня контроля доступа:

  • На верхнем уровне - public или package-private (без явного модификатора).
  • На уровне участника - общедоступный, закрытый, защищенный или пакетно-закрытый (без явного модификатора).

Класс может быть объявлен публичным модификатором, и в этом случае класс виден всем классам. Если класс не имеет модификатора (по умолчанию, также известный как package-private), он виден только в рамках собственного пакета

В следующей таблице показан доступ к членам, разрешенным каждым Модификатор.

 ╔═════════════╦═══════╦═════════╦══════════╦═══════╗ ║ 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 ║ ╚═════════════╩═══════╩═════════╩══════════╩═══════╝ 

В первом столбце данных указывается, имеет ли сам класс доступ к член, определенный уровнем доступа. Как вы можете видеть, класс всегда имеет доступ к своим собственным членам. Во втором столбце указано, классы в том же пакете, что и класс (независимо от их родство) имеют доступ к члену. В третьей колонке указывается являются ли подклассы класса, объявленного вне этого пакета, доступ к члену. В четвертом столбце указано, все ли классы имеют доступ к члену.

Уровни доступа влияют на вас двумя способами. Во-первых, когда вы используете классы, которые происходят из другого источника, такого как классы на платформе Java, уровни доступа определяют, какие члены этих классов классы могут использовать. Во-вторых, когда вы пишете класс, вам нужно решить какой уровень доступа каждый член переменной и каждый метод в вашем классе должен иметь.

6
ответ дан ישו אוהב אותך 17 нояб. '16 в 8:05 2016-11-17 08:05
  • Видимый для пакета. по умолчанию . Модификаторы не нужны.
  • Только для класса private .
  • Видно миру; общедоступный .
  • Видимый для пакета и всех подклассов защищенный .

Итак, поговорим о контроле доступа и наследовании Следующие правила для унаследованных методов:

  • Объявленные методы public в суперклассе также должны быть общедоступными во всех подклассы.
  • Объявленные методы protected в суперклассе должны быть protected или public в подклассах; они не могут быть частными.
  • Способы, объявленные без контроля доступа (без использования модификатора), могут быть объявлено более приватным в подклассах.
  • Объявленные методы private не наследуются вообще, поэтому нет правило для них.
6
ответ дан AVI 20 дек. '15 в 5:58 2015-12-20 05:58

Public Protected Default и private - модификаторы доступа.

Они предназначены для инкапсуляции или скрытия и отображения содержимого класса.

  • Класс может быть общедоступным или по умолчанию
  • Члены класса могут быть общедоступными, защищенными, стандартными или частными.

Частный недоступен вне класса Значение по умолчанию доступно только в пакете. Защищен в пакете, а также в любом классе, который его расширяет. Публикация открыта для всех.

Обычно переменные-члены определяются частными, но методы-члены являются общедоступными.

5
ответ дан richa_v 30 июля '14 в 6:51 2014-07-30 06:51

Часто я осознавал, что запоминание основных понятий любого языка может быть сделано путем создания реальных аналогов. Вот моя аналогия для понимания модификаторов доступа в Java:

Предположим, что вы студент в университете, и у вас есть друг, который приезжает к вам в выходные. Предположим, существует большая статуя основателя университета в центре кампуса.

  • Когда вы приведете его в университетский городок, первое, что вы и ваш друг видите, это эта статуя. Это означает, что любой, кто ходит в кампусе, может смотреть на статую без разрешения университета. Это делает статую PUBLIC .

  • Затем вы хотите забрать своего друга в общежитие, но для этого вам необходимо зарегистрировать его в качестве посетителя. Это означает, что он получает пропуск доступа (который такой же, как ваш), чтобы попасть в различные здания на территории кампуса. Это сделало бы его карточку доступа ЗАЩИЩЕНА .

  • Ваш друг хочет войти в университетский городок WiFi, но у него нет никаких учетных данных. Единственный способ, по которому он может выйти в интернет, - это поделиться своим логином с ним. (Помните, что каждый студент, который идет в университет, также обладает этими учетными данными). Это сделало бы ваши учетные данные как НЕТ МОДИФИКАЦИЯ .

  • Наконец, ваш друг хочет прочитать ваш отчет о проделанной работе за семестр, который размещен на веб-сайте. Однако каждый студент имеет свой личный логин для доступа к этому разделу веб-сайта кампуса. Это сделало бы эти учетные данные как ЧАСТНЫМ .

Надеюсь, это поможет!

5
ответ дан Greedy Coder 06 апр. '17 в 7:09 2017-04-06 07:09

Когда вы думаете о модификаторах доступа, просто подумайте об этом таким образом (применительно к переменным и методам ):

public → доступно из любого места private → доступен только в том же классе, где он объявлен

Теперь возникает путаница, когда дело доходит до default и protected

default → Нет ключевого слова модификатора доступа. Это означает, что он доступен строго в пакете класса. Нигде за пределами этого пакета он может быть доступен.

protected → Чуть менее строгий, чем default , и помимо тех же классов пакетов он может быть доступен подклассам вне объявленного пакета.

4
ответ дан Pritam Banerjee 27 июня '17 в 5:33 2017-06-27 05:33
  Default: When no access modifier is specified for a class , method or data member – It is said to be having the default access modifier by default. The data members, class or methods which are not declared using any access modifiers ie having default access modifier are accessible only within the same package. Private: The private access modifier is specified using the keyword private. The methods or data members declared as private are accessible only within the class in which they are declared. Any other class of same package will not be able to access these members. Classes or interface can not be declared as private. protected: The protected access modifier is specified using the keyword protected. The methods or data members declared as protected are accessible within same package or sub classes in different package. public: The public access modifier is specified using the keyword public. The public access modifier has the widest scope among all other access modifiers. Classes, methods or data members which are declared as public are accessible from every where in the program. There is no restriction on the scope of a public data members. 
3
ответ дан chamina 26 мая '17 в 8:58 2017-05-26 08:58

Все дело в инкапсуляции (или, как сказал Джо Филлипс, наименьшее знание).

Начните с самого ограничительного (частного) и посмотрите, не понадобится ли вам менее ограничивающие модификаторы.

Мы все используем модификаторы метода и члена, такие как private, public,... но одна вещь, которую слишком мало разработчиков делают, это использовать пакеты для логического упорядочения кода.

Например: вы можете ввести чувствительные методы защиты в пакет безопасности. Затем поместите открытый класс, который обращается к некоторому коду безопасности, содержащемуся в этом пакете, но сохраняет другие классы классов безопасности частными . Таким образом, другие разработчики смогут использовать общедоступный класс вне этого пакета (если только они не изменят модификатор). Это не функция безопасности, но будет определять использование.

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

Другое дело, что классы, которые сильно зависят друг от друга, могут оказаться в одном пакете и в конечном итоге могут быть реорганизованы или объединены, если зависимость слишком сильная.

Если, наоборот, вы устанавливаете все как общедоступные , неясно, к чему следует или не следует обращаться, что может привести к написанию большого количества javadoc (что ничего не может сделать с помощью компилятора...).

2
ответ дан Christophe Roussy 14 февр. '18 в 12:55 2018-02-14 12:55

public → можно получить доступ везде

private → может быть доступ только к одному классу

protected → может иметь доступ к тому же классу, тому же подклассу пакета, другому подклассу пакета и тому же пакету другого класса

по умолчанию → может быть доступ к тому же классу, тому же подклассу пакета и тому же пакету другого класса

-1
ответ дан Ishan Lakshitha 26 дек. '18 в 8:11 2018-12-26 08:11

Другие вопросы по меткам или Задайте вопрос