1. Obyektlər
Java-da hər şey obyekt kimi qəbul olunur.
Daha dəqiq desək, Java-da obyekt olmayan çox az şey var. Məsələn, primitiv tiplər. Amma bu daha çox istisnadır, qayda deyil.
Bəs obyekt nədir?
Obyekt — bir yerdə qruplaşdırılmış məlumatlar və bu məlumatları işləmək üçün metodlar. Məlumatlar haqqında danışarkən, əlbəttə, dəyişənləri nəzərdə tuturuq.
Obyektin dəyişənlərinə "obyektin məlumatları" və ya "obyektin vəziyyəti" deyilir.
Obyektin metodlarına isə "obyektin davranışı" deyilir. Obyektin vəziyyətini (obyekt dəyişənlərini) yalnız həmin obyektin metodları vasitəsilə dəyişmək tövsiyə edilir. Obyekt dəyişənlərini birbaşa (obyekt metodlarından keçmədən) dəyişmək pis ton hesab olunur.
Hər obyektin, həmçinin hər dəyişənin, tipi var. Bu tip obyekt yaradılarkən bir dəfə təyin olunur və sonradan dəyişdirmək mümkün deyil. Obyektin tipi onun sinfi sayılır.
Hər obyektin sinifdə olan dəyişənlərin (sinif sahələrinin) öz surəti olur. Əgər sinifdə qeyri-statik bir dəyişən int a elan olunubsa və proqramınız işlədiyi zaman bu sinifdən 10 obyekt yaradılsa, indi hər bir obyektin öz int a dəyişəni var.
Obyekt ilə əlaqə
Obyekt ilə işləməyin ən rahat yolu — obyektə istinad edən bir dəyişəndə onu saxlamaq və sonra həmin dəyişən vasitəsilə metodları çağırmaqdır. Bu sizə tanış görünəcək:
dəyişən.metod()
Burada dəyişən
— obyektə istinad saxlayan dəyişəndir, metod isə obyektin sinfinin metodudur.
Əgər obyektin sahəsinə (dəyişəninə) müraciət etmək istəyirsinizsə, nöqtə operatoru istifadə etməlisiniz:
dəyişən.sahə
Burada dəyişən
— obyektə istinad saxlayan dəyişəndir, sahə isə sinfin dəyişəni (obyektin sahəsi) sayılır.
2. new
Operatoru
Müəyyən bir sinifin obyektini yaratmaq üçün new
operatorundan istifadə etmək lazımdır. Obyektin yaradılması ümumi halda belə görünür:
Sinif dəyişən = new Sinif(parametrlər);
Burada Sinif
— obyektin yaradılacağı sinifin adı və dəyişənin bəyan edildiyi sinif adıdır. Dəyişən
— yaradılmış obyekt üçün yaddaqalan bir linki saxlayan dəyişəndir. Parametrlər
isə obyektin yaradılması metodunun parametrləridir.
Obyektin hansı parametrləri ola biləcəyini, onun sinifi yazan proqramçılar qərar verir.
Siz artıq əvvəllər obyektlər yaratmısınız və bu konstruktoru istifadə etmisiniz. Ümid edirəm, bunu unutmadınız?
Scanner konsol = new Scanner(System.in);
int x = konsol.nextInt();
Scanner konsol
— bu konsol
tipində Scanner
dəyişəninin yaradılmasıdır. new Scanner(System.in)
— bu Scanner
tipində obyektin yaradılmasıdır. Və bərabərlik operatoru isə konsol
dəyişəninə yaradılmış obyektin linkini yükləyir.
İkinci sətirdə biz Scanner
obyektinin nextInt()
metodunu, konsol
dəyişəninin köməyi ilə, hansı ki, Scanner
tipində obyektə işarəni saxlayır, çağırırıq.
Obyektlərin yaradılması nümunələri:
Kod | Təsvir |
---|---|
|
String tipində obyekt yaradır |
|
Scanner tipində obyekt yaradır |
|
int[] tipində obyekt yaradır: 10 elementlik int tipli konteyner |
Yaradılmış obyektlərə sinifin obyekti və ya sinifin instansı adı verilir, sinifə isə obyektin sinifi adı verilir. Məsələn: s
dəyişəni String
sinifinin instansı üçün linki saxlayır.
3. Siniflərlə tanışlıq
Düşünürəm, artıq başqa proqramistlər tərəfindən yazılmış siniflərdən istifadə etməyin çox rahat olduğunu fərq etmisiniz. Bəs öz siniflərinizi yazmağa necə baxırsınız?
Necə başa düşmək olar ki, sizə öz sinifiniz harada və nə vaxt lazımdır və necə yaradılacaq?
Proqramçılar adətən proqramda yeni mahiyyət daxil etmək istədiklərində öz siniflərini yaradırlar. Çox da aydın deyil? Onda izah etməyə çalışacağam, amma uzaqdan başlayacağam.
Məlumatların qruplaşdırılması
Bir az sadələşdirsək, belə demək olar ki, Java-da obyekt — bu, yaddaşda bir sahədir ki, orada sinifdə elan edilmiş dəyişənlər (sinif sahələri) saxlanılır. Yəni başqa sözlə — qruplaşdırılmış dəyişənlər.
Tutaq ki, proqramınızda 100
nöqtənin koordinatlarını saxlamaq və onları ekrana çıxarmaq üçün metod saxlamaq lazımdır. Bunu massivlər vasitəsilə etmək olar. Məsələn, belə:
class Solution
{
public static void printPoints(int[] x, int[] y, int[] color)
{
for (int i = 0; i < x.length; i++)
System.out.println("Nöqtənin rəngi x=" + x[i] + ", y=" + y[i] + " " + color[i]);
}
public static void main(String[] args)
{
int[] x = new int[100];
int[] y = new int[100];
int[] color = new int[100];
printPoints(x, y, color);
}
}
Hər şey daha rahat olardı, əgər x, y, rəng məlumatlarını saxlamaq üçün bir tipimiz olaydı. Yaxşı ki, Java-da belə bir tip yoxdursa, biz onu özümüz yarada bilərik.
Bunun üçün Point
sinifini yaratmaq üçün kod yazırıq:
public class Point
{
public int x;
public int y;
public int color;
}
Onda yuxarıdakı kodu belə yenidən yaza bilərik:
class Solution
{
public static void printPoints(Point[] points)
{
for (int i = 0; i < points.length; i++)
System.out.println("Nöqtənin rəngi x=" + points[i].x + ", y=" + points[i].y + " " + points[i].color);
}
public static void main(String[] args)
{
Point[] data = new Point[100];
for (int i = 0; i < data.length; i++)
data[i] = new Point();
printPoints(data);
}
}
İndi Point
sinifinə obyekt haqqında məlumat verirəcək bir metod əlavə edək:
public class Point
{
public int x;
public int y;
public int color;
public void print()
{
System.out.println("Nöqtənin rəngi x=" + x + ", y=" + y + " " + color);
}
}
Onda class Solution
belə olacaq:
class Solution
{
public static void printPoints(Point[] points)
{
for (int i = 0; i < points.length; i++)
points[i].print();
}
public static void main(String[] args)
{
Point[] data = new Point[100];
for (int i = 0; i < data.length; i++)
data[i] = new Point();
printPoints(data);
}
}
Biz gözəl şəkildə nöqtənin (sinif Point
) içində onun koordinatları haqqında məlumatı və obyektin vəziyyətini ekranda göstərən metodu gizlədə bildik.
Siniflər — proqramın mürəkkəbliyini idarə etməyin cavabıdır. Böyük proqram kiçik siniflərə bölündükdə daha sadə olur.
4. Mutable və Immutable obyektlər
Bir vaxtlar biz sizinlə Java-da konstantları öyrənmişdik və çox da ürək açan nəticəyə gəlməmişdik. Konstantlar dəyişənləri dəyişiklikdən mühafizə etməyə imkan verir, amma bu dəyişənlərin istinad etdiyi obyektləri dəyişiklikdən qoruya bilmir.
Bu problemə cavab olaraq Java-da konstant obyektləri fikirləşiblər. Yəni, immutable-obyektlər — dəyişməyən obyektlər.
Bu arada, siz artıq belə bir sinfi tanıyırsınız ki, onun obyektlərini dəyişmək mümkün deyil — String
. String
sinfinin obyekti yaradıldıqdan sonra daim dəyişməz qalır. Java tərtibatçıları bunu necə ediblər?
Birincisi, String
sinfinin bütün dəyişənləri gizlidir – private
elan olunublar.
İkincisi, String
sinfindən miras almaq mümkün deyil: bu sinifin elanında final
modifikatoru var.
Üçüncüsü və ən maraqlısı, String
sinfinin bütün metodları ki, mövcud obyektləri dəyişməli idilər, obyektləri dəyişmir, əvəzinə yeni obyekt qaytarırlar.
Məsələn, toUpperCase()
metodu sətirdəki bütün hərfləri böyük (baş hərflərə) çevirir. Amma bu metodu çağırılan obyekti dəyişmək əvəzinə, o yalnız baş hərflərdən ibarət olan yeni String
obyektini qaytarır:
String text = "Bu çox vacib bir mesajdır";
String message = text.toUpperCase();
Bu kod icra edildikdən sonra yaddaşda bu olacaq:
Beləliklə, sətirlərinizi hər hansı bir metoda cəsarətlə ötürün: heç kim onları dəyişməyəcək.
GO TO FULL VERSION