JavaRush /Java blogi /Random-UZ /Sinflarga kirish: o'z sinflaringizni, konstruktorlaringiz...

Sinflarga kirish: o'z sinflaringizni, konstruktorlaringizni yozish

Guruhda nashr etilgan
Salom! Bugun biz Java tilidagi darslar haqida gaplashamiz. Sinflarni Java dasturlashning o'zagi deb aytish mumkin. Dasturchi bo'lganingizda, sizning asosiy vazifangiz o'z sinflaringizni turli funktsiyalar bilan yozish bo'ladi. Sinflarga kirish: o'z sinflaringizni yozish, konstruktorlar - 1Keling, bu narsa nima ekanligini va qanday ishlashini aniqlaymiz :) Siz allaqachon bilganingizdek, Java ob'ektga yo'naltirilgan dasturlash tilidir. Barcha dasturlar qandaydir tarzda bir-biri bilan bog'langan ob'ektlardan iborat. Sinf asosan ob'ekt uchun shablondir. Bu ob'ekt qanday ko'rinishini va qanday funktsiyalarga ega bo'lishini belgilaydi. Har bir ob'ekt ma'lum bir sinfning ob'ektidir . Keling, eng oddiy misolni ko'rib chiqaylik:
public class Cat {

    String name;
    int age;

}
Aytaylik, biz dastur yozyapmiz va bu dasturda bizga biror narsa uchun mushuklar kerak bo'ladi (masalan, bizda onlayn qabul qilish imkoniyatiga ega veterinariya klinikasi mavjud). Biz sinf yaratdik Catva u uchun ikkita o'zgaruvchini belgiladik - string nameva raqam age. Bunday sinf o'zgaruvchilari maydonlar deb ataladi . Aslida, bu biz kelajakda yaratadigan barcha mushuklar uchun shablondir. Har bir mushuk (sinf ob'ekti Cat) ikkita o'zgaruvchiga ega bo'ladi - ism va yosh.
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 shunday ishlaydi! Biz mushukni yaratdik, unga nom va yosh berdik va barchasini konsolga chiqardik. Hech narsa murakkab emas :) Sinflar ko'pincha atrofdagi dunyoning ob'ektlari va hodisalarini tasvirlaydi. Mushuk, stol, odam, chaqmoq, kitob sahifasi, g'ildirak - bularning barchasi alohida sinflar yordamida dasturingizda yaratiladi. Endi sinfda yaratgan o'zgaruvchilarni ko'rib chiqamiz Cat. Ular maydonlar yoki misol o'zgaruvchilari deb ataladi . Ism, aslida, ularning butun mohiyatini ochib beradi. Sinfning har bir namunasi (ob'ekti) ushbu o'zgaruvchilarga ega bo'ladi Cat. nameBiz yaratgan har bir mushuk o'z o'zgaruvchisiga va o'ziga xos bo'ladi age. Umuman olganda, mantiqiy: haqiqiy mushuklar bilan hamma narsa bir xil :) Misol o'zgaruvchilardan tashqari, boshqalar ham bor - sinf o'zgaruvchilari yoki statik. Keling, misolimizga qo'shamiz:
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 chiqishi:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
Endi bizning sinfimizda yangi o'zgaruvchi bor - count(miqdor). U yaratilgan mushuklarni hisoblash uchun javobgardir. Har safar asosiy usulda mushuk yaratganimizda, biz bu o'zgaruvchini 1 ga oshiramiz. Bu o'zgaruvchi static kalit so'zi bilan belgilanadi . Bu sinfning ma'lum bir ob'ektiga emas, balki sinfga tegishli ekanligini anglatadi . Bu, albatta, mantiqiy: agar har bir mushukning o'z nomi bo'lishi kerak bo'lsa, unda hamma uchun bitta mushuk hisoblagichi kerak. Statik so'zi aynan shu narsaga erishishga imkon beradi - countbarcha mushuklar uchun bir xil o'zgaruvchi. Iltimos, diqqat qiling: biz uni konsolga chop etganimizda, biz yozmaymiz barsik.countyoki vasia.count. U Barsikka ham, Vasyaga ham tegishli emas - u butun sinfga tegishli Cat. Shuning uchun, bu oddiy count. Siz ham yozishingiz mumkin Cat.count- bu ham to'g'ri bo'ladi. Bu konsolga o'zgaruvchini chiqarish bilan nameishlamaydi :
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);
    }
}
Xato! nameHar bir mushukning o'ziga xosligi bor. Bu erda kompilyator chalkashib ketadi. "Konsolga nomni chiqaring? Kimning ismi? :/"

Usullari

O'zgaruvchilardan tashqari, har bir sinfda usullar mavjud. Biz ular haqida alohida ma'ruzada batafsilroq gaplashamiz, ammo umumiy fikrlar juda oddiy. Usullar sinfingizning funksionalligidir; bu sinfning ob'ektlari nima qila oladi. Siz allaqachon usullardan biri bilan tanishsiz - bu main(). Ammo usul main, siz eslaganingizdek, statikdir - ya'ni u butun sinfga tegishli (mantiq o'zgaruvchilar bilan bir xil). Oddiy, statik bo'lmagan usullarni faqat biz yaratgan aniq ob'ektlarda chaqirish mumkin. Misol uchun, agar biz mushuk uchun sinf yozmoqchi bo'lsak, dasturimizda mushuk qanday funktsiyalarga ega bo'lishi kerakligini tushunishimiz kerak. Shunga asoslanib, keling, buning uchun bir nechta usullarni yozamiz:
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();

    }
}
Xo'sh, endi bizning sinfimiz haqiqiy mushukning tavsifiga o'xshaydi! Endi bizda faqat ismi va yoshi bilan Barsik ismli mushuk yo'q. U miyovlashi va sakrashi ham mumkin! Bunday "funktsionallik"siz qanday mushuk bor :) Biz ma'lum bir ob'ektni olamiz - barsikva uning usullarini sayMeow()va deb ataymiz jump(). Biz konsolga qaraymiz:

Мяу!
Прыг-скок!
Haqiqiy mushuk! :)

O'z sinflaringizni yaratish. Abstraktsiya

Kelajakda siz o'zingizning darslaringizni yozishingiz kerak bo'ladi. Ularni yozishda nimalarga e'tibor berish kerak? Agar biz o'zgaruvchilar haqida gapiradigan bo'lsak, siz abstraktsiya deb ataladigan narsadan foydalanishingiz kerak . Abstraktsiya ob'ektga yo'naltirilgan dasturlashning to'rtta asosiy tamoyillaridan biridir. Bu ob'ektning asosiy, eng muhim xususiyatlarini ajratib ko'rsatishni o'z ichiga oladi va aksincha - ikkinchi darajali, ahamiyatsiz bo'lganlarni yo'q qilish. Masalan, biz kompaniya xodimlarining faylini yaratmoqdamiz. Xodimlar ob'ektlarini yaratish uchun biz sinf yozdik Employee. Xodimni kompaniya faylida tavsiflash uchun qanday xususiyatlar muhim? To'liq ism, tug'ilgan sana, ijtimoiy sug'urta raqami, soliq identifikatsiya raqami. Ammo kompaniya xodimining kartasida uning bo'yi, ko'zlari va soch rangi kerak bo'lishi dargumon. Kompaniyaga bu ma'lumotlar kerak emas. Shuning uchun sinf uchun biz , , va , Employeeo'zgaruvchilarni o'rnatamiz va biz uchun keraksiz ma'lumotlardan (masalan, ko'z rangi) voz kechamiz va ularni mavhumlashtiramiz . Ammo modellashtirish agentligi uchun fotomodellar faylini yaratadigan bo'lsak, vaziyat keskin o'zgaradi. Moda modelini tasvirlash uchun biz uchun balandlik, ko'z rangi va soch rangi juda muhim, ammo TIN raqami biz uchun mutlaqo muhim emas. Shuning uchun sinfda , , o'zgaruvchilarni yaratishimiz kerak . Abstraksiya shunday ishlaydi, bu oddiy! :) String nameint ageint socialInsuranceNumberint taxNumberModelint heightString hairString eyes

Konstruktorlar

Keling, mushuk misolimizga qaytaylik.
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";

    }
}
Ushbu kodni ko'rib chiqing va dasturimizda nima noto'g'ri ekanligini taxmin qilishga harakat qiling. Ikki soat davomida bizning dasturimizda ismi va yoshi bo'lmagan mushuk bor edi! Albatta, bu mutlaqo noto'g'ri. Veterinariya klinikasining ma'lumotlar bazasida ular haqida ma'lumotga ega bo'lmagan mushuklar bo'lmasligi kerak. Endi biz buni dasturchiga qoldiramiz. Agar u ismini va yoshini ko'rsatishni unutmasa, hamma narsa yaxshi bo'ladi. Agar u unutib qo'ysa, ma'lumotlar bazasida xato bo'ladi, noma'lum mushuklar. Bu muammoni qanday hal qilishimiz mumkin? Ismi va yoshi bo'lmagan mushuklarni yaratishni qandaydir tarzda taqiqlash kerak. Bu erda konstruktor funktsiyalari yordamimizga keladi . Mana bir misol:
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 mohiyatan sinf ob'ektlari uchun shablondir. Bunday holda, biz har bir ob'ekt uchun catikkita argument ko'rsatilishi kerakligini aniqlaymiz - satr va raqam. Agar biz hozir ismsiz mushuk yaratishga harakat qilsak, muvaffaqiyatga erisha olmaymiz.
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!
    }
}
Endi sinfda konstruktor mavjud bo'lsa, Java kompilyatori ob'ektlar qanday ko'rinishini biladi va unda ko'rsatilgan argumentlarsiz ob'ektlarni yaratishga ruxsat bermaydi. thisEndi konstruktor ichida ko'rgan kalit so'zni ko'rib chiqamiz . U bilan ham hamma narsa oddiy. “This” ingliz tilida “bu, bu” degan ma’noni anglatadi. Ya'ni, bu so'z muayyan ob'ektni bildiradi. Konstruktorda kod
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
deyarli so'zma-so'z tarjima qilish mumkin: " bu mushukning nomi (biz yaratayotganimiz) = konstruktorda ko'rsatilgan nom argumenti. bu mushukning yoshi (biz yaratayotganimiz) = konstruktorda ko'rsatilgan yosh argumenti." Konstruktor yonib ketgandan so'ng, siz bizning mushukimizga barcha kerakli qiymatlar berilganligini tekshirishingiz mumkin:
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 chiqishi:

Барсик
5
Konstruktor bajarganida:
Cat barsik = new Cat("Barsik", 5);
Ichkarida quyidagilar sodir bo'ldi:
this.name = "Barsik";
this.age = 5;
Va ob'ektga barsik(bu this) konstruktor argumentlaridan qiymatlar berildi. Darhaqiqat, agar siz sinfda konstruktorlarni ko'rsatmasangiz, u baribir konstruktorni ishga tushiradi ! Lekin bu qanday mumkin? O_O Gap shundaki, Java-da barcha sinflar standart konstruktor deb ataladi . Unda hech qanday argument yo'q, lekin har qanday sinfning istalgan ob'ekti yaratilganda u ishga tushadi.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Bir qarashda bu sezilmaydi. Xo'sh, biz ob'ektni yaratdik va uni yaratdik, dizaynerning ishi qayerda? Buni ko'rish uchun keling, sinf uchun o'z qo'llarimiz bilan bo'sh konstruktor yozamiz Catva uning ichida biz konsolga bir nechta iborani chiqaramiz. Agar u ko'rsatilsa, demak konstruktor ishlagan.
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 chiqishi:

Создали кота!
Mana tasdiq. Standart konstruktor har doim sizning sinflaringizda ko'rinmas holda mavjud. Ammo siz uning yana bir xususiyatini bilishingiz kerak. Argumentlar bilan ba'zi konstruktor yaratganingizda standart konstruktor sinfdan yo'qoladi. Buning isboti, aslida, biz yuqorida ko'rdik. Mana 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!
    }
}
Biz ism va yoshsiz mushukni yarata olmadik, chunki biz Catstring + raqam uchun konstruktorni aniqladik. Standart konstruktor shundan so'ng darhol sinfdan g'oyib bo'ldi. Shuning uchun, esda tuting: agar sizning sinfingizda bir nechta konstruktorlar kerak bo'lsa, shu jumladan bo'sh bo'lsa, uni alohida yaratishingiz kerak . Masalan, bizning veterinariya klinikamiz nomlari va yoshi bizga noma’lum bo‘lgan uysiz mushuklarga xayrli ishlar qilib, yordam bermoqchi. Keyin bizning kodimiz quyidagicha ko'rinishi kerak:
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();
    }
}
Endi biz standart konstruktorni aniq belgilab oldik, biz mushuklarning ikkala turini ham yaratishimiz mumkin. Konstruktorda siz qiymatlarni argumentlardan olibgina qolmay, aniq belgilashingiz mumkin. Misol uchun, biz barcha ko'cha mushuklarini ma'lumotlar bazasida "Ko'cha mushukining raqami..." nomi bilan yozib olishimiz mumkin:
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);
    }
}
countBizda ko'cha mushuklari hisoblagichi bo'lgan o'zgaruvchi mavjud . Har safar standart konstruktorni ishga tushirganimizda, biz uni 1 ga oshiramiz va bu raqamni mushuk nomi sifatida belgilaymiz. Konstruktor uchun argumentlar tartibi juda muhim. Keling, konstruktorimizdagi ism va yosh argumentlarini almashtiramiz.
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!
    }
}
Xato! Konstruktor aniq ta'riflaydi: ob'ektni yaratishda unga raqam va qatorni shu tartibdaCat o'tkazish kerak . Shuning uchun bizning kodimiz ishlamaydi. Buni unutmang va o'z sinflaringizni yaratishda buni yodda tuting:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Bu ikkita butunlay boshqa dizaynerlar! Endi materialni birlashtirish uchun bir nechta muammolarni hal qiling :)
  • Antik buyumlar muzeyi.
Sizning vazifangiz sinfni loyihalashdir Artifact. Muzeyda saqlanayotgan ashyolar uch xil. Birinchisi, muzey tomonidan berilgan seriya raqamidan boshqa hech narsa ma'lum emas (masalan: 212121). Ikkinchisi, seriya raqami va uning yaratilgan madaniyati ma'lum (masalan: 212121, "Azteklar"). Uchinchi tur - seriya raqami ma'lum bo'lgan, u yaratilgan madaniyat va uni yaratishning aniq yoshi (masalan: 212121, "Azteklar", 12). ArtifactMuzeyda saqlanayotgan qadimiy buyumlarni tavsiflovchi sinf yarating va unga kerakli konstruktorlar sonini yozing. Usulda har main()bir turdagi bitta artefakt yarating.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • Tanishuv sayti
Siz tanishuv sayti uchun foydalanuvchi ma'lumotlar bazasini yaratyapsiz. Ammo muammo shundaki, siz ularni qanday tartibda ko'rsatish kerakligini unutdingiz va sizning qo'lingizda texnik xususiyatlar yo'q. UserMaydonlarga ega bo'lgan sinfni loyihalashtiring - nom ( String), yosh ( short) va balandlik ( int). Ism, yosh va balandlik istalgan tartibda ko'rsatilishi uchun u uchun kerakli miqdordagi konstruktorlarni yarating.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION