Выкарыстанне мадыфікатараў бачнасці ў Java

class Orange{

    Orange(){
    }

}

У чым розніца паміж выкарыстаннем мадыфікатара - у гэтым выпадку, пакет-прыватнае - перад класам і перад канструктарам? Я думаю, што мадыфікатар перад канструктарам азначае, што ён мае права ствараецца асобнік класа Orange . Але як наконт мадыфікатара перад класам?

4
Вы маеце на ўвазе мадыфікатары доступу? дзяржаўныя, прыватныя і абароненыя.]
дададзена аўтар Michael Ardan, крыніца
з'яўляецца тое, што дзейнічае Java?, вы можаце прачытаць артыкул аб мадыфікатараў ў любой добрай кнізе
дададзена аўтар Abubakkar, крыніца
-1 за пытанне недапушчальнага сінтаксісу ... Тым не менш, я ўпэўнены, што ён азначае, што бачнасць па змаўчанні для гэтага.
дададзена аўтар Adrian Shum, крыніца
Так. я магу зразумець, сярэдняе значэнне мадыфікатара доступу для метаду або поля. Але што, калі ён знаходзіцца ў пярэдняй частцы класа?
дададзена аўтар joy, крыніца
Добра. Хто хлусіў ўсім вам і сказаў, што гэта недапушчальны сінтаксіс?
дададзена аўтар Makoto, крыніца
@Abu гэта не так.
дададзена аўтар Luiggi Mendoza, крыніца
Гэта сапраўды сінтаксіс, і я лічу, што гэта лепшая практыка, як павінна быць вызначана бачнасць, см мае развагі ніжэй.
дададзена аўтар PHZ.fi-Pharazon, крыніца
Вы не можаце мець пакет у якасці мадыфікатара класа/метаду.
дададзена аўтар Aaron, крыніца

8 адказы

Для пачатку ёсць 4 ўзроўню доступу, створаныя 3 мадыфікатараў доступу.

  1. грамадскасці - даступныя ўсюды
  2. абаронены навакольлі - Працуе ў адным пакеце і ў дзецях
  3. Па змаўчанні - даступныя толькі ў тым жа пакеце
  4. прыватная. - даступны толькі ў адным класе

Вы правільна о - Мадыфікатары на ўзроўні канструктараў непасрэдна звязаныя з канкрэтызацыяй класа.

<�Моцны> Мадыфікатары на ўзроўні класа вырашаюць даступнасць класа.

10
дададзена
Мадыфікатары на ўзроўні класа вырашаюць даступнасць класа. Што гэта значыць? Клас доступ хоць імпарт ключавых слоў?
дададзена аўтар joy, крыніца
добра тут справа. Клас можа быць толькі адкрытым або па змаўчанні гэта значыць вы можаце выкарыстоўваць толькі адзін мадыфікатар, які з'яўляецца грамадскім на ўзроўні класа. Выкажам здагадку, што вы не пазначылі і мадыфікатар доступу пры запісе класа (узровень доступу па змаўчанні) і паспрабаваць атрымаць доступ да яго ў іншы пакет, яно не будзе даступна. <�Б> Імпарт не будзе дазволена
дададзена аўтар RishikeshDhokare, крыніца
OP кажа аб мадыфікатараў на самай класе, а не метады.
дададзена аўтар Aaron, крыніца

Вы можаце толькі аб'явіць адкрыты або стандартны клас (у выпадку толькі вышэйшых класаў ўзроўню) у Java, і гэтыя мадыфікатары вырашыць пад'язныя шляхі класа.

Я таксама прапаную вам убачыць « ледзь не Java канструктары грамадскасці па змаўчанні? »

Калі канструктар зрабіў прыватным, то толькі код ўнутры гэтага класа можа атрымаць доступ да гэтага. Для лепшага разумення мадыфікатараў, вы павінны ўбачыць « доступ мадыфікатары Java »

3
дададзена
@freak Вядома ж.
дададзена аўтар Sotirios Delimanolis, крыніца
<�Я> прыватным , такім чынам, не мае ніякага значэння, калі ўжываецца да класа верхняга ўзроўню . Дарэчы, вы можаце ўжыць гэта да <�б> клас не верхняга ўзроўню, напрыклад, статычныя ўнутраныя класы.
дададзена аўтар Luiggi Mendoza, крыніца
Гэта не азначае, што вы павінны даць няпоўную інфармацыю.
дададзена аўтар Luiggi Mendoza, крыніца
Паважаная У прыкладзе OP, ён не паказаў ніякай унутранай class.So я проста адказаць на яго prospective.Anyway Я адрэдагаваў мой пытанне
дададзена аўтар Freak, крыніца

Па-першае, каб супакоіць любыя страхі, код вы падалі <�моцны> з'яўляецца выдатна дзейнічае сінтаксіс Java.

Па сутнасці, вы стварылі клас, які можа быць инстанцированный толькі б/у іншых класаў у пакеце па змаўчанні. Ён таксама будзе працаваць, калі вы вызначылі яго ў пакеце (напрыклад пакет Foo ), так як толькі класы ў пакеце Foo мог бачыць гэты клас).

Зараз да сутнасці пытання.

There are different ways to control access to fields and members. and they each do different things.

  • прыватны бачнасць менш прыкметная. Толькі вызначальны клас можа атрымаць доступ поля. </Р>

  • Няма Мадыфікатар або прыватны пакета не з'яўляецца другім не менш прыкметнымі. Вызначальны клас <�ет> і усе класы ў рамках пакета можа атрымаць доступ да гэтай вобласці, але падкласы і астатняй свет не можа.

  • абаронены з'яўляецца другім найбольш прыкметным. Толькі іншыя класы забаронены доступ на полі.

  • публічны з'яўляецца найбольш прыкметным. Усе можа атрымаць доступ поле.

Мадыфікатары на ўзроўні класа становяцца цікавымі. Гэта адбываецца ад спецыфікацыі мовы Java , 8.1.1 :

<�Р> Мадыфікатар доступу публічны (§6.6) адносіцца толькі да класаў верхняга ўзроўню   (§7.6) і класы членаў (§8.5), ня лакальныя класы (§14.3) або   ананімныя класы (§15.9.5).      <�Р> Мадыфікатары доступу абаронены і прыватным (§6.6) адносяцца толькі да   класы членаў у межах непасрэдна які змяшчае клас або пералiчэнне дэкларацыі   (§8.5). </Р>      <�Р> мадыфікатар статычныя адносіцца толькі да класаў членаў (§8.5.1), а не   верхні ўзровень або лакальныя або ананімныя класы.      

<�моцны> Гэта памылка часу кампіляцыі, калі той жа мадыфікатар з'яўляецца больш чым адзін раз   ў аб'яве класа.

     <�Р> Калі два ці больш (розныя) мадыфікатары класа з'яўляюцца ў класе   дэкларацыя, то гэта звычайна, хоць і не абавязкова, што яны   у тым парадку, які адпавядае з прыведзеных вышэй у вытворчасці   для ClassModifier .

Увогуле, аб'ява класа з'яўляецца нешта накшталт гэтага:

ClassDeclaration:
    NormalClassDeclaration
    EnumDeclaration

NormalClassDeclaration:
    ClassModifiers(opt) class Identifier TypeParameters(opt)
                        Super(opt) Interfaces(opt) ClassBody

Усё, што з (OPT) лічыцца неабавязковым.

Такім чынам, што ж гэта стрыгчы ўніз?

  • The JLS mandates that a class does not need a [class] modifier.
  • The JLS mandates that, if a [class] modifier is present, then it follows one of these rules:
    • If the modifier is public, then it is only applicable to top level classes and member classes.
    • If the modifier is protected or private, then it is only applicable to member classes within a directly enclosing class or enumeration.
    • The static modifier may appear, but is only applicable to member classes.

Constructors have a similar rule set.

ConstructorDeclaration:
    ConstructorModifiers(opt) ConstructorDeclarator
                                Throws(opt) ConstructorBody

ConstructorDeclarator:
    TypeParameters(opt) SimpleTypeName ( FormalParameterList(opt) )

Зноў жа, гэта ламае ўніз:

    <�Літый> У JLS загадвае, што канструктар не патрэбны [канструктар] мадыфікатар. <�Літый> Мандаты JLS, што мадыфікатар Канструктар не можа ўтрымліваць абстрактныя , статычная , канчатковая , родным , strictfp , або сінхранізуюцца .
  • Мандаты JLS, калі не мадыфікатар доступу не пазначаны для канструктара нармальнага класа, канструктар мае <�моцны> па змаўчанні доступу (§8.8.3, курсіў мой).
2
дададзена

Мадыфікатар класа вызначае, хто можа атрымаць доступ да класа. Напрыклад, публічны клас можна атрымаць па класах ад любога пакета, калі ключ ня запісваецца клас можна атрымаць па класах ад той жа пакет толькі.

Мадыфікатар з канструктара, метады і палі мае той жа сэнс. Аднак прыватным і абаронены мець больш сэнсу. Прыватны могуць быць даступныя толькі з бягучага класа. Абаронены ад яго падкласаў як мага далей ад усяго класаў з таго ж пакета.

Што тычыцца Вашага пытання аб канструктару. Клас можа мець некалькі канструктараў. Некаторыя з іх могуць быць прыватнымі, некаторыя іншыя грамадскасці. Вы маеце рацыю, што няма сэнсу рабіць канструктар грамадскасць, калі клас пакет абаронены: не-адзін вонкавага пакета не можа назваць гэты клас у любым выпадку.

Гэта так жа, як пісаць публічныя канструктар для абстрактных класаў. Паколькі абстрактны клас не можа быць створаны сам яго канструктары павінны быць абаронены або прыватным хоць кампілятар не клапоціцца пра гэта.

ДАРЭЧЫ з выкарыстаннем пакета па змаўчанні звычайна не выкарыстоўваецца і не рэкамендуецца метад.

1
дададзена
У залежнасці ад сцэнара. Калі ў вас ёсць метад, які вы хочаце выставіць для модульнага тэставання, але не што-небудзь яшчэ, то вы маглі б аб'явіць яго як пакет прыватнага, і пераканайцеся, што тэст выкарыстоўвае той жа пакет.
дададзена аўтар Makoto, крыніца

<�Моцны> выкарыстоўваць і тыпы з класа мадыфікатары ўзроўню:

http://javapapers.com/core-java/access-modifiers- в-Явы растлумач/

<�Моцны> выкарыстоўваць і тыпы з канструктар мадыфікатары ўзроўню:

http://www.careercup.com/question?id=296844#commentThread302715

1
дададзена

Я лічу, лепшы ўзровень бачнасці ў Java, каб быць па змаўчанні бачнасць г.зн. пакет бачнасць, таму што гэта дазваляе класах модульнага тэставання, каб атрымаць доступ да ўсіх метадам, калі тэст змяшчаецца ў такі ж пакет у якасці асноўнага класа.

Таксама пакет бачнасць карацей пісаць, так як вы можаце апусціць дэкларацыю бачнасці, таму менш пліты катла.

Другі лепшы ўзровень бачнасці абароненага , так як у некаторых выпадках вы можаце ствараць тэставыя класы ў якасці падкласаў вашага асноўнага класа. Аднак, як было сказана вышэй, пакет обзорность лепш працуе ў большасці выпадкаў, калі вы карыстаецеся пакеты правільна.

Па-трэцяе, як правіла, калі вы запусціце сонар і зрабіць агляд кода і статычны аналіз буйных праектаў, я выявіў, што, як правіла, 80% з метадаў грамадскасці , а 20% з'яўляюцца прыватным </код >/ абаронены . Такім чынам, асноўная ідэя выкарыстання прыватных ці абароненых метадаў з'яўляецца абарона даных/уласцівасцяў ад доступу ў абыход аксессоров. Большасць метадаў будзе звычайна грамадскасці ў любым выпадку.

Самы бескарысны ўзровень бачнасці (але, на жаль, часта выкарыстоўваецца) прыватнага , паколькі гэта немагчыма праверыць (без выкарыстання адлюстравання і змяненняў бачнасці на нешта яшчэ). Акрамя таго, прыватны забараняе код паўторнага выкарыстання ў падклас, якая з'яўляецца асноўнай ідэяй з выкарыстаннем аб'ектна арыентаванай парадыгмы ў першую чаргу, і, такім чынам, варта пазбягаць. Па тых жа прычынах ключавое слова Канчатковы варта пазбягаць ў большасці выпадкаў.

Такім чынам, я лічу, што ваш прыклад, каб быць лепшай практыкай, як вызначыць узровень бачнасці, за выключэннем таго, што ваш канструктар не з'яўляецца публічнай :). Тым не менш, вы прапускаеце пакет дэкларацыю і юніт-тэсты.

0
дададзена

<�Моцны> Мадыфікатары доступу:

  • Public - {Можна атрымаць доступ у любым месцы праекта}
  • Прыватныя асобы - {Можна атрымаць доступ толькі ўнутры класа}
  • Protected - {Можна атрымаць доступ у межах пакета і субтрапічных класаў}
  • Па змаўчанні - {можа атрымаць доступ у межах пакета}

Мадыфікатары <�моцны> Non-Access:

    <�Літый> Статычны - {для стварэння пераменнага класа і метаду} <�Літый> Заключны - {для стварэння дапрацаваных пераменнага і спосабу} <�Літый> Абстрактныя - {для стварэння абстрактнага метаду і класа} <�Літый> Сінхроннае - {для патокаў}

Некаторы кароткае абмеркаванне вышэйзгаданых мадыфікатараў у гэтым спасылцы . Глядзіце яго для лепшага разумення.

0
дададзена

мадыфікатары класа працуюць аналагічна метадзе мадыфікатараў. Дзяржаўная, прыватная, канчатковая, анатацыя і да т.п. праца.

Грамадскі дазваляе клас і яго метады, якія будуць даступныя па класах ад любога пакета.

Няма Мадыфікатар толькі не дазваляе класах быць доступ з ён вызначаны пакет.

Прыватны б прадухіліць усе доступ (не паказваюць на гэта пры выкарыстанні з класам верхняга ўзроўня).

Абстрактныя класы дазваляюць ствараць класаў, вытворныя ад бацькоўскага (рэферат) класа. Напрыклад, вы можаце зрабіць абстрактны клас Shape і маюць клас Rectangle пашырыць форму, успадкоўваючы ўсе яго метады, зменныя, і прымусіць яго вызначыць любыя абстрактныя метады.

0
дададзена