Въведение в обектното програмиране

6.3. Локални и глобални променливи. Модификатори на достъп и правила за видимост. Тази връзка

Както вече споменахме, данните могат да се предават на подпрограма чрез глобални променливи. Това могат да бъдат полета с данни на обекта, в метода на който се осъществява повикването, полета с данни на съответния клас или полета с данни на друг обект или клас. Използването на глобални променливи не се препоръчва поради две причини.

  • Първо, при извикване в списъка с параметри не се вижда, че се осъществява достъп до съответните променливи и програмата става "непрозрачна" за програмиста. Какво го прави неструктуриран.
  • На второ място, когато глобалната променлива е променена във функционална рутина, страничен ефект, свързано с факта, че функцията не само връща изчислената стойност, но също така променя състоянието на околната среда по незабележим начин за програмиста. Това може да е причина за лошо откриваеми логически грешки, които не се проследяват от компилатора.

Разбира се, има моменти, когато използването на глобални променливи е не само желателно, но просто необходимо - в противен случай те не биха били въведени като конструкция на програмни езици! Например, когато пишете метод в клас, обикновено трябва да получите достъп до полетата и методите на този клас. В Java такъв достъп се осъществява директно, без да се посочва името на обект или клас.

Правилата за достъп за методи и полета с данни (променливи) от други пакети, класове и обекти се задават с помощта на модификатори частни, защитен, публично. Правилата за достъп често се наричат ​​правила за видимост и са синоними. Ако променлива или подпрограма са невидими в определена област на програмата, достъпът до тях се отказва.

частни - елемент (поле или метод за данни) е достъпен само в методи от този клас. Няма достъп от обекти! Тоест, ако сме създали обект, който има частно поле или метод, тогава е невъзможно достъпът до това поле или метод от обекта.

Модификаторът не е зададен - това означава, че е в сила достъпът по подразбиране - така наречената партида, когато съответният елемент е достъпен само от класовете на неговия пакет. Няма достъп от обекти, ако те са извикани в оператори, разположени в класове от други пакети!

Понякога, по аналогия със C ++, този тип достъп се нарича „приятелски“.

защитен - елементът е достъпен само в методи от този клас, този пакет, както и производни класове (те могат да бъдат разположени в други пакети).

публично - елементът е достъпен от всякакви класове и обекти (квалифициран от името на пакета, ако съответният клас не е импортиран).

Например в класа

дадени са променливи x, y, p1, p2, p3. Освен това, x и y имат частно ниво на достъп, p1 - пакетно, p2 - защитено, p3 - публично. Изброяването на един и същи тип променливи, разделени със запетаи, ви позволява да използвате за няколко променливи еднократно присвояване на името на типа и модификаторите, без повторение.

Но променливите, зададени на ниво клас (глобални променливи), се създават, когато обектът се създава за методите на обекта и когато класът е извикан за първи път за променливи на класа. И те могат да се използват в методите от този клас като глобални, независимо дали променливите са зададени преди метода или след него.

Друга важна характеристика на локалните променливи е техният живот: паметта се разпределя за тях по време на разговора и се освобождава веднага след края на разговора. Да разгледаме функция, която изчислява сумата от числа от 1 до n:

Извикването на този метод може да изглежда така:

Променливите i и r обаче съществуват само по време на извикване на obj1.sum1 (1000). При следващото подобно повикване следващият набор от i и r ще бъде създаден и след това освободен от паметта .

Нека се спрем на обхвата на локална променлива. Налични са следните нива на видимост:

  • На ниво метод. Променливата е видима от мястото на декларацията до края на метода.
  • На ниво блок. Ако дадена променлива е зададена вътре в блок, тя се вижда от декларацията до края на блока. Блоковете могат да бъдат вложени един в друг с произволно ниво на влагане.
  • На нивото на цикъла for. Променливата е видима от мястото на декларацията в секцията за инициализация до края на тялото на цикъла .

Глобалните променливи са видими в цялата подпрограма.

Тази препратка не може да се използва в методите на класа (т.е. тези, дефинирани със статичния модификатор), тъй като те могат да бъдат извикани без съществуващ обект.

Възниква въпросът какво се случва, ако две променливи с едно и също име са зададени на различни нива. Налични са следните ситуации: