JavaRush /Java блогу /Random-KY /Класстарга киришүү: өзүңүздүн класстарыңызды, конструктор...

Класстарга киришүү: өзүңүздүн класстарыңызды, конструкторлорду жазуу

Группада жарыяланган
Салам! Бүгүн биз Java тorндеги сабактар ​​жөнүндө сүйлөшөбүз. Класстарды Java программалоонун өзөгү деп айтууга болот. Программист болгондон кийин, сиздин негизги милдетиңиз ар кандай функциялар менен өзүңүздүн класстарыңызды жазуу болот. Класстарга киришүү: өз класстарын жазуу, конструкторлор - 1Келгиле, бул нерсе эмне экенин жана ал кантип иштээрин аныктап көрөлү :) Сиз билгендей, Java an objectиге багытталган программалоо тor. Бардык программалар кандайдыр бир түрдө бири-бири менен байланышкан an objectтерден турат. Класс негизинен an object үчүн шаблон болуп саналат. Ал an objectтин кандай болорун жана кандай функцияларды аткара турганын аныктайт. Ар бир an object кандайдыр бир класстын an objectиси болуп саналат . Эң жөнөкөй мисалды карап көрөлү:
public class Cat {

    String name;
    int age;

}
Келгиле, биз программа жазып жатабыз дейли, бул программада бизге мышыктар бир нерсе үчүн керек (мисалы, бизде онлайн дайындоо мүмкүнчүлүгү бар ветеринардык клиника бар). Биз класс түзүп 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. Бул логикалык, жалпысынан: чыныгы мышыктар менен баары бирдей :) Мисал өзгөрмөлөрдөн тышкары, башкалар бар - class variables , or statics. Биздин мисалга кошумчалайлы:
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 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илери үчүн шаблон болуп саналат. Бул учурда, биз ар бир an object үчүн catэки аргумент көрсөтүлүшү керек экенин белгилейбиз - сап жана сан. Эгерде биз азыр аты жок мышык жаратууга аракет кылсак, анда ийгorкке жете албайбыз.
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ти билдирет. Конструктордогу 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;
Ал эми 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
    }
}
Бир караганда бул байкалbyte. Ооба, биз 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
    }
}
Консолдук чыгаруу:

Создали кота!
Бул жерде тастыктоо болуп саналат. Демейки конструктор сиздин класстарыңызда дайыма көрүнбөй турат. Бирок анын дагы бир өзгөчөлүгүн билүү керек. Аргументтер менен конструктор түзгөндө демейки конструктор класстан жок болот. Мунун далor, чындыгында, биз жогоруда көрдүк. Бул 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!
    }
}
Ката! Конструктор так сүрөттөйт: an objectти түзүп жатканда, ага сан жана сап ошол тартиптеCat берorши керек . Ошондуктан биздин 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;
}
Бул эки башка дизайнерлер! Эми материалды бириктирүү үчүн бир нече маселелерди чечиңиз :)
  • Эскorктер музейи.
Сиздин милдетиңиз классты долбоорлоо 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