1. Giriş
Java-da da, həyatda olduğu kimi, hər şey hamı üçün və hər zaman əlçatan olmamalıdır. Bir mənzili təsəvvür edin: istəməzsiniz ki, qonşular sizin yataq otağınıza gəlib-getsin, elə deyilmi? Elə proqramlarda da bəzən bəzi dəyişənlərə və ya metodlara «qapını bağlamaq», yəni onlara kənardan müraciəti məhdudlaşdırmaq istəyirik.
Bunun üçün Java-da əlçatanlıq modifikatorları var — müəyyən dəyişənin və ya metodun harada istifadə oluna biləcəyini göstərən xüsusi sözlər: məsələn, public və ya private.
Əsas əlçatanlıq modifikatorları
| Modifikator | Harada görünür? |
|---|---|
|
Sinfin göründüyü hər yerdə (başqa paketlərdə və başqa fayllarda da) |
|
Yalnız həmin sinfin daxilində |
|
Yalnız eyni paket daxilində (yəni eyni qovluqdakı siniflər daxilində) |
Başqa modifikatorlar da var, amma onlardan daha sonra, irsilik mövzusuna çatanda danışacağıq.
Praktik nümunə
public class User
{
public String name; // hamı üçün görünür
private int age; // yalnız User sinfinin daxilində görünür
public void sayHello()
{
System.out.println("Salam, mənim adım " + name);
}
private void secretMethod()
{
System.out.println("Bu gizli metoddur!");
}
}
İzah:
- name — User sinifini istifadə etmək mümkün olan hər yerdə görünür.
- age — yalnız elə həmin User sinfinin daxilində görünür.
- sayHello() — public metoddur, onu istənilən digər sinifdən çağırmaq olar.
- secretMethod() — private metoddur, onu kənardan çağırmaq olmaz.
Bu real tapşırıqlarda necə işləyir?
Tutaq ki, bank hesabını təsvir edən bir sinfimiz var. Təbii ki, heç kimin balansı birbaşa dəyişməsini istəmirik! Buna görə balans dəyişəni private olacaq və onunla işləmək üçün xüsusi metodlar olacaq.
Niyə hər şeyi public etmək düzgün deyil?
Belə bir cazibə yarana bilər: «Gəlin, əziyyət çəkməyək deyə hər şeyi public edək!» Amma bu, xaosa aparan yoldur. Təsəvvür edin ki, istənilən kəs balansınızı, istifadəçi adınızı dəyişə bilər və ya yalnız daxili istifadə üçün nəzərdə tutulmuş metodu belə çağıra bilər. Böyük proqramlarda bu, səhvlərə və «mistik» buglara səbəb olur.
Java proqramçısının qızıl qaydası:
Əvvəlcə hər şeyi private edin, sonra isə yalnız həqiqətən lazım olanları kənara açın.
2. Dəyişənlərin görünürlük sahəsi
Görünürlük sahəsi — dəyişənin «mövcud» olduğu və istifadə oluna bildiyi kod hissəsidir. Bu zonadan kənara çıxdıqda, dəyişən «yox olur» — sanki heç olmamış kimi.
Java-da görünürlük sahəsinə görə bir neçə növ dəyişən var:
- Lokal dəyişənlər — metodun və ya { ... } kod blokunun daxilində elan olunur.
- Metod parametrləri — metodun mötərizələrində elan olunur.
- Sinif sahələri — sinfin daxilində, lakin metodlardan kənarda elan olunur.
Əgər dəyişən { blok } daxilində elan olunubsa,
o yalnız həmin blok daxilində görünür
və ondan kənarda əlçatan deyil.
Lokal dəyişənlər
Lokal dəyişən yalnız elan olunduğu metodun və ya blokun daxilində «yaşayır».
void printSum(int a, int b)
{
int sum = a + b; // lokal dəyişən
System.out.println(sum);
}
// sum artıq burada mövcud deyil!
Metoddan kənarda sum-a müraciət etmək cəhdi kompilyasiya xətasına səbəb olacaq: «sum dəyişəni tapılmadı».
Metod parametrləri
Parametrlər də dəyişənlərdir, lakin onlar yalnız metodun daxilində yaşayırlar.
void greet(String name)
{
System.out.println("Salam, " + name);
}
// name artıq burada mövcud deyil!
Sinif sahələri (üzv dəyişənlər)
Sinif sahələri sinfin daxilində, lakin metodlardan kənarda elan olunur. Onlar həmin sinfin bütün metodlarında görünür.
public class Counter
{
private int count = 0; // sinif sahəsi
public void increment()
{
count++; // sahədən istifadə edə bilərik
}
public int getCount()
{
return count; // burada da sahədən istifadə edə bilərik
}
}
3. Dəyişənlərin kölgələnməsi (Shadowing)
Kölgələnmə (shadowing) — eyni adda dəyişənin (və ya parametrin) daha daxili görünürlük sahəsində elan olunduğu vəziyyətdir. Bu blok daxilində «yeni» ad köhnəsini kölgədə qoyur və xarici dəyərə birbaşa müraciət etmək olmur.
Kölgələnməyə nümunə:
class ShadowDemo
{
int value = 10; // sinif sahəsi
void printValue()
{
System.out.println(value); // 10 — sinif sahəsini çap edir
int value = 5; // lokal dəyişən sinif sahəsini kölgələyir
System.out.println(value); // 5 çap edir, 10 yox
}
}
Bu nümunədə, int value = 5; yazdıqda, eyni adlı sinif sahəsindən üstün olan yeni lokal dəyişən elan edirik. printValue() metodunun daxilində value-a müraciət edildikdə sinif sahəsi yox, məhz lokal dəyişən istifadə olunacaq.
Əgər yenə də sinifin statik sahəsinə müraciət etmək lazımdırsa, prefiks kimi sinifin adından istifadə edin:
class ShadowDemo
{
static int value = 10; // sinifin statik sahəsi
void printValue()
{
System.out.println(value); // 10 — sinif sahəsi
int value = 5;
System.out.println(value); // 5 — lokal dəyişən
System.out.println(ShadowDemo.value); // 10 — sinifin statik sahəsi, 'ShadowDemo' vasitəsilə giriş
}
}
Əgər qeyri-statik sinif sahəsinə müraciət etmək lazımdırsa, this açar sözündən istifadə olunur. O, obyektin cari nümunəsini göstərir.
class ShadowDemo
{
int value = 10;
void printValue()
{
System.out.println(value); // 10 — sinif sahəsi
int value = 5;
System.out.println(value); // 5 — lokal dəyişən
System.out.println(this.value); // 10 — sinif sahəsi, 'this' vasitəsilə giriş
}
}
4. Təcrübə: əlçatanlıq modifikatorları və görünürlük sahəsi
Gəlin tədris tətbiqimizi inkişaf etdirməyə davam edək: tələbələrin sadə uçotu sistemi. Sahələr və metodlar üçün müxtəlif modifikatorlar təyin edək.
Nümunə: Student sinfi
public class Student
{
public String name; // tələbənin adı (hamı üçün görünür)
private int age; // yaş (yalnız sinfin daxilində görünür)
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public void sayHello()
{
System.out.println("Salam, mənim adım " + name);
}
private void printSecret()
{
System.out.println("Mənim yaşım: " + age);
}
public void revealSecret()
{
printSecret(); // sinfin daxilində private metodu çağırmaq olar
}
}
Student sinfinin istifadəsi
public class Main
{
public static void main(String[] args)
{
Student s = new Student("Vasya", 20);
s.sayHello(); // OK: public metod
s.revealSecret(); // OK: sinif daxilindəki private metodu çağıran public metod
s.age = 30; // Səhv! age sahəsi private-dir
s.printSecret(); // Səhv! printSecret metodu private-dir
}
}
5. Əlçatanlıq modifikatorları və görünürlük sahəsi ilə işləyərkən tipik səhvlər
Səhv №1: Hər şey public — və salam, xaos!
Bütün sahə və metodları public etsəniz, kimin və necə məlumatlarınızı dəyişdiyinə nəzarəti itirə bilərsiniz. Sahələri private edin və yalnız zəruri olanları kənara açın.
Səhv №2: Dəyişəni öz görünürlük sahəsindən kənarda istifadə etməyə cəhd.
Məsələn, dəyişəni metod daxilində elan etmisiniz, sonra isə ona kənardan müraciət edirsiniz — kompilyasiya xətası alacaqsınız. Lokal dəyişənlər yalnız öz { ... } bloklarında yaşayırlar.
Səhv №3: Adların toqquşması (dəyişənlərin kölgələnməsi).
Metodda sinif sahəsi ilə eyni adda dəyişən elan etsəniz, hansı dəyişəndən istifadə etdiyinizi qarışdırmaq asandır. Sinif sahəsini açıq şəkildə göstərmək üçün this-dən istifadə edin: this.value.
Səhv №4: Başqa sinifdən private metoda və ya sahəyə müraciət cəhdi.
Əgər metod və ya sahə private kimi işarələnibsə, onlar yalnız həmin sinfin daxilində əlçatandır. Onlara kənardan müraciət kompilyasiya xətasına səbəb olacaq.
Səhv №5: Dövrədə və ya blokda görünürlük sahəsini unutmaq.
Dövrə və ya istənilən { } blokunun daxilində elan olunan dəyişən yalnız həmin blokda yaşayır. Blokdan kənarda o mövcud deyil.
GO TO FULL VERSION