Salam! Bu gün Java-da dərslər haqqında danışacağıq. Dərslərin Java proqramlaşdırmasının əsasını təşkil etdiyini söyləmək olar. Bir proqramçı olduqda, əsas vəzifəniz fərqli funksionallıqla öz dərslərinizi yazmaq olacaq. Bu şeyin nə olduğunu və necə işlədiyini anlayaq :) Artıq bildiyiniz kimi, Java obyekt yönümlü proqramlaşdırma dilidir. Bütün proqramlar bir-biri ilə müəyyən şəkildə əlaqəli olan obyektlərdən ibarətdir. Sinif mahiyyətcə obyekt üçün şablondur. O, obyektin necə görünəcəyini və hansı funksiyaları yerinə yetirəcəyini müəyyən edir. Hər bir obyekt müəyyən bir sinfin obyektidir . Ən sadə misala baxaq:
public class Cat {
String name;
int age;
}
Tutaq ki, biz proqram yazırıq və bu proqramda bir şey üçün pişiklərə ehtiyacımız var (məsələn, onlayn görüş təyin etmək imkanı olan bir baytarlıq klinikamız var). Biz bir sinif yaratdıq Cat
və onun üçün iki dəyişən təyin etdik - sətir name
və nömrə age
. Belə sinif dəyişənlərinə sahələr deyilir . Əslində, bu, gələcəkdə yaradacağımız bütün pişiklər üçün bir şablondur. Hər bir pişiyin (sinif obyekti Cat
) iki dəyişəni olacaq - ad və yaş.
public class Cat {
String name;
int age;
public static void main(String[] args) {
Cat barsik = new Cat();
barsik.age = 3;
barsik.name = "Barsik";
System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
}
}
Bu necə işləyir! Biz bir pişik yaratdıq, ona ad və yaş verdik və hamısını konsola çıxardıq. Mürəkkəb bir şey yoxdur :) Dərslər ən çox ətraf aləmin obyekt və hadisələrini təsvir edir. Pişik, masa, adam, ildırım, kitab səhifəsi, çarx - bütün bunlar ayrı-ayrı siniflərdən istifadə edərək proqramınızda yaradılacaq. İndi isə sinifdə yaratdığımız dəyişənlərə nəzər salaq Cat
. Bunlara sahələr və ya nümunə dəyişənləri deyilir . Ad, əslində, onların bütün mahiyyətini açır. Sinfin hər bir nümunəsində (obyektində) bu dəyişənlər olacaq Cat
. name
Yaratdığımız hər bir pişiyin öz dəyişəni və özünəməxsusluğu olacaq age
. Ümumiyyətlə, məntiqlidir: real pişiklərlə hər şey eynidir :) Nümunə dəyişənlərinə əlavə olaraq başqaları da var - sinif dəyişənləri və ya statik olanlar. Nümunəmizə əlavə edək:
public class Cat {
String name;
int age;
static int count = 0;
public static void main(String[] args) {
Cat barsik = new Cat();
barsik.age = 3;
barsik.name = "Barsik";
count++;
Cat vasia = new Cat();
vasia.age = 5;
vasia.name = "Vasya";
count++;
System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);
System.out.println("Total number of cats = " + count);
}
}
Konsol çıxışı:
Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
İndi sinfimizdə yeni dəyişən var - count
(kəmiyyət). O, yaradılmış pişiklərin sayılmasına cavabdehdir. Hər dəfə əsas metodda pişik yaratdıqda bu dəyişəni 1 artırırıq. Bu dəyişən static açar sözü ilə təyin olunur . Bu o deməkdir ki, o , sinfin müəyyən bir obyektinə deyil, sinfə aiddir . Bu, əlbəttə ki, məntiqlidir: əgər hər bir pişiyin öz adı olmalıdırsa, deməli, hamı üçün bir pişik sayğacı lazımdır. Statik sözünün sizə nail olmağa imkan verdiyi məhz budur - count
bütün pişiklər üçün eyni dəyişən. Diqqət edin: biz onu konsola çap etdikdə, biz yazmırıq barsik.count
və ya vasia.count
. O, nə Barsikə, nə də Vasyaya aid deyil - o, bütün sinfə aiddir Cat
. Buna görə də sadədir count
. Siz də yaza bilərsiniz Cat.count
- bu da düzgün olacaq. Bu , konsola dəyişən çıxarmaqla name
işləməyəcək :
public class Cat {
String name;
int age;
static int count = 0;
public static void main(String[] args) {
Cat barsik = new Cat();
barsik.age = 3;
barsik.name = "Barsik";
count++;
System.out.println("We created a cat named" + name + ", his age - " + barsik.age);
System.out.println("Total number of cats = " + count);
}
}
Xəta! name
Hər pişiyin özünəməxsusluğu var. Kompilyatorun çaşdığı yer budur. "Adı konsola yazın? Kimin adıdır? :/"
Metodlar
Dəyişənlərə əlavə olaraq hər bir sinfin metodları var. Onlar haqqında ayrı bir mühazirədə daha ətraflı danışacağıq, lakin ümumi məqamlar olduqca sadədir. Metodlar sinifinizin funksionallığıdır; bu sinfin obyektləri nə edə bilər. Siz artıq üsullardan biri ilə tanışsınız - bumain()
. Ancaq metod main
, xatırladığınız kimi, statikdir - yəni bütün sinfə aiddir (məntiq dəyişənlərlə eynidir). Adi, statik olmayan metodları isə yalnız bizim yaratdığımız konkret obyektlər üzərində çağırmaq olar. Məsələn, bir pişik üçün bir sinif yazmaq istəyiriksə, proqramımızda pişiyin hansı funksiyalara sahib olması lazım olduğunu başa düşməliyik. Buna əsaslanaraq bunun üçün bir neçə üsul yazaq:
public class Cat {
String name;
int age;
public void sayMeow() {
System.out.println("Meow!");
}
public void jump() {
System.out.println("Jumping gallop!");
}
public static void main(String[] args) {
Cat barsik = new Cat();
barsik.age = 3;
barsik.name = "Barsik";
barsik.sayMeow();
barsik.jump();
}
}
Yaxşı, indi sinifimiz daha çox əsl pişiyin təsvirinə bənzəyir! İndi sadəcə adı və yaşı olan Barsik adlı pişiyimiz yoxdur. O, həmçinin miyavlayıb tullanmağı da bacarır! Belə “funksionallıq” olmayan hansı pişik var :) Biz konkret obyekti götürürük - , onun üsullarını və barsik
adlandırırıq . Konsola baxırıq: sayMeow()
jump()
Мяу!
Прыг-скок!
Əsl pişik! :)
Öz siniflərinizi yaratmaq. Abstraksiya
Gələcəkdə öz dərslərinizi yazmalı olacaqsınız. Onları yazarkən nələrə diqqət etməlisiniz? Əgər dəyişənlərdən danışırıqsa, abstraksiya deyilən bir şeydən istifadə etməlisiniz . Abstraksiya obyekt yönümlü proqramlaşdırmanın dörd əsas prinsipindən biridir. Bu, obyektin əsas, ən əhəmiyyətli xüsusiyyətlərini vurğulamağı və əksinə - ikinci dərəcəli, əhəmiyyətsiz olanları atmağı əhatə edir. Məsələn, biz şirkət işçilərinin faylını yaradırıq. İşçi obyektlərini yaratmaq üçün bir sinif yazdıqEmployee
. Şirkət faylında işçini təsvir etmək üçün hansı xüsusiyyətlər vacibdir? Tam adı, doğum tarixi, sosial sığorta nömrəsi, vergi identifikasiya nömrəsi. Ancaq çətin ki, şirkət işçisinin kartında onun boyu, göz və saç rənginə ehtiyacımız var. Şirkətin bu məlumatlara ehtiyacı yoxdur. Buna görə də, sinif üçün , , və , Employee
dəyişənlərini təyin edəcəyik və bizə lazımsız olan məlumatları (məsələn, göz rəngi) tərk edəcəyik və onu abstrakt edəcəyik . Ancaq bir model agentliyi üçün fotomodellər faylı yaratsaq, vəziyyət kəskin şəkildə dəyişir. Moda modelini təsvir etmək üçün boy, göz rəngi və saç rəngi bizim üçün çox vacibdir, lakin VÖEN nömrəsi bizim üçün qətiyyən vacib deyil. Buna görə də sinifdə , , dəyişənləri yaratmalıyıq . Abstraksiya belə işləyir, sadədir! :) String name
int age
int socialInsuranceNumber
int taxNumber
Model
int height
String hair
String eyes
Konstruktorlar
Gəlin pişik nümunəmizə qayıdaq.public class Cat {
String name;
int age;
public static void main(String[] args) {
Cat barsik = new Cat();
System.out.println("Something has been happening in the program for 2 hours...");
barsik.age = 3;
barsik.name = "Barsik";
}
}
Bu koda baxın və proqramımızda nəyin səhv olduğunu təxmin etməyə çalışın. İki saat ərzində proqramımızda adı və yaşı olmayan bir pişik var idi! Təbii ki, bu tamamilə yanlışdır. Baytarlıq klinikasının məlumat bazasında onlar haqqında məlumat olmayan pişiklər olmamalıdır. İndi bunu proqramçının öhdəsinə buraxırıq. Adını və yaşını qeyd etməyi unutmasa, hər şey yaxşı olacaq. Əgər unutsa, verilənlər bazasında bir səhv olacaq, naməlum pişiklər. Bu problemi necə həll edə bilərik? Adı və yaşı olmayan pişiklərin yaradılmasını bir şəkildə qadağan etmək lazımdır. Burada konstruktor funksiyaları köməyimizə gəlir . Budur bir nümunə:
public class Cat {
String name;
int age;
//constructor for class Cat
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Cat barsik = new Cat("Barsik", 5);
}
}
Konstruktor mahiyyətcə sinif obyektləri üçün şablondur. Bu halda, hər bir obyekt üçün cat
iki arqumentin göstərilməli olduğunu qeyd edirik - bir sətir və bir nömrə. İndi adsız bir pişik yaratmağa çalışsaq, uğur qazanmayacağıq.
public class Cat {
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Cat barsik = new Cat(); //error!
}
}
İndi sinifin konstruktoru olduğuna görə, Java kompilyatoru obyektlərin necə görünməli olduğunu bilir və orada göstərilən arqumentlər olmadan obyektlərin yaradılmasına icazə verməyəcək. this
İndi konstruktorda gördüyünüz açar sözə baxaq . Onunla da hər şey sadədir. "this" ingilis dilində "bu, bu" deməkdir. Yəni bu söz konkret obyekti göstərir. Konstruktorda kod
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
demək olar ki, hərfi tərcümə edilə bilər: " bu pişiyin adı (bizim yaradırıq) = konstruktorda göstərilən ad arqumenti. bu pişiyin yaşı (bizim yaradırıq) = konstruktorda göstərilən yaş arqumenti." Konstruktor işə düşdükdən sonra pişiyimizə bütün lazımi dəyərlərin verildiyini yoxlaya bilərsiniz:
public class Cat {
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Cat barsik = new Cat("Barsik", 5);
System.out.println(barsik.name);
System.out.println(barsik.age);
}
}
Konsol çıxışı:
Барсик
5
Konstruktor tamamlandıqda:
Cat barsik = new Cat("Barsik", 5);
Əslində içəridə aşağıdakılar baş verdi:
this.name = "Barsik";
this.age = 5;
Və obyektə barsik
(odur this
) konstruktor arqumentlərindən qiymətlər təyin edildi. Əslində, sinifdə konstruktorları təyin etməsəniz, o, yenə də konstruktoru işə salacaq ! Bəs bu necə mümkündür? O_O Fakt budur ki, Java-da bütün siniflər sözdə default konstruktora malikdir . Onun heç bir arqumenti yoxdur, lakin hər hansı bir sinfin hər hansı obyekti yaradılanda o, işə düşür.
public class Cat {
public static void main(String[] args) {
Cat barsik = new Cat(); //this is where the default constructor worked
}
}
İlk baxışdan bu nəzərə çarpmır. Yaxşı, biz bir obyekt yaratdıq və onu yaratdıq, dizaynerin işi haradadır? Bunu görmək üçün gəlin Cat
öz əlimizlə sinif üçün boş bir konstruktor yazaq və onun içərisində konsola bəzi ifadələr çıxaracağıq. Göstərilirsə, konstruktor işləmişdir.
public class Cat {
public Cat() {
System.out.println("Created a cat!");
}
public static void main(String[] args) {
Cat barsik = new Cat(); //this is where the default constructor worked
}
}
Konsol çıxışı:
Создали кота!
Budur təsdiq. Standart konstruktor həmişə siniflərinizdə görünməz şəkildə mövcuddur. Ancaq bunun daha bir xüsusiyyətini bilmək lazımdır. Arqumentlərlə bəzi konstruktor yaratdığınız zaman standart konstruktor sinifdən yox olur. Bunun sübutunu, əslində, yuxarıda gördük. Bu kodda:
public class Cat {
String name;
int age;
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Cat barsik = new Cat(); //error!
}
}
Cat
Biz ad və yaş olmadan pişik yarada bilmədik, çünki string + number üçün konstruktor təyin etdik . Defolt konstruktor bundan dərhal sonra sinifdən itdi. Buna görə də, yadda saxlamağınızdan əmin olun: sinifinizdə boş olan da daxil olmaqla bir neçə konstruktora ehtiyacınız varsa, onu ayrıca yaratmalısınız . Məsələn, baytarlıq klinikamız adlarını və yaşlarını bilmədiyimiz evsiz pişiklərə xeyirxah iş görmək, kömək etmək istəyir. Sonra kodumuz belə görünməlidir:
public class Cat {
String name;
int age;
//for domestic cats
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
//for street cats
public Cat() {
}
public static void main(String[] args) {
Cat barsik = new Cat("Barsik", 5);
Cat streetCat = new Cat();
}
}
İndi biz açıq şəkildə standart konstruktoru təyin etdik, biz hər iki pişik növünü yarada bilərik. Konstruktorda siz dəyərləri yalnız arqumentlərdən götürməklə kifayətlənməyərək, açıq şəkildə təyin edə bilərsiniz. Məsələn, biz bütün küçə pişiklərini verilənlər bazasında “Küçə pişiyi nömrəsi...” adı altında qeyd edə bilərik:
public class Cat {
String name;
int age;
static int count = 0;
public Cat() {
count++;
this.name = "Street cat number" + count;
}
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Cat streetCat1 = new Cat();
Cat streetCat2 = new Cat();
System.out.println(streetCat1.name);
System.out.println(streetCat2.name);
}
}
count
Bizdə küçə pişiyi sayğacı olan dəyişən var . Hər dəfə standart konstruktoru işə saldıqda onu 1 artırırıq və həmin nömrəni pişiyin adı kimi təyin edirik. Konstruktor üçün arqumentlərin sırası çox vacibdir. Konstruktorumuzda ad və yaş arqumentlərini dəyişdirək.
public class Cat {
String name;
int age;
public Cat(int age, String name) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Cat barsik = new Cat("Barsik", 10); //error!
}
}
Xəta! Konstruktor aydın şəkildə təsvir edir: obyekt yaradarkən ona nömrə və sətir bu ardıcıllıqlaCat
ötürülməlidir . Buna görə kodumuz işləmir. Bunu xatırladığınızdan və öz dərslərinizi yaradan zaman bunu nəzərə aldığınızdan əmin olun:
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Bunlar tamamilə fərqli iki dizaynerdir! İndi materialı birləşdirmək üçün bir neçə problemi həll edin :)
- Qədim Əsərlər Muzeyi.
Artifact
. Muzeydə saxlanılan eksponatlar üç növdür. Birincisi, muzey tərəfindən verilən seriya nömrəsindən başqa heç bir şey bilinmədiyi barədədir (məsələn: 212121). İkincisi, seriya nömrəsinin və onun yaradıldığı mədəniyyətin məlum olduğu (məsələn: 212121, "Azteklər"). Üçüncü növ, seriya nömrəsinin məlum olduğu, yaradıldığı mədəniyyət və onun yaradılmasının dəqiq yaşıdır (məsələn: 212121, “Aztecs”, 12). Artifact
Muzeydə saxlanılan qədim əşyaları təsvir edən sinif yaradın və onun üçün lazımi sayda konstruktor yazın. Metodda main()
hər növdən bir artefakt yaradın.
public class Artifact {
public static void main(String[] args) {
}
}
- Görüş saytı
User
Sahələri olan bir sinif dizayn edin - ad ( String
), yaş ( short
) və boy ( int
). Bunun üçün lazımi sayda konstruktor yaradın ki, ad, yaş və boy istənilən qaydada göstərilsin.
public class User {
String name;
short age;
int height;
public static void main(String[] args) {
}
}
GO TO FULL VERSION