JavaRush /Блоги Java /Random-TG /Муқаддима ба дарсҳо: навиштани синфҳои худ, конструкторҳо...

Муқаддима ба дарсҳо: навиштани синфҳои худ, конструкторҳо

Дар гурӯҳ нашр шудааст
Салом! Имрӯз мо дар бораи дарсҳо дар Java сӯҳбат хоҳем кард. Метавон гуфт, ки синфҳо асоси барномасозии Java мебошанд. Вақте ки шумо барномасоз мешавед, вазифаи асосии шумо навиштани синфҳои шахсии худро бо функсияҳои гуногун хоҳад буд. Муқаддима ба дарсҳо: навиштани синфҳои худ, конструкторҳо - 1Биёед бифаҳмем, ки ин чиз чист ва он чӣ гуна кор мекунад :) Тавре ки шумо аллакай медонед, Java забони барномасозии ба an object нигаронидашуда мебошад. Хамаи программахо аз an objectхое иборатанд, ки бо хамдигар бо ягон рох алокаманданд. Синф аслан як қолаби an object аст. Он муайян мекунад, ки an object чӣ гуна хоҳад буд ва он чӣ гуна вазифаҳоро иҷро хоҳад кард. Ҳар як an object an objectи ягон синф аст . Биёед соддатарин мисолро дида бароем:
public class Cat {

    String name;
    int age;

}
Фарз мекунем, ки мо барнома менависем ва дар ин барнома ба мо гурбаҳо барои чизе лозиманд (масалан, мо як клиникаи byteорӣ дорем, ки имкони таъини онлайн таъин карданро дорад). Мо синф эҷод кардем Catва барои он ду тағирёбанда - сатр nameва рақамро муайян кардем age. Чунин тағирёбандаҳои синфӣ майдонҳо номида мешаванд . Аслан, ин як қолаб барои ҳамаи гурбаҳоест, ки мо дар оянда эҷод мекунем. Ҳар як гурба (an objectи синф Cat) дорои ду тағирёбанда аст - ном ва синну сол.
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);
    }

}
Ҳамин тавр кор мекунад! Мо гурба офаридем, ба он ном ва синну сол додем ва ҳамаашро ба консол баромадем. Ҳеҷ чиз мураккаб нест :) Дарсҳо бештар an objectҳо ва падидаҳои ҷаҳони атрофро тавсиф мекунанд. Гурба, миз, одам, барқ, саҳифаи китоб, чарх - ҳамаи инҳо дар барномаи шумо бо истифода аз синфҳои алоҳида сохта мешаванд. Акнун биёед ба тағирёбандаҳое, ки мо дар синф сохтаем, бубинем Cat. Инҳо майдонҳо ё тағирёбандаҳои мисол номида мешаванд . Ном, дар асл, тамоми моҳияти онҳоро ошкор мекунад. Ҳар як мисоли (an object) синф ин тағирёбандаҳоро дорад Cat. nameҲар як гурбае, ки мо эҷод мекунем, тағирёбанда ва худро дорад age. Умуман, ин мантиқист: бо гурбаҳои воқеӣ ҳама чиз якхела аст :) Ба ғайр аз тағирёбандаҳои мисол, дигарҳо ҳастанд - тағирёбандаҳои синфӣ ё статикӣ. Биёед ба мисоли худ илова кунем:
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);
    }
}
Натиҷаи консол:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
Ҳоло мо дар синфи худ як тағирёбандаи нав дорем - count(микдор). Вай барои ҳисоб кардани гурбаҳои офаридашуда масъул аст. Ҳар дафъае, ки мо гурбаро дар усули асосӣ эҷод мекунем, мо ин тағирёбандаро то 1 афзоиш медиҳем. Ин тағирёбанда бо калимаи калидии static таъин карда мешавад . Ин маънои онро дорад, ки он ба синф тааллуқ дорад , на ба an objectи мушаххаси синф. Ин, албатта, мантиқист: агар ҳар як гурба бояд номи худро дошта бошад, пас мо барои ҳама як ҳисобкунаки гурба лозим аст. Ин маҳз ҳамон чизест, ки калимаи статикӣ ба шумо имкон медиҳад, ки ба даст оред - countяк тағирёбанда барои ҳама гурбаҳо. Лутфан таваҷҷӯҳ намоед: вақте ки мо онро ба консол чоп мекунем, мо наменависем barsik.countё vasia.count. Вай на ба Барсик тааллуқ дорад ва на ба Вася - вай ба тамоми синф тааллуқ дорад Cat. Аз ин рӯ, он оддӣ аст count. Шумо инчунин метавонед нависед Cat.count- ин ҳам дуруст хоҳад буд. Ин бо баровардани тағирёбанда ба консол nameкор намекунад :
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);
    }
}
Хатогӣ! nameҲар як гурба худро дорад. Дар ин ҷо компилятор ошуфта мешавад. "Номро ба консол бароред? Номи кист? :/"

Усулҳо

Илова ба тағирёбандаҳо, ҳар як синф усулҳо дорад. Мо дар бораи онҳо дар як лексияи алоҳида муфассалтар сӯҳбат хоҳем кард, аммо нуктаҳои умумӣ хеле соддаанд. Усулҳо вазифаи синфи шумо мебошанд; an objectҳои ин синф чӣ кор карда метавонанд. Шумо аллакай бо яке аз усулҳо шинос ҳастед - ин аст main(). Аммо усул main, тавре ки шумо дар ёд доред, статикӣ аст - яъне он ба тамоми синф тааллуқ дорад (мантиқ ҳамон тавре ки бо тағирёбандаҳо аст). Ва усулҳои муқаррарии ғайристатикиро танҳо дар an objectҳои мушаххасе, ки мо офаридаем, даъват кардан мумкин аст. Масалан, агар мо хоҳем, ки барои гурба синф нависем, мо бояд фаҳмем, ки гурба бояд дар барномаи мо чӣ вазифаҳоро дошта бошад. Дар асоси ин, биёед якчанд усулҳои онро нависем:
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();

    }
}
Хуб, ҳоло синфи мо бештар ба тавсифи як гурбаи воқеӣ монанд аст! Ҳоло мо на танҳо як гурба бо номи Барсик бо ном ва синну сол дорем. Ӯ инчунин метавонад мияав ва ҷаҳад! Чӣ гуна гурба бе чунин «функционалӣ» вуҷуд дорад :) Мо як an objectи мушаххасро мегирем - barsikва усулҳои онро sayMeow()ва jump(). Мо ба консол назар мекунем:

Мяу!
Прыг-скок!
Гурбаи ҳақиқӣ! :)

Эҷоди синфҳои худ. Абстраксия

Дар оянда шумо бояд дарсҳои худро нависед. Ҳангоми навиштани онҳо ба чӣ диққат додан лозим аст? Агар мо дар бораи тағирёбандаҳо сухан ронем, шумо бояд чизеро истифода баред, ки абстраксия ном дорад . Абстраксия яке аз чор принсипҳои асосии барномасозии ба an object нигаронидашуда мебошад. Он нишон додани хусусиятҳои асосӣ ва муҳимтарини an objectро дар бар мегирад ва баръакс - партофтани хусусиятҳои дуюмдараҷа ва ночиз. Масалан, мо файли кормандони ширкатро эҷод мекунем. Барои сохтани an objectҳои кормандон, мо синф навиштем Employee. Кадом хусусиятҳо барои тавсифи корманд дар файли ширкат муҳиманд? Номи пурра, санаи таваллуд, рақами амнияти иҷтимоӣ, рақами мушаххаси андоз. Аммо аз эҳтимол дур нест, ки ба мо қад, чашм ва ранги мӯйи ӯ дар корти корманди ширкат ниёз дошта бошад. Ширкат ба ин маълумот ниёз надорад. Аз ин рӯ, барои синф Employeeмо тағирёбандаҳои String name, int age, int socialInsuranceNumberва int taxNumber, -ро муқаррар мекунем ва иттилооти барои мо нолозимро (ба монанди ранги чашм) тарк карда, онро абстракт мекунем . Аммо агар мо барои агентии моделсозӣ файли фотомоделҳоро эҷод кунем, вазъият ба таври куллӣ тағйир меёбад. Барои тавсифи модели мӯд, қад, ранги чашм ва ранги мӯй барои мо хеле муҳим аст, аммо рақами ТИН барои мо комилан муҳим нест. Аз ин рӯ, дар синф Modelмо бояд тағирёбандаҳои int height, String hair, ро созем String eyes. Абстраксия ҳамин тавр кор мекунад, ин оддӣ аст! :)

Конструкторон

Биёед ба мисоли гурбаамон баргардем.
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";

    }
}
Ба ин code нигаред ва кӯшиш кунед, ки дар барномаи мо чӣ хатогӣ вуҷуд дорад. Ду соат дар барномаи мо як гурба бе ном ва синну сол буд! Албатта, ин тамоман нодуруст аст. Дар базаи клиникаи ветеринарй ягон гурба набояд бошад, ки дар бораи онхо маълумот надошта бошад. Акнун мо онро ба барномасоз вогузорем. Агар ӯ нишон додани ном ва синну солашро фаромӯш накунад, ҳамааш хуб мешавад. Агар вай фаромӯш кунад, дар базаи маълумот хатогӣ пайдо мешавад, гурбаҳои номаълум. Мо ин мушкилотро чӣ гуна ҳал карда метавонем? Зарур аст, ки гӯё эҷоди гурбаҳоро бидуни ном ва синну сол манъ кард. Дар ин ҷо функсияҳои созанда ба кӯмаки мо меоянд . Инак як мисол:
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);
    }
}
Конструктор аслан як қолаби an objectҳои синф мебошад. Дар ин ҳолат, мо муайян мекунем, ки барои ҳар як an object catбояд ду аргумент муайян карда шавад - сатр ва рақам. Агар мо ҳоло кӯшиш кунем, ки гурбаи беном эҷод кунем, мо муваффақ намешавем.
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!
    }
}
Акнун, ки синф конструктор дорад, компилятори Java медонад, ки an objectҳо бояд чӣ гуна бошанд ва имкон намедиҳад, ки an objectҳо бе далелҳои дар он нишондодашуда сохта шаванд. thisАкнун биёед калимаи калидиро , ки шумо дар дохor конструктор мебинед, бубинем . Бо ӯ ҳам ҳама чиз оддӣ аст. "ин" дар забони англисӣ маънои "ин, ин" аст. Яъне ин калима an objectи мушаххасро нишон медиҳад. Код дар конструктор
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
метавон қариб айнан тарҷума кард: " ном барои ин гурба (ки мо онро эҷод мекунем) = далели ном , ки дар созанда нишон дода шудааст. синну соли ин гурба (ки мо онро эҷод мекунем) = далели синну соле , ки дар созанда нишон дода шудааст." Пас аз оташсӯзии созанда, шумо метавонед тафтиш кунед, ки ба гурбаи мо ҳама арзишҳои зарурӣ дода шудааст:
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);
    }
}
Натиҷаи консол:

Барсик
5
Вақте ки конструктор анҷом дод:
Cat barsik = new Cat("Barsik", 5);
Воқеан дар дохor он воқеаҳои зерин рух доданд:
this.name = "Barsik";
this.age = 5;
Ва an object barsik(он аст this) аз аргументҳои созанда арзишҳо таъин карда шуданд. Дарвоқеъ, агар шумо конструкторҳоро дар синф муайян накунед, он то ҳол конструкторро аз кор мебарорад ! Аммо ин чӣ гуна имконпазир аст? O_O Гап дар он аст, ки дар Java ҳама синфҳо конструктори пешфарз ном доранд . Он ягон далел надорад, аммо ҳар вақте ки ягон an objectи ягон синф сохта мешавад, оташ мезанад.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Дар назари аввал ин ба назар намоён нест. Хуб, мо an object офаридем ва онро офаридаем, кори дизайнер куҷост? Барои дидани ин, биёед Catбо дасти худ конструктори холӣ барои синф нависем ва дар дохor он мо як ибораро ба консол мебарорем. Агар он нишон дода шавад, пас конструктор кор кардааст.
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
    }
}
Натиҷаи консол:

Создали кота!
Дар ин ҷо тасдиқ аст. Созандаи пешфарз ҳамеша дар синфҳои шумо ноаён мавҷуд аст. Аммо шумо бояд боз як хусусияти онро донед. Вақте ки шумо конструкторро бо аргументҳо эҷод мекунед, созандаи пешфарз аз синф нопадид мешавад. Далели ин, дар хакикат, мо дар боло дидем. Дар ин code:
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: string + рақам муайян кардем. Созандаи пешфарз дарҳол пас аз ин аз синф нопадид шуд. Аз ин рӯ, ҳатман дар хотир доред: агар ба шумо дар синфи худ якчанд конструктор лозим бошад, аз ҷумла як конструктори холӣ, шумо бояд онро алоҳида эҷод кунед . Масалан, ветеринарии мо ба гурбахои бехонумон, ки ном ва синну солашонро намедонем, кори хайр карда, ёрй расондан мехохад. Пас рамзи мо бояд чунин бошад:
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();
    }
}
Акнун, ки мо конструктори пешфарзро ба таври возеҳ муайян кардем, мо метавонем ҳарду намуди гурбаҳоро эҷод кунем. Дар конструктор шумо метавонед арзишҳоро ба таври возеҳ таъин кунед, на танҳо онҳоро аз аргументҳо гиред. Масалан, мо метавонем ҳамаи гурбаҳои кӯчаро дар пойгоҳи додаҳо бо номи "Рақами гурбаҳои кӯча ..." сабт кунем:
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, ки ҳисобкунаки гурбаҳои кӯча аст. Ҳар дафъае, ки мо конструктори пешфарзро иҷро мекунем, мо онро ба 1 зиёд мекунем ва ин рақамро ҳамчун номи гурба таъин мекунем. Барои конструктор тартиби далелҳо хеле муҳим аст. Биёед далелҳои ном ва синну солро дар созандаи худ иваз кунем.
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!
    }
}
Хатогӣ! Конструктор ба таври возеҳ тавсиф мекунад: ҳангоми сохтани an object, Catон бояд рақам ва сатрро бо ин тартиб гузаронад . Барои ҳамин codeи мо кор намекунад. Боварӣ ҳосил кунед, ки инро дар хотир доред ва ҳангоми сохтани синфҳои худ инро дар хотир доред:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Ин ду тарроҳони комилан гуногунанд! Ҳоло барои муттаҳид кардани мавод чанд масъаларо ҳал кунед :)
  • Осорхонаи бостонӣ.
Вазифаи шумо тарҳрезии синф аст Artifact. Осори дар осорхона нигоҳ дошташуда се намуд аст. Якум ин аст, ки дар бораи он чизе маълум нест, ба ҷуз рақами силсилавии аз ҷониби осорхона таъиншуда (масалан: 212121). Дуюм ин аст, ки рақами силсилавӣ ва фарҳанге, ки тавассути он сохта шудааст, маълум аст (масалан: 212121, "Ацтекҳо"). Навъи сеюм ин аст, ки дар бораи он рақами силсилавӣ маълум аст, фарҳанге, ки тавассути он офарида шудааст ва синну соли дақиқи офаридани он (масалан: 212121, "Ацтекҳо", 12). Синферо созед Artifact, ки осори қадимии дар осорхона нигоҳ дошташударо тавсиф мекунад ва барои он миқдори зарурии конструкторҳоро нависед. Дар усул main(), як артефактро аз ҳар як намуд эҷод кунед.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • Вебсайти вохӯрӣ
Шумо барои сайти шиносоӣ базаи корбар эҷод мекунед. Аммо мушкилот дар он аст, ки шумо фаромӯш кардаед, ки онҳо бо кадом тартиб бояд муайян карда шаванд ва шумо мушаххасоти техникиро дар даст надоред. Тарҳрезии синфе User, ки дорои майдонҳо бошад - ном ( String), синну сол ( short) ва баландӣ ( int). Барои он шумораи зарурии конструкторҳоро эҷод кунед, то ки ном, синну сол ва қад бо ҳама гуна тартиб муайян карда шавад.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION