CodeGym /Kurslar /Java SELF AZ /Dəyişənlərlə iş nüansları

Dəyişənlərlə iş nüansları

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Konstantalar

Bir çox proqramlaşdırma dillərində konstantalar mövcuddur — dəyərləri dəyişdirilə bilməyən dəyişənlər. Adətən bunlar Pi kimi fundamental şeylər və ya aylardakı günlərin sayı kimi şeylərdir. Lakin prinsipcə proqramçı, lazım olduğunu düşünərsə, hər hansı dəyişəni konstanta edə bilər.

Beləliklə, Java-da dəyişməz dəyişən (konstanta) necə elan edilir? Bunun üçün xüsusi bir final açar sözü mövcuddur. Dəyişməz bir dəyişənin yaradılması adi dəyişənin yaradılması kimi görünür, sadəcə dəyişənin tipindən əvvəl final sözünü yazmalısınız:

final tip ad = dəyər;

Əgər siz final-dəyişənə başqa bir dəyər təyin etməyə çalışsanız, proqramınız sadəcə kompilyasiya olmayacaq.

final-dəyişən mütləq elan edilərkən təyin edilməlidir (ona bir dəyər verilən). Bu qaydanın bir istisnası var: dəyişən sinifinin inisializasiyasını konstruktora köçürə bilərsiniz. Amma bu barədə 10-cu səviyyədə öyrənəcəksiniz.

Açar sözləri azaldaraq, Java inkişaf etdiriciləri final sözünü yalnız konstantalar üçün deyil, həmçinin metodlar və hətta siniflərin elanında istifadə edir. final kimi elanedilmiş metodlar yenidən yazıla (override) bilməzlər, final kimi elan edilmiş siniflər isə irsi ola bilməz.

final modifikatorunu hər bir dəyişkənə əlavə edə bilərsiniz: lokal, parametrlərə, sinif sahələrinə və statik dəyişənlərə.

Diqqət yetirin ki, final yalnız dəyişənin dəyişdirilməsindən qorunmadır. Əgər dəyişən obyektə istinad saxlayırsa, obyekti dəyişmək yenə də mümkündür.

Nümunə:

final int[] data = {1, 2, 3, 4, 5, 6};

data = new int[]{6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Array yaradırıq.

Belə olmaz: data dəyişəni final olaraq elan edilib.

Belə olar.
Və belə də olar.

Qlobal konstantalar

Əgər proqramınızda qlobal konstantalar elan etmək istəyirsinizsə, bunun üçün sinifin statik dəyişənlərini yaratmalı, həmçinin onları publicfinal etməlisiniz. Belə dəyişənlərin adlarında xüsusi bir yazı üslubu istifadə olunur: böyük hərflə yazılırlar və sözlərarası ayırıcı olaraq alt xətt (_) simvolu istifadə edilir.

Nümunələr:

class Solution
{
   public static final String SOURCE_ROOT = "c:\\projects\\my\\";
   public static final int DISPLAY_WIDTH = 1024;
   public static final int DISPLAY_HEIGHT = 768;
}


2. Dəyişənlərin kölgələnməsi

Əvvəl də dediyimiz kimi, eyni metodda bir neçə lokal dəyişəni eyni adla yaratmaq olmaz. Fərqli metodlarda isə — olar.

Amma bəs bunu bilirdinizmi: sinif dəyişənləri ilə metodun lokal dəyişənləri eyni ada malik ola bilər.

Nümunə:

Kod Dəyişənlərin əlçatanlığı
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}


count
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

add metodunda lokal dəyişən sum elan etdik, və bu metodu tamamlayanadək sinif dəyişənini sum kölgələdi (və ya buna kölgələmə deyilir).

Yaxşı, deyərsiz, bir az gözlənilən davranışdır. Amma bu hamısı deyil. Məlum oldu ki, əgər sinif dəyişənini lokal dəyişən kölgələyirsə, metodda sinif dəyişəninə müraciət etmək üçün bir yol var. Bunu etmək üçün adının qarşısına this açar sözünü yazmaq lazımdır:

this.ad

Ad münaqişəsinin uğurla həll edildiyi nümunə:

Kod Dəyişənlərin əlçatanlığı
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}


this.count
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

Hər yerdə countsum dəyişənlərinə həm this açar sözü ilə, həm də onsuz müraciət etmək olar. Lokal dəyişən sum, sinif dəyişənini sum kölgələdiyi sətrlərdə, sinif dəyişəninə yalnız this istifadə edərək müraciət etmək mümkündür.

Əgər sadəcə sinif dəyişəni deyil, sinifin statik dəyişəni kölgələnirsə, ona this ilə deyil, sinifin adı ilə müraciət edilməlidir:

ClassName.ad

Nümunə:

Kod Dəyişənlərin əlçatanlığı
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

Hər yerdə countsum statik dəyişənlərinə həm Solution sinfinin adı ilə, həm də onsuz girişi təmin etmək olar. Lokal dəyişən sum sinif dəyişənini sum kölgələdiyi sətrlərdə, sinif dəyişəninə yalnız Solution prefiksindən istifadə etməklə müraciət etmək mümkündür.



3. Dəyişənlər for dövründə

Və başqa bir kiçik, amma maraqlı fakt.

Başqa bir yer var ki, burada dəyişən xüsusi şəkildə elan edilir — bu for dövrü-dür.

Xatırlayırsınızsa, adətən for dövründə dairəvi mötərizələrin içində sayğacı dəyişən elan olunur. Bəs bu dəyişənin görünüş sahəsi necə olacaq? Axı o dövrün bədənində deyil — demək, bütün metodda mı? Yoxsa yenə də yox?

Düzgün cavab belədir: for dövrü-nün başlığında elan olunan dəyişən yalnız dövrün bədənindəfor dövrü başlığında görünür.

Nümunə:

Kod Dəyişənlərin mövcudluğu
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

Buna görə də, siz kodunuzda eyni ada malik sayğac dəyişəni ilə ardıcıl olaraq bir neçə dövr yaza bilərsiniz — heç bir problem olmayacaq.

Nümunə:

Kod Dəyişənlərin mövcudluğu
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION