CodeGym /Kurslar /JAVA 25 SELF /Əlçatanlıq modifikatorları, dəyişənlərin görünürlük sahəs...

Əlçatanlıq modifikatorları, dəyişənlərin görünürlük sahəsi

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

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?
public
Sinfin göründüyü hər yerdə (başqa paketlərdə və başqa fayllarda da)
private
Yalnız həmin sinfin daxilində
(modifikatorsuz)
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:

  • nameUser 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şənin görünürlük sahəsi

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.

1
Sorğu/viktorina
, səviyyə, dərs
Əlçatan deyil
Metodlar
Metodların elan edilməsi və çağırılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION