JavaRush /Java блогы /Random-KK /Сабақтарға кіріспе: өз сыныптарын, конструкторларын жазу

Сабақтарға кіріспе: өз сыныптарын, конструкторларын жазу

Топта жарияланған
Сәлеметсіз бе! Бүгін біз Java тіліндегі сабақтар туралы сөйлесетін боламыз. Класстарды Java бағдарламалаудың өзегі деп айтуға болады. Сіз бағдарламашы болған кезде сіздің негізгі міндетіңіз әртүрлі функционалдығы бар жеке сабақтарыңызды жазу болады. Сабақтарға кіріспе: өз сыныптарын жазу, конструкторлар – 1Бұл не екенін және оның қалай жұмыс істейтінін анықтап көрейік :) Өздеріңіз білетіндей, Java - an objectіге бағытталған бағдарламалау тілі. Барлық бағдарламалар бір-бірімен қандай да бір түрде байланысқан an objectілерден тұрады. Класс негізінен нысан үшін үлгі болып табылады. Ол нысанның қалай көрінетінін және оның қандай функциялары болатынын анықтайды. Әрбір an object қандай да бір класстың an objectісі болып табылады . Ең қарапайым мысалды қарастырайық:
public class Cat {

    String name;
    int age;

}
Біз бағдарлама жазып жатырмыз делік және бұл бағдарламада бізге мысықтар бір нәрсе үшін қажет (мысалы, бізде онлайн қабылдау мүмкіндігі бар ветеринарлық клиника бар). Біз класс құрдық Catжәне ол үшін екі айнымалыны анықтадық - жол nameжәне сан age. Мұндай класс айнымалылары өрістер деп аталады . Негізінде, бұл біз болашақта жасайтын барлық мысықтарға арналған үлгі. Әрбір мысықтың (сынып нысаны 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. Бұл өрістер немесе айнымалы айнымалылар деп аталады . Атау, шын мәнінде, олардың бүкіл мәнін ашады. Сыныптың әрбір данасында (нысанында) осы айнымалылар болады 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();

    }
}
Енді біздің сынып нағыз мысықтың сипаттамасына көбірек ұқсайды! Қазір бізде тек аты мен жасы бар Барсик деген мысық жоқ. Ол мияулап, секіре алады! Мұндай «функционалдық» жоқ мысықтың түрі бар :) Біз белгілі бір нысанды аламыз - barsik, және оның әдістерін sayMeow()және деп атаймыз jump(). Біз консольге қараймыз:

Мяу!
Прыг-скок!
Нағыз мысық! :)

Өз сыныптарыңызды құру. Абстракция

Болашақта өз сабақтарыңызды жазуға тура келеді. Оларды жазғанда неге назар аудару керек? Егер айнымалылар туралы айтатын болсақ, абстракция деп аталатын нәрсені пайдалану керек . Абстракция an objectілі-бағытталған бағдарламалаудың төрт негізгі принциптерінің бірі болып табылады. Ол an objectінің негізгі, ең маңызды сипаттамаларын бөлектеуді және керісінше - қосалқы, елеусіздерді алып тастауды қамтиды. Мысалы, біз компания қызметкерлерінің файлын жасаймыз. Қызметкер нысандарын жасау үшін біз класс жаздық Employee. Компания файлында қызметкерді сипаттау үшін қандай сипаттамалар маңызды? Аты-жөні, туған күні, әлеуметтік сақтандыру нөмірі, салық сәйкестендіру нөмірі. Бірақ компания қызметкерінің картасында оның бойы, көз және шаш түсі қажет болуы екіталай. Компанияға бұл ақпарат қажет емес. Сондықтан, сынып үшін , , және , Employeeайнымалыларын орнатамыз және біз үшін қажет емес ақпараттан (мысалы, көздің түсі) бас тартып, оны абстракциялаймыз . Бірақ модельдік агенттік үшін фотомодельдер каталогын жасасақ, жағдай күрт өзгереді. Сән үлгісін сипаттау үшін біз үшін биіктік, көздің түсі және шаш түсі өте маңызды, бірақ біз үшін СТН нөмірі мүлдем маңызды емес. Сондықтан сыныпта , , айнымалыларын құруымыз керек . Абстракция осылай жұмыс істейді, бұл қарапайым! :) String nameint ageint socialInsuranceNumberint taxNumberModelint heightString hairString 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ілеріне арналған үлгі болып табылады. Бұл жағдайда біз әрбір нысан үшін 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 компиляторы нысандардың қандай болуы керектігін біледі және онда көрсетілген аргументтердісіз нысандарды жасауға рұқсат бермейді. thisЕнді конструктор ішінде көріп тұрған кілт сөзді қарастырайық . Онымен де бәрі қарапайым. «осы» ағылшын тілінен аударғанда «осы, мынау» дегенді білдіреді. Яғни, бұл сөз белгілі бір an objectіні білдіреді. Конструктордағы code
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);
Ішінде іс жүзінде мыналар болды:
this.name = "Barsik";
this.age = 5;
Ал нысанға barsik(ол this) конструктор аргументтерінен мәндер тағайындалды. Шын мәнінде, егер сіз сыныпта конструкторларды көрсетпесеңіз, ол әлі де конструкторды іске қосады ! Бірақ бұл қалай мүмкін? O_O Шынында, Java-да барлық сыныптарда әдепкі конструктор деп аталатын бар . Оның ешқандай дәлелдері жоқ, бірақ ол кез келген сыныптың кез келген нысаны жасалған сайын іске қосылады.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Бір қарағанда бұл байқалмайды. Ал, біз an object жасап, оны жасадық, дизайнердің жұмысы қайда? CatМұны көру үшін өз қолымызбен сыныпқа бос конструктор жазайық , оның ішінде біз консольге кейбір фразаны шығарамыз. Егер ол көрсетілсе, конструктор жұмыс істеді.
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жол + сан үшін конструкторды анықтадық. Әдепкі конструктор осыдан кейін бірден сыныптан жоғалып кетті. Сондықтан, есіңізде болсын: егер сізге сыныпта бірнеше конструктор қажет болса, оның ішінде бос болса, оны бөлек жасау керек . Мысалы, біздің ветеринарлық емхана аты-жөні мен жасы бізге беймәлім, қаңғыбас мысықтарға игі істер жасап, көмектескісі келеді. Сонда біздің code келесідей болуы керек:
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!
    }
}
Қате! Конструктор анық сипаттайды: нысанды жасау кезінде оған сан мен жолды сол ретпен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