Marekebisho ya Java. Virekebishaji katika Java: tuli, mwisho, dhahania, iliyosawazishwa, ya muda mfupi, tete. Virekebishaji tuli, dhahania na vya mwisho

Sasisho la mwisho: 10/03/2019

Washiriki wote wa darasa - uwanja, njia, mali - wote wanayo virekebishaji vya ufikiaji. Virekebishaji vya ufikiaji hukuruhusu kubainisha upeo unaoruhusiwa kwa washiriki wa darasa. Hiyo ni, virekebishaji vya ufikiaji huamua muktadha ambao kigezo fulani au njia inaweza kutumika. Katika mada zilizopita, tayari tumekutana nayo tulipotangaza nyanja za darasa kwa umma (yaani, na kirekebishaji cha umma).

Marekebisho yafuatayo ya ufikiaji hutumiwa katika C #:

    umma : Umma, tabaka la umma au mshiriki wa darasa. Mwanachama kama huyo wa darasa anapatikana kutoka mahali popote kwenye msimbo, na pia kutoka kwa programu na makusanyiko mengine.

    faragha : darasa la kibinafsi au mshiriki wa darasa. Inawakilisha kinyume kabisa cha kirekebishaji cha umma. Darasa kama hilo la kibinafsi au mshiriki wa darasa anapatikana tu kutoka kwa msimbo katika darasa moja au muktadha.

    iliyolindwa : Mwanadarasa huyu anaweza kufikiwa kutoka popote katika darasa la sasa au katika darasa zinazotolewa. Katika kesi hii, madarasa yanayotokana yanaweza kupatikana katika makusanyiko mengine.

    ndani: Darasa na washiriki wa darasa walio na kirekebishaji sawa wanapatikana kutoka mahali popote kwenye msimbo katika mkusanyiko mmoja, lakini haipatikani kwa programu au makusanyiko mengine (kama ilivyo kwa kirekebishaji cha umma).

    iliyolindwa ya ndani: inachanganya utendakazi wa virekebishaji viwili. Madarasa na washiriki wa darasa walio na kirekebishaji hiki wanapatikana kutoka kwa mkusanyiko wa sasa na kutoka kwa madarasa yaliyotolewa.

    faragha iliyolindwa: Mwanadarasa huyu anapatikana kutoka mahali popote katika darasa la sasa au katika madarasa yaliyotolewa ambayo yamefafanuliwa katika mkusanyiko sawa.

Tunaweza kuweka kirekebishaji cha ufikiaji kwa uwazi, kwa mfano:

Jimbo la darasa la kibinafsi ( int a; utupu uliolindwa Print() ( Console.WriteLine($"a = (a)"); ) )

Au hatuwezi kuonyesha:

Hali ya Darasa ( int a; Chapisha batili() ( Console.WriteLine($"a = (a)"); ) )

Ikiwa sehemu na mbinu hazina kirekebishaji cha ufikiaji kilichofafanuliwa, kirekebishaji chaguomsingi ni cha faragha .

Madarasa na miundo iliyotangazwa bila kirekebishaji ina ufikiaji wa ndani kwa chaguomsingi.

Madarasa na miundo yote ambayo imefafanuliwa moja kwa moja katika nafasi za majina na ambayo haijawekwa ndani ya madarasa mengine inaweza kuwa na virekebishaji vya umma au vya ndani pekee.

Wacha tuangalie mfano na tuunde darasa lifuatalo la Jimbo:

Jimbo la tabaka la umma ( // sawa na int defaultVar ya kibinafsi; int defaultVar; // uwanja unapatikana tu kutoka kwa darasa la sasa la kibinafsi int privateVar; // kupatikana kutoka kwa darasa la sasa na madarasa yanayotokana ambayo yamefafanuliwa katika mradi huo huo unaolindwa kibinafsi. int protectedPrivateVar // kupatikana kutoka kwa darasa la sasa na madarasa yanayotokana na ulinzi wa int // inapatikana mahali popote katika mradi wa sasa wa ndani wa ndaniVar; ; mahali popote katika programu, na vile vile kwa programu na makusanyiko mengine ya umma int publicVar // kwa chaguo-msingi ina utupu wa faragha Method() => Console.WriteLine($"defaultVar = (defaultVar)"); inapatikana tu kutoka kwa darasa la sasa la utupu wa kibinafsi () => Console.WriteLine($"privateVar = (privateVar)"); ) => Console.WriteLine($ "protectedPrivateVar = (protectedPrivateVar)"); // inayoweza kufikiwa kutoka kwa darasa la sasa na madaraja yanayotokana yaliyolindwa batili protectedMethod()=> Console.WriteLine($"protectedVar = (protectedVar)"); // inapatikana popote katika mradi wa sasa internal void internalMethod() => Console.WriteLine($"internalVar = (internalVar)"); // kufikiwa popote katika mradi wa sasa na kutoka kwa madarasa ya vizazi katika miradi mingine iliyolindwa utupu wa ndani protectedInternalMethod() => Console.WriteLine($"protectedInternalVar = (protectedInternalVar)"); // inapatikana popote katika programu, na vile vile kwa programu na makusanyiko mengine public void publicMethod() => Console.WriteLine($"publicVar = (publicVar)"); )

Kwa kuwa darasa la Jimbo limetangazwa na kirekebishaji cha umma, litapatikana kutoka mahali popote kwenye programu, na pia kutoka kwa programu na makusanyiko mengine. Darasa la Jimbo lina sehemu tano kwa kila kiwango cha ufikiaji. Pamoja na kigezo kimoja bila kirekebishaji, ambacho ni cha faragha kwa chaguo-msingi.

Pia kuna njia sita ambazo zitaonyesha maadili ya uwanja wa darasa kwenye skrini. Tafadhali kumbuka kuwa kwa kuwa virekebishaji vyote vinaruhusu matumizi ya washiriki wa darasa ndani ya darasa fulani, vijiti vyote vya darasa, pamoja na vya kibinafsi, vinapatikana kwa njia zake zote, kwani zote ziko katika muktadha wa tabaka la Jimbo.

Sasa hebu tuone jinsi tunavyoweza kutumia vigeu vya darasa letu katika programu (yaani, katika Njia Kuu ya darasa la Programu) ikiwa madarasa ya Jimbo na Programu yamo katika mradi sawa:

Mpango wa Darasa ( static void Main(string args) ( State state1 = new State(); // hatutaweza kugawa thamani kwa utofauti wa defaultVar, // kwa kuwa ina kirekebishaji cha kibinafsi na darasa la Programu halioni. it // Na kamba hii haionekani kwa mazingira itaangazia kama hali isiyo sahihi1.defaultVar = 5, ufikiaji hauwezi kupatikana // hiyo hiyo inatumika kwa hali ya kibinafsi yaVar1.privateVar = 5; haiwezi kupatikana // kupeana thamani kwa kigezo kilicholindwa chaPrivateVar haitafanya kazi, // kwa kuwa darasa la Programu si kabila la hali ya darasa la Jimbo1.protectedPrivateVar =5 Hitilafu, ufikiaji hauwezi kupatikana // kugawa thamani kwa kutofautishaVar iliyolindwa pia haitafanya kazi, // kwa kuwa darasa la Programu sio darasa la kizazi cha hali ya darasa la Jimbo1.protectedVar = 5 Hitilafu, ufikiaji hauwezi kupatikana // kutofautiana kwa ndani na kirekebishaji cha ndani kinapatikana kutoka mahali popote katika mradi wa sasa // kwa hivyo uipe kwa utulivu thamani state1.internalVar = 5; // kigezo cha protectedInternalVar pia kinaweza kufikiwa kutoka popote katika hali ya sasa ya mradi1.protectedInternalVar = 5; // publicVar variable ni public state1.publicVar = 5; ))

Kwa hivyo, tuliweza tu kuweka vigezo internalVar, protectedInternalVar na publicVar, kwa kuwa virekebishaji vyake huruhusu matumizi katika muktadha huu.

Hali ni sawa na mbinu:

Mpango wa Darasa ( static void Main(string args) ( State state1 = new State(); state1.defaultMethod(); // Hitilafu, ufikiaji hauwezi kufikiwa state1.privateMethod(); // Hitilafu, ufikiaji hauwezi kufikiwa state1.protectedPrivateMethod () ;// Hitilafu, ufikiaji hauwezi kupatikana hali1.protectedMethod(// Hitilafu, ufikiaji hauwezi kupatikana hali1.Njia ya ndani();

Hapa, njia tatu pekee zilipatikana kwetu: Njia ya Ndani, Method iliyolindwa, Njia ya Umma, ambayo ina virekebishaji vya ndani, vilivyolindwa ndani, vya umma, mtawaliwa.

Shukrani kwa mfumo huu wa kurekebisha upatikanaji, inawezekana kuficha baadhi ya vipengele vya utekelezaji wa darasa kutoka kwa sehemu nyingine za programu.

Licha ya ukweli kwamba marekebisho ya umma na ya ndani yanafanana katika athari zao, wana tofauti kubwa. Madarasa na washiriki wa darasa walio na kirekebishaji cha umma pia watapatikana kwa programu zingine ikiwa darasa hili litawekwa kwenye dll inayobadilika ya maktaba na kisha kutumika katika programu hizi.

Lugha ya Java hutoa marekebisho mengi yaliyogawanywa katika vikundi vifuatavyo:

  • kirekebishaji cha ufikiaji
  • Kirekebishaji kisicho na ufikiaji

Kirekebishaji hutumiwa kufafanua darasa, mbinu, au kigeuzo, kwa kawaida huwa mstari wa mbele wa taarifa. Kupitia mfano ufuatao kwa kielelezo:

Darasa la ummaJina ( // ... ) boolean ya kibinafsi myFlag; wiki mbili za mwisho tuli = 9.5; iliyolindwa tuli ya mwisho int BOXWIDTH = 42; utupu tuli wa umma (hoja za kamba) ( // 方法体 )

Kirekebishaji cha udhibiti wa ufikiaji

Java, unaweza kutumia alama za udhibiti wa ufikiaji ili kulinda ufikiaji wa madarasa, vigeu, mbinu na waundaji. Java inasaidia ruhusa nne tofauti.

Chaguomsingi, pia inajulikana kama chaguo-msingi chaguo-msingi, inayoonekana kwenye kifurushi sawa, usitumie kirekebishaji chochote.

Binafsi kwa maalum Privat kirekebishaji kinachoonekana ndani ya darasa moja.

Ndio, kuashiria jumla kirekebishaji kinachoonekana kwa madarasa yote.

Imelindwa, ndani kulindwa Kirekebishaji kinabainisha kuwa madarasa yote na vijamii ndani ya kifurushi kimoja vinaonekana.

Kirekebishaji chaguo-msingi cha ufikiaji ni kutotumia manenomsingi yoyote

Tumia vibadala na mbinu zilizotangazwa katika kirekebishaji chaguo-msingi cha ufikiaji kwa darasa ndani ya kifurushi sawa kinachoonekana. Kiolesura ambapo viambajengo vinatangazwa kwa uwazi kama fainali tuli ya umma, na kiolesura ambapo kifikia chaguo-msingi ni cha umma.

Taarifa katika mfano ufuatao, vigezo na mbinu haziwezi kutumia kirekebishaji chochote.

Toleo la kamba = "1.5.1"; boolean processOrder() ( rudi kweli; )

Kirekebishaji cha ufikiaji wa kibinafsi -binafsi

Kirekebishaji cha ufikiaji wa kibinafsi ndicho kiwango cha ufikiaji chenye vizuizi zaidi kinatangazwa kuwa mbinu za kibinafsi, vigeuzo, na ni vya darasa la wajenzi vinaweza tu kufikiwa, na madarasa na violesura haviwezi kutangazwa kuwa vya faragha.

Vigezo vilivyotangazwa kama aina ya ufikiaji wa kibinafsi vinaweza tu kufikiwa nje ya darasa kupitia mbinu ya darasa ya kupata umma.

Kirekebishaji cha Ufikiaji wa Faragha hutumiwa kimsingi kulinda maelezo na data ya utekelezaji wa darasa kwa darasa.

Madarasa yafuatayo yanatumia kirekebishaji cha ufikiaji wa kibinafsi:

Kigogo cha darasa la umma ( umbizo la Kamba la kibinafsi; String getFormat() ( return this.format; ) public void setFormat(Muundo wa String) ( this.format = format; ) )

Kwa mfano, muundo wa kutofautisha wa darasa la Logger ni tofauti ya kibinafsi, kwa hivyo madarasa mengine hayawezi kupata moja kwa moja na kuweka thamani ya kutofautisha. Ili kuweza kufanya kazi na utofauti mwingine wa darasa, inafafanua njia mbili za umma: GetFormat () (umbizo la thamani ya kurudisha) na SetFormat (String) (mpangilio wa umbizo)

Fungua kirekebishaji cha ufikiaji - hadharani

Inatangazwa kama madarasa ya umma, mbinu, wajenzi na violesura vinaweza kuwa aina nyingine yoyote ya ufikiaji.

Ikiwa kuna ziara kadhaa za kuheshimiana za madarasa ya umma katika vifurushi tofauti, unahitaji kuagiza kifurushi kinacholingana cha darasa la umma lililoko kabisa. Tangu urithi wa darasa, njia zote za umma za darasa zinaweza kurithiwa na aina zake ndogo.

Vipengele vifuatavyo vinatumia udhibiti wa ufikiaji wa umma:

Utupu kuu wa tuli wa umma(Hoja za kamba) ( // ... )

Njia kuu ya programu ya Java () lazima iwekwe kwa umma, vinginevyo mkalimani wa Java hataweza kuendesha darasa.

Virekebishaji vya ufikiaji vilivyolindwa vimelindwa

Imetangazwa kama vigeu vilivyolindwa, mbinu na wajenzi kwenye kifurushi kimoja wanaweza kuwa na aina nyingine yoyote ya ufikiaji, na inaweza kufikiwa katika vifurushi tofauti vya aina ndogo.

Madarasa ya virekebishaji vya ufikivu vilivyolindwa na violesura haviwezi kurekebishwa na vigeu vya wanachama vinaweza kutangazwa kuwa vimelindwa, lakini vigeu vya kiolesura na mbinu za wanachama haziwezi kutangazwa kuwa zinalindwa.

Kirekebishaji Madaraja madogo yanaweza kufikia mbinu na vigeu vilivyotangazwa vilivyolindwa ili tuweze kulinda madarasa yasiyohusiana kwa kutumia mbinu na vigeu hivi.

Darasa la mzazi lifuatalo linatumia kirekebishaji cha ufikiaji kilicholindwa, aina ndogo hubatilisha mbinu ya openSpeaker() ya darasa la mzazi.

Kicheza Sauti cha Hatari ( Kizungumzaji cha boolean kilicholindwa (Spika sp) ( // 实现细节 ) ) darasa la UtiririshajiKicheza sauti ( Kizungumzaji cha boolean (Spika sp) ( // 实现细节 ) )

Ikiwa njia ya openSpeaker() imetangazwa kuwa ya faragha, basi kwa kuongeza darasa la AudioPlayer, njia hiyo haiwezi kupatikana. Ikiwa openSpeaker() itatangazwa kuwa ya umma, basi madarasa yote yana uwezo wa kufikia mbinu. Ikiwa tunataka kufanya mchakato uonekane kwa aina ndogo za darasa, basi njia hiyo inatangazwa kama imelindwa.

Udhibiti wa ufikiaji na urithi

Tafadhali kumbuka kuwa njia zifuatazo zinarithi sheria:

    Darasa la mzazi linatangazwa kama njia za umma katika darasa ndogo lazima pia ziwe za umma.

    Darasa la Mzazi linatangazwa kuwa njia inayolindwa katika tabaka dogo, ama kutangazwa kuwa inalindwa au kutangazwa hadharani. Huwezi kutangazwa kuwa faragha.

    Darasa la mzazi lililotangazwa kuwa njia ya faragha haliwezi kurithiwa.

Kirekebishaji kisicho na ufikiaji

Ili kufikia idadi ya vipengele vingine, Java pia hutoa idadi ya virekebishaji visivyo na ufikiaji.

Marekebisho tuli hutumiwa kuunda njia za darasa na anuwai za darasa.

Mpangilio wa mwisho unaotumiwa kupamba madarasa, mbinu na vigezo, darasa la mwisho lililobadilishwa haliwezi kurithiwa, njia ya darasa iliyorekebishwa haiwezi kurithiwa, kupinduliwa, kubadilishwa kwa vigezo vya mara kwa mara haziwezi kubadilishwa.

Kirekebishaji dhahania hutumiwa kuunda madarasa ya dhahania na njia za kufikirika.

Virekebishaji vya ulandanishi na tete, haswa kwa nyuzi za programu.

Kirekebishaji tuli

    Vigezo tuli:

    Neno kuu tuli hutumika kutangaza viambajengo tuli ambavyo havitegemei kitu, haijalishi mfano wa darasa una vitu vingapi, ni nakala moja tu ya utofauti tuli. Vigezo tuli pia hujulikana kama vigeu vya darasa. Vigezo vya ndani haviwezi kutangazwa kama vigeu vilivyobadilika.

    Mbinu tuli:

    Neno kuu tuli hutumika kutangaza kitu kisichotegemea mbinu tuli. Mbinu tuli haziwezi kutumia darasa la kutofautisha lisilo tuli. Njia tuli ya kupata data kutoka kwa orodha ya vigezo na kisha kuhesabu data.

Ufikiaji na mbinu tofauti za darasa zinaweza kutumika moja kwa moja kwa kufikia classname.variablename na classname.methodname.

Katika mfano ufuatao, kirekebishaji tuli hutumiwa kuunda njia za darasa na anuwai za darasa.

InstanceCounter ya umma ya darasa ( private static int numInstances = 0; protected tuli int getCount() ( return numInstances; ) private static void addInstance() ( numInstances++; ) InstanceCounter() ( InstanceCounter.addInstance(); ) utupu kuu wa tuli wa umma(Hoja za kamba ) ( System.out.println("Kuanzia na " + InstanceCounter.getCount() + " matukio"); kwa (int i = 0; i< 500; ++i){ new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }

Mifano ya matokeo ya hapo juu ya operesheni ya kuhariri ni kama ifuatavyo:

Ilianza na matukio 0 Imeunda matukio 500

Mainishaji wa mwisho

Vigezo vya mwisho:

Vigezo vya mwisho vinaweza kuanzishwa kwa uwazi na kuanzishwa mara moja tu. Saraka inatangazwa kwani vipengee vya mwisho haviwezi kuelekeza kwa kitu kingine. Lakini lengo la mwisho ni ambapo data inaweza kubadilishwa. Hii ni rejeleo la mwisho kwa kitu ambacho hakiwezi kubadilishwa, lakini ambacho thamani yake inaweza kubadilishwa.

Kirekebishaji cha mwisho kawaida hutumiwa pamoja kuunda darasa la kurekebisha tuli mara kwa mara.

Mtihani wa darasa la umma(thamani ya int ya mwisho = 10; // ya mwisho tuli ya umma int BOXWIDTH = 6; Kamba ya mwisho tuli TITLE = "Meneja"; public void changeValue(){ value = 12; //将输出一个错误 } } !}

Mbinu ya mwisho

Mbinu za darasa la mwisho zimerithiwa na vijamii, lakini vijisehemu haviwezi kuzirekebisha.

Kusudi kuu la njia ni kuzuia taarifa ya mwisho ya njia hiyo isibadilishwe.

Kama itakavyoonyeshwa hapa chini, kwa kutumia njia za mwisho za marekebisho ya tamko.

Mtihani wa darasa la umma(Badiliko la utupu la umma())( // 方法体 ) )

Kategoria ya mwisho

Madarasa ya mwisho hayawezi kurithiwa; hakuna tabaka linaloweza kurithi sifa zozote za darasa la mwisho.

Mtihani wa darasa la mwisho la umma ( // 类体 )

Kirekebishaji cha muhtasari

Darasa la muhtasari:

Darasa la dhahania haliwezi kutumika kusisitiza kitu; madhumuni pekee ya taarifa ni kuunda darasa dhahania kwa upanuzi wa siku zijazo wa darasa hilo.

Darasa haliwezi kurekebishwa kuwa dhahania na la mwisho. Ikiwa darasa lina njia za kufikirika, darasa lazima litangazwe kama darasa la kufikirika, vinginevyo, kosa la mkusanyaji hutokea.

Darasa la dhahania linaweza kuwa na njia dhahania na njia zisizo za dhahania.

Muhtasari wa Msafara wa darasa (bei ya kibinafsi ya mara mbili; mfano wa Kamba ya kibinafsi; mwaka wa Kamba ya kibinafsi; goFast isiyo wazi ya umma (); //抽象方法 mabadiliko ya utupu ya umma(); )

Mbinu ya mukhtasari

Hakuna njia ni utekelezaji wa njia ya kufikirika, utekelezaji wa njia madhubuti hutolewa na mada ndogo. Njia za muhtasari haziwezi kutangazwa kuwa za mwisho na kali.

Kitengo kidogo chochote kinachorithi darasa la dhahania lazima kitekeleze njia zote dhahania za darasa la mzazi, isipokuwa darasa ndogo ni darasa la dhahania.

Ikiwa darasa lina idadi ya mbinu dhahania, darasa lazima litangazwe kama darasa la mukhtasari. Darasa la mukhtasari haliwezi kuwa na mbinu dhahania.

Tamko la njia dhahania huisha kwa nusu-koloni, kwa mfano: sampuli ya mukhtasari wa umma();

Darasa la mukhtasari wa umma SuperClass( utupu m(); //抽象方法 ) darasa ndogo huongeza SuperClass( //实现抽象方法 void m())( ......... ) )

Kirekebishaji cha usawazishaji

Njia ya Neno kuu la Usawazishaji kutangaza wakati huo huo nyuzi moja pekee ndiyo inafikia. Kirekebishaji kisawazisha kinaweza kutumika kwa virekebishaji vinne vya ufikiaji.

Onyesho la utupu lililosawazishwa hadharaniMaelezo() ( ....... )

Kirekebishaji cha mpito

Kipengee kilichosawazishwa kina viwezo vya muda mfupi vilivyorekebishwa na mfano wa Mashine ya Mtandaoni ya Java (JVM) ili kuruka kigeu hicho mahususi.

Kirekebishaji kimejumuishwa katika ufafanuzi wa vigeu vya taarifa ili kuchakata madarasa na vigeu vya aina ya data.

Kikomo cha int cha muda mfupi cha umma = 55; // haitaendelea kwa umma int b; // itaendelea

Virekebishaji Tete

Tofauti tete ya mwanachama iliyobadilishwa hulazimisha nyuzi kusoma tena thamani ya kigezo cha mwanachama kutoka kwa kumbukumbu iliyoshirikiwa kila inapofikiwa. Zaidi ya hayo, wakati vigezo vya wanachama vinabadilika, thread inalazimika kubadilisha thamani iliyoandikwa kwa kumbukumbu iliyoshirikiwa. Kwa hivyo wakati wowote, mada mbili tofauti huona kila wakati thamani sawa ya ubadilishaji wa mwanachama.

Vyombo vya MyRunnable vya darasa la umma Vinavyoweza Kuendeshwa ( boolean tete ya kibinafsi inayotumika; utupu wa umma kukimbia() ( active = kweli; wakati (inafanya kazi) // 第一行 ( // 代码 ) ) kituo cha utupu cha umma() ( active = uongo; // 第二行 ))

Katika hali ya kawaida, nyuzi huita njia ya Run() (kwenye uzi wa Runnable) kwenye uzi mwingine unaoita Stop() mbinu. Ikiwa thamani inayotumika katika mstari wa kwanza buffer inatumika ndani safu ya pili wakati kitanzi kinachofanya kazi ni cha uwongo haachi.

Walakini, msimbo ulio hapo juu, tunatumia hali tete iliyorekebishwa, kwa hivyo kitanzi kitaacha.

Tutazungumza juu ya marekebisho: marekebisho ni nini, wigo, marekebisho ya madarasa, uwanja, njia. Nadhani haitakuwa ya kuchosha.

Marekebisho katika Java ni maneno muhimu ambayo hupeana darasa, uwanja wa darasa, au mbinu sifa fulani.

Ili kuonyesha mwonekano wa darasa la njia na uwanja wake, kuna marekebisho 4 ya ufikiaji:

  • Privat washiriki wa darasa wanapatikana ndani ya darasa pekee;
  • kifurushi-kibinafsi au chaguo-msingi (chaguo-msingi) washiriki wa darasa wanaonekana ndani ya kifurushi;
  • kulindwa washiriki wa darasa wanapatikana ndani ya kifurushi na katika madarasa ya vizazi;
  • umma washiriki wa darasa wanapatikana kwa kila mtu.

Ikiwa unakumbuka, mwishoni, tulipokuwa tayari tumeingiza darasa la Paka, bado tulikuwa na hitilafu ya mkusanyiko.

Jambo ni kwamba hatujataja virekebishaji vyovyote vya ufikiaji kwenye uwanja na njia zetu na zina mali chaguo-msingi (washiriki wa darasa wanaonekana ndani ya kifurushi). Ili kurekebisha hitilafu ya mkusanyiko wa msimbo wetu na hatimaye kuiendesha, tunahitaji kufanya mjenzi na mbinu zetu kuwa za umma. Kisha wanaweza kuitwa kutoka kwa vifurushi vingine.

Unaweza kuanza kujiuliza: haya yote ni ya nini? Kwa nini usifanye nambari ionekane kutoka kwa kifurushi au darasa lolote, lakini unahitaji kuzuia ufikiaji? Maswali haya yatatoweka yenyewe wakati unakuja wa kuandika miradi ngumu na ngumu. Sasa, tunapoandika programu ambazo utendakazi wake ni mdogo kwa darasa moja au mbili, inaonekana hakuna sababu ya kuzuia chochote.

Fikiria kuwa una darasa linaloonyesha kitu cha bidhaa fulani. Kwa mfano gari. Gari inaweza kuwa na bei. Umeunda uwanja wa bei na sehemu zingine nyingi, rundo la njia ambazo zinawajibika kwa utendakazi. Kila kitu kinaonekana kuwa sawa. Gari la darasa lako ni sehemu ya mradi mkubwa na kila mtu ana furaha. Lakini hebu sema kwamba mtu kwa bahati mbaya au kwa makusudi aliunda mfano wa darasa la gari na kuweka bei mbaya. Je, bidhaa inaweza kuwa na bei mbaya? Huu ni mfano wa zamani sana na hakuna uwezekano kwamba hii inaweza kutokea katika maisha halisi, lakini nadhani wazo liko wazi. Wakati mwingine unahitaji kutoa ufikiaji sio moja kwa moja, lakini kupitia njia fulani. Huenda msimbo unawajibika kwa utendakazi wa msimbo mwingine, na hutaki mtu abadilishe na kuhariri sehemu yako. Kwa kusudi hili kuna kizuizi cha ufikiaji.

Kirekebishaji cha ufikiaji cha wajenzi, njia na uwanja kinaweza kuwa chochote. Darasa linaweza tu kuwa la umma au chaguo-msingi, na kunaweza tu kuwa na darasa moja la umma katika faili moja.

Inatosha kuhusu virekebishaji vya ufikiaji kwa sasa. Katika makala "Programu inayolenga kitu" tutazungumza juu yao kwa undani zaidi, lakini sasa hebu tuzungumze juu ya marekebisho mengine ambayo, kwa njia, kuna mengi.

Sasa inakuja kirekebishaji tuli. Inaweza kutumika kabla ya mbinu, uwanja, na hata darasa tunapotaka kutangaza darasa lililowekwa. Katika Java, unaweza kuandika madarasa ndani ya madarasa mengine, na ikiwa kirekebishaji kabla ya darasa ndani ya darasa ni tuli, basi darasa kama hilo linaitwa nested, ikiwa kirekebishaji kingine ni au chaguo-msingi, basi darasa kama hilo linaitwa ndani. Kutakuwa na nakala tofauti kuhusu madarasa yaliyowekwa kiota na ya ndani, kwani kila kitu sio rahisi sana hapo.

Kirekebishaji tuli kabla ya mbinu au sehemu inaonyesha kuwa si ya mfano wa darasa hilo. Hii ina maana gani kwetu? Wakati tumetangaza uga wa darasa au mbinu kama tuli, inaweza kuitwa bila kutumia mfano wa darasa. Hiyo ni, badala ya ujenzi huu: Paka paka = Paka mpya (); cat.method(), unaweza kuandika Cat.method(). Isipokuwa njia hiyo imetangazwa kuwa tuli. Vigezo vya tuli ni sawa kwa vitu vyote vya darasa. Wana kiungo kimoja.

    Marekebisho ya darasa la umma (

    tuli int anotherStaticField = 5;

    utupu tuli wa umma myStaticMethod() (

    someField = "Uga wangu" ;

    //nonStaticField = ""; kosa la mkusanyiko

    //huwezi kutumia sehemu zisizo tuli

    // kwa njia tuli

    utupu wa umma myNonStaticMethod() (

    anotherStaticField = 4; //mashamba tuli yanaweza kutumika

    // kwa njia zisizo za tuli

    // njia kuu pia ina kirekebishaji tuli

    new Modificators() .myNonStaticMethod() ;

    Modificators.myStaticMethod(); //piga njia tuli na uwanja

    //kupitia Classname.method

Jambo lingine muhimu la kufanya juu ya marekebisho tuli ni kwamba sehemu tuli huanzishwa wakati darasa linapakiwa. Mara nyingi katika aina anuwai za majaribio ya Java unaweza kupata nambari ifuatayo:

Swali: nini itakuwa pato kwa console? Unahitaji kukumbuka kuwa kizuizi tuli kitakuwa pato kwanza kwa hali yoyote. Ifuatayo itakuwa kizuizi chaguo-msingi. Ifuatayo, angalia skrini ya koni:

Kirekebishaji kinachofuata tutakachoangalia kitakuwa mwisho.

Nadhani neno la mwisho linajieleza lenyewe. Kwa kutumia kirekebishaji cha mwisho, unasema kwamba sehemu haziwezi kubadilishwa, njia haziwezi kubatilishwa, na madarasa hayawezi kurithiwa (kutakuwa na nakala tofauti kuhusu urithi). Marekebisho haya yanatumika kwa madarasa, mbinu na vigeu pekee (pia vigeu vya ndani).

Tutazungumza juu ya kirekebishaji cha mwisho kwa njia na madarasa katika nakala ya OOP.

Ifuatayo itakuwa marekebisho ambayo hayatakuwa wazi sana kwa wanaoanza au wale wanaosoma safu hii ya nakala kutoka mwanzo. Na ingawa sitaweza kukuelezea kila kitu bado (kwa sababu ya ukweli kwamba haujui nyenzo zinazoambatana), bado nakushauri ujitambulishe nao. Ikifika wakati wa kutumia virekebishaji hivi, tayari utaelewa maneno mengi yanayotumika hapa chini.

Kirekebishaji iliyosawazishwa- inaonyesha kwamba njia inaweza kutumika tu na thread moja kwa wakati mmoja. Ingawa hii inaweza isikuambie chochote, manufaa ya kirekebishaji hiki yataonekana tunapojifunza usomaji mwingi.

Kirekebishaji ya muda mfupi- inaonyesha kuwa sehemu fulani inapaswa kupuuzwa wakati wa utayarishaji wa kitu. Kama sheria, sehemu kama hizo huhifadhi maadili ya kati.

Kirekebishaji tete- kutumika kwa ajili ya multithreading. Wakati sehemu iliyo na kirekebishaji tete itatumiwa na kubadilishwa na nyuzi nyingi, kirekebishaji hiki huhakikisha kuwa sehemu hiyo itabadilishwa kwa zamu na hakutakuwa na mkanganyiko nayo.

Kirekebishaji asili kabla ya kutangaza njia, inaonyesha kuwa njia hiyo imeandikwa katika lugha nyingine ya programu. Kawaida katika lugha ya C.

Kirekebishaji kalifp- Inahakikisha kuwa shughuli kwenye nambari za kuelea na mbili (hatua ya kuelea) hufanywa kulingana na kiwango cha IEEE 754 au, kwa urahisi zaidi, inahakikisha kuwa ndani ya njia, matokeo ya hesabu yatakuwa sawa kwenye majukwaa yote.

Bado sijazungumza kuhusu kirekebishaji dhahania. Nitazungumzia kwa ufupi, kwa sababu bila ujuzi wa misingi ya programu inayolenga kitu, sioni maana yoyote ya kuzungumza juu yake.

Darasa ambalo lina kirekebishaji dhahania haliwezi kuunda mfano. Kusudi lake pekee ni kupanuliwa. Darasa la dhahania linaweza kuwa na njia za dhahania na za kawaida.

Tutazungumza zaidi juu ya kirekebishaji dhahania katika nakala ya OOP.

Hapa ndipo tunaweza kumaliza makala kuhusu marekebisho. Mengi hayajasemwa kuwahusu. Lakini hii ni kutokana na ukweli kwamba bado hatuna dhana za OOP. Katika kipindi cha makala kadhaa, tutapanua ujuzi kuhusu marekebisho na kujaza mapengo.

5

Nimeona mijadala kadhaa kwenye StackOverflow kuhusu mada hii, lakini sioni chochote ambacho kilinisaidia kuelewa hoja ifuatayo:

Ninatoka kwa asili ya C ++ na hivi majuzi nilianza kujifunza Java. Katika C++, lini kulindwa, ni sehemu ndogo tu ambayo inaweza kufikia mwanachama inatumiwa (sawa na uwanja katika Java).

Pia kuna madarasa ya "rafiki" katika C++ ambayo yanaweza kufikia kamera za darasa la kibinafsi/lilindwa ambazo hutoa "urafiki". Hii ni kama kirekebishaji cha sehemu ya "kifurushi" katika Java (kirekebishaji cha uga chaguo-msingi), isipokuwa kwamba katika C++, urafiki hutoa ufikiaji kwa washiriki wote wa kibinafsi, lakini katika Java, ufikiaji kutoka kwa madarasa kwenye kifurushi sawa ni maalum kwa uwanja wa darasa. .

Kile siwezi kujua, nikidhani ninataka tu kutoa ufikiaji wa mada ndogo, ni kile ninachoweza kufanya katika C++ kwa kutangaza washiriki waliolindwa katika darasa ambalo "halitoi" urafiki.

Lakini katika Java sijui jinsi ya kufanya hivyo, kwani kwa kutumia kibadilishaji cha shamba "kilicholindwa" - pia ninatoa ufikiaji wa madarasa yote kwenye kifurushi. Njia pekee ninayopata kufanya hivyo ni kutangaza uwanja uliolindwa na kutenga darasa kwenye kifurushi chake.

Kutoka kwa hili ninahitimisha kuwa madarasa ya kuweka katika mfuko mmoja lazima yafanywe kwa msingi wa "urafiki" kati ya madarasa. Je, hii kweli ni sababu ya kuendesha katika kambi ya pakiti?

Jambo lingine sielewi, Katika Java, ikizingatiwa kuwa nina sehemu mbili kwenye darasa A: b, c. Ninataka kumpa B ufikiaji wa b lakini sio, na ninataka kuipa C ufikiaji wa c lakini sio b. na kwa "Dunia" nataka b, c kujificha. Ninawezaje kufanya hivyo? Nakisia B, C inapaswa kuwa katika kifurushi sawa na A. lakini kwa kutangaza b, c na kifurushi na kirekebishaji ninaruhusu B, C ufikiaji wa b na k. Kuna njia katika Java ya kufanya hivyo?

Natumai kwa maelezo fulani juu ya suala hili

11

Swali bora ikiwa sio muhimu kwako litakuwa moja ambalo ni nyembamba na maalum zaidi. Swali la jumla "yote kuhusu faragha katika Java na C++ na jinsi yanavyotofautiana" ni zaidi ya pana sana. Je, unaweza kuuliza swali mahususi zaidi kuhusu tatizo mahususi zaidi? - Yakk 04 Machi 15 2015-03-04 16:38:58

  • 4 majibu
  • Kupanga:

    Shughuli

2

Katika C ++, wakati ulinzi unatumiwa, ni sehemu ndogo tu inaweza kufikia kipengele (kinachofanana na shamba katika Java).

Vibainishi vya ufikiaji pia ni vya kazi/mbinu za washiriki, sio tu vigeu vya wanachama.

Katika C++ pia kuna madarasa ya "rafiki" ambayo yanaweza kupata washiriki wa kibinafsi / waliolindwa wa darasa, kutoa "urafiki". Hii ni kama kirekebishaji cha uwanja wa "kifurushi" kwenye Java (kirekebishaji cha uga chaguo-msingi), isipokuwa kwamba katika C++, urafiki hutoa ufikiaji kwa washiriki wote wa kibinafsi, lakini kwa Java, ufikiaji kutoka kwa madarasa kwenye kifurushi kimoja ni maalum kwa darasa. shamba.

Hakuna madarasa ya marafiki tu, bali pia kazi.

Ni kweli kwamba ufikiaji wa sehemu za siri za Java ni sawa, lakini sio uingizwaji kamili. Ni bora kusema kwamba kazi hizi mbili zina kikundi kidogo matatizo wanayoyatatua. Kuna shida ambazo zinaweza kutatuliwa na rafiki lakini sio kwa kifurushi-kibinafsi, na kinyume chake.

Kile ambacho sikuweza kujua, nikidhani ninataka tu kutoa ufikiaji wa mada ndogo, ndio ninaweza kufanya katika C++ kwa kutangaza watumiaji waliolindwa katika darasa ambalo "haitoi" urafiki.

Lakini katika Java, sijui ninawezaje kufanya hivi,

Jibu: Huwezi.

kwani kwa kutumia kirekebishaji cha shamba "kilicholindwa" - mimi pia hutoa ufikiaji wa madarasa yote kwenye kifurushi.

Njia pekee ninayopata ni kutangaza uwanja uliolindwa na kuwa na darasa limetengwa kwenye kifurushi chake.

Kitaalam, ndiyo. Lakini hii inajenga matatizo mengine. Darasa lako halitaweza tena kufikia sehemu za kifurushi cha faragha za kifurushi chake cha awali. Hebu tuseme BaseClass yako ilikuwa com.example.one . Utaihamisha hadi com.example.two. Sasa haitaweza tena kufikia vifurushi vingine vya darasa la kibinafsi com.example.one.

Je, hii kweli ni sababu ya kuendesha katika kambi ya pakiti?

Ndio, Java imeundwa hivi. Unaweza kujaribu kupambana na kanuni za lugha, lakini hiyo ni vita ya kushindwa katika lugha yoyote ya programu.

Jambo lingine ambalo sielewi ni katika Java, ikizingatiwa kuwa nina sehemu mbili kwenye darasa A: b, c. Ninataka kumpa B ufikiaji wa b lakini sio, na ninataka kuipa C ufikiaji wa c lakini sio b. na katika "Dunia" nataka b, c kujificha. Ninawezaje kufanya hivyo?

Hii haiwezi kufanywa kwa njia safi (kwa safi ninamaanisha: bila udukuzi wowote ambao ungehitaji uangalie safu ya simu wakati wa kukimbia na kurusha kando).

Iwapo una wasiwasi kuhusu hali hii kwa sababu unatengeneza API ya umma, suluhisho la teknolojia ya chini ambalo kwa kawaida hufanya kazi vizuri ni kuunda kifurushi kimoja au zaidi *.ndani na kuweka kumbukumbu kwa uwazi ukweli kwamba hazipaswi kutumiwa katika msimbo wa mteja.

1

Hayo ni maswali mengi pamoja...

Lakini katika Java, sijui jinsi naweza kufanya hivyo, kwani kwa kutumia kirekebishaji cha shamba "kilicholindwa" - pia ninatoa ufikiaji wa madarasa yote kwenye kifurushi.

Kwa kweli, hakuna njia ya kutoa ufikiaji wa mada ndogo tu lakini sio kwa madarasa kwenye kifurushi sawa. Huu ulikuwa uamuzi wa kubuni uliofanywa karne nyingi zilizopita...

Njia pekee ninayopata kufanya hivyo ni kutangaza uwanja uliolindwa na kuutenga kwenye kifurushi chako.

Hii ni sahihi kitaalam, ingawa itakuwa ya matumizi kidogo. Ufungaji wa darasa umekusudiwa kwa madarasa yanayohusiana, ambapo "kuhusiana" inamaanisha "madarasa yanayofanya uhusiano maalum", i.e. ni ya kesi sawa ya utumiaji, ni ya kiwango sawa cha usanifu, iko katika asili sawa, nk.

Kutoka kwa hili ninahitimisha kuwa madarasa ya kuweka katika mfuko mmoja lazima yafanywe kwa msingi wa "urafiki" kati ya madarasa. Je, hii kweli ni sababu ya kuendesha katika kambi ya pakiti?

Ninaamini tayari nilijibu hili katika aya iliyotangulia: ufungaji umeundwa kwa madarasa yanayohusiana kulingana na vigezo fulani.

Kwa madarasa yako ya A, B na C, kwa mfano na sifa:

Nadhani B, C zinapaswa kuwa katika kifurushi kimoja, A. a kutangaza b, na kirekebishaji cha ufungaji ninaruhusu B, C kufikia b na k. Je, kuna njia katika Java kufanya hivi?

Jibu ni hapana, hakuna njia rahisi na safi ya kufanya hivyo. Unaweza kufanikisha hili kwa udukuzi au mbinu za hali ya juu zaidi, lakini tena, hii ilikuwa ni sehemu ya maamuzi yaliyofanywa na watengenezaji wa lugha muda mrefu uliopita...

0

Jibu fupi: hakuna njia ya kufanya hivi.

Ikiwa una wasiwasi kuhusu uvamizi kutoka kwa wateja wanaoingiza darasa kwenye kifurushi ili kupata ufikiaji ambao haujaidhinishwa, unaweza kuhamisha msimbo nyeti kwenye kifurushi tofauti, na kufanya kifurushi kufungwa kwenye jar unayowasilisha kwa: http://docs.oracle. com/javase/tutorial /deployment/jar/sealman.html

1

Inachukuliwa kuwa darasa zote kwenye kifurushi "zinajua" kila mmoja (kwa sababu ziliandikwa na mtu mmoja / kampuni / shirika). Kwa hivyo labda hawafikii sehemu zinazolindwa, au wakifanya hivyo, wanajua jinsi ya kuifanya ipasavyo.

Inachukuliwa kuwa madarasa katika kifurushi kimoja yanahusiana zaidi kuliko mzazi anavyohusiana na darasa linalotokana, kwa sababu darasa linalotokana linaweza kuandikwa na mtu mwingine. Kwa hiyo waliamua kwamba ulinzi wa kibinafsi ulikuwa mdogo zaidi kuliko ulivyolindwa.

Kwa hivyo, nadhani haupaswi kuwa na wasiwasi juu ya jinsi madarasa kwenye kifurushi kimoja yanaweza kufikia uwanja wa kila mmoja. Kwa ujumla, situmii kipengele hiki isipokuwa ninapoandika wahariri.

Ikiwa una sehemu mbili, unaweza kuzifanya kuwa madarasa ya ndani ili waweze kupata uwanja wa kibinafsi (tena, mantiki: ikiwa darasa liko ndani ya darasa lingine, linajua juu ya semantiki za darasa hilo) na linaweza kutoa ufikiaji wao kwa darasa lingine. madarasa yanayotokana na njia salama.

Bila shaka, unaweza kuja na itifaki changamano ya kubadilishana tokeni ili kufanya uwanja huu kufikiwa na hali za B/C pekee, lakini hiyo inaweza kuwa jambo la ajabu sana, na kitu kingine bado kinaweza kutumia tafakari kufikia wanachama wote wa kibinafsi ikiwa hutafanya hivyo. Usiizime kupitia sera za usalama, ambayo kwa kawaida sivyo, lakini tena, sera za usalama hatimaye huamuliwa na mmiliki wa JVM.

Kwa hivyo, mwishowe njia inayopendekezwa ya kufanya kile unachosema katika Java ni kuziweka kwenye kifurushi sawa, au kuandika B na C kama madarasa ya ndani ya A ili waweze kupata moja kwa moja washiriki wa kibinafsi wa A na kuwaonyesha kwa madarasa yanayotokana. .

Daraja la umma A (darasa la mukhtasari wa tuli la umma B (lilindwa Chochote getWhatever(A a) ( return a.b; ) lindwa void setWhatever(A a, Thamani yoyote) ( a.b = thamani; ) ) darasa la mukhtasari wa tuli la umma C (lilindwa Chochote utakachopata (A) (rejesha a.c; ) linda utupu setChochote(A a, Thamani yoyote) ( a.c = thamani; ) ) faragha Chochote b;

kwa mara nyingine tena, kila wakati unafikiria kuwa madarasa kwenye kifurushi sawa hayatawahi kufanya chochote kibaya.

Hapa tutajaribu kuzingatia karibu kesi zote za kutumia viboreshaji vya ufikiaji. Isipokuwa tu ni matumizi yao kwa nested ( kiota) na ya ndani ( ndani) madarasa, na pia kwa miingiliano, kwani bado hatujazingatia mada hizi.

Madarasa na vifurushi, vinapotumiwa pamoja na virekebishaji vya ufikiaji, hutumika kama njia ya ujumuishaji, ambayo ni, njia ya kuficha maelezo ya utekelezaji nyuma ya kiolesura rahisi.

Virekebishaji vya ufikiaji vinaweza kutumika kwa madarasa yote mawili na washiriki wao - nyanja na mbinu. Kuna marekebisho manne ya ufikiaji kwa jumla, na hapa tutatoa maelezo mafupi juu yao, kisha tutazingatia kila moja kwa undani.

  • umma- sehemu yoyote iliyotangazwa kama umma, kupatikana kutoka kwa msimbo wowote
  • kulindwa- inaruhusu ufikiaji wa sehemu ndani ya kifurushi na madarasa yake ya kizazi
  • Privat- inaruhusu upatikanaji wa vipengele ndani ya darasa
  • chaguo-msingi(hakuna neno muhimu) - inaruhusu upatikanaji wa vipengele ndani ya mfuko

Madarasa ya warithi ni madarasa yaliyorithiwa kutoka kwa darasa. Bado hatujasomea urithi..

Ufikiaji wa madarasa

Kwa chaguo-msingi, madarasa ya kiwango cha juu yanapatikana kwenye kifurushi ambamo yamefafanuliwa. Walakini, ikiwa darasa la kiwango cha juu limetangazwa kama umma, basi inapatikana kila mahali (au popote pakiti yenyewe inapatikana). Tumeweka kauli hii kwa madarasa ya kiwango cha juu kwa sababu madarasa yanaweza kutangazwa kuwa wanachama wa madarasa mengine. Kwa kuwa madarasa haya ya ndani ni washiriki wa darasa, wako chini ya sheria za kudhibiti ufikiaji kwa washiriki wa darasa.

Kupata Washiriki wa Darasa

Washiriki wa darasa wanaweza kufikiwa kila mara ndani ya kundi la darasa. Chaguomsingi washiriki wa darasa pia wanapatikana katika kifurushi ambacho darasa limefafanuliwa.

kirekebishaji cha umma

Kwa darasa lisilo na kiota, ni moja tu ya viwango viwili vya ufikiaji vinavyowezekana vinaweza kubainishwa: maalum chaguo-msingi Na umma . Wakati darasa linatangazwa kama umma, lazima awe peke yake umma darasa lililotangazwa katika faili, na jina la faili lazima lilingane na jina la darasa.

Vipi umma madarasa, mashamba, mbinu na wajenzi wanaweza kutangazwa.

Kirekebishaji kimelindwa

Tutaangalia kirekebishaji hiki kwa undani katika mada ya urithi wa darasa. Ikiwa urithi hautumiki, basi kirekebishaji hiki hufanya kazi sawa na kirekebishaji chaguo-msingi.

Kitu pekee ambacho kinaweza kusemwa kwa ufupi sasa ni kwamba vipengele vilivyotangazwa kama kulindwa, itakuwa na ufikiaji darasa lolote la watoto kutoka kwa kifurushi chochote au darasa lolote kutoka kwa kifurushi sawa.

Vipi kulindwa nyanja, mbinu, wajenzi, madarasa yaliyowekwa na violesura vilivyowekwa viota vinaweza kutangazwa.

kulindwa .

Kirekebishaji cha faragha

Hiki ndicho kirekebishaji kikali zaidi katika suala la vizuizi vya ufikiaji. Vipengele vilivyotangazwa kama Privat kupatikana tu ndani ya darasa moja na si kwa mtu yeyote nje ya darasa.

Vipi Privat nyanja, mbinu, wajenzi, madarasa yaliyowekwa na violesura vilivyowekwa viota vinaweza kutangazwa.

Madarasa ya kiwango cha juu na violesura haviwezi kutangazwa kama Privat .

Kimsingi, virekebishaji vya ufikiaji ni mada rahisi, lakini tutarejea kwao baadaye. Kwa sasa ilikuwa ni kufahamiana tu. Na sasa mazoezi kidogo ...

Niliunda madarasa ya Mod02.java, DefMod.java, ProMod.java na PrvMod.java ambayo ni ya kifurushi cha pro.java.pkg002, pamoja na darasa la PubMod.java, ambalo ni la kifurushi cha pro.java.pkg003. Chini ni picha za skrini za madarasa haya na matokeo ya programu: