CodeGym /Java блог /Случаен /Java Classes: писане на собствени класове, конструктори
John Squirrels
Ниво
San Francisco

Java Classes: писане на собствени класове, конструктори

Публикувано в групата
здрасти Днес ще говорим за класове в Java. Може да се каже, че класовете формират крайъгълния камък на програмирането на Java. Когато станете програмист, почти цялата ви работа ще бъде писането на ваши собствени класове, които имат различни функции. Нека да видим Howво означава това и How работи. :) Както знаете, Java е обектно-ориентиран език за програмиране. Всички програми се състоят от обекти, които по един or друг начин са свързани помежду си. Класът е по същество шаблон за обект. Той определя How ще изглежда обектът и Howви функции ще има. Всеки обект е обект от няHowъв клас. Помислете за този много прост пример:

public class Cat {

    String name;
    int age;

}
Да кажем, че пишем програма, която включва котки по няHowва причина (например имаме ветеринарна клиника, която предлага достъп до онлайн акаунт). Създадохме клас Cat и декларирахме две променливи в него: String name и int age . Тези членски променливи се наричат ​​полета. По същество това е шаблон за всички котки, които ще създадем в бъдеще. Всеки обект Cat ще има две променливи: име и възраст.

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
    }

}
Ето How работи! Ние създаваме котка, даваме й име и възраст и я показваме на конзолата. Парче торта. :) Най-често часовете описват неща и явления от реалния свят. Котка, маса, човек, мълния, page от книга, колело - ще създадете всички тези неща във вашите програми, като използвате отделни класове. Засега нека се съсредоточим върху променливите, които декларирахме в класа Cat . Те се наричат ​​полета or променливи на екземпляр. Името им наистина казва всичко. Всеки екземпляр (or обект) на класа Cat ще има тези променливи. Всяка котка, която създаваме, ще има собствена променлива за име и собствена възрастпроменлива. Това има смисъл - в общи линии така е с истинските котки. :) В допълнение към инстанционните променливи има и класови променливи (статични променливи). Нека завършим нашия пример:

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        Cat fluffy = new Cat();
        fluffy.age = 5;
        fluffy.name = "Fluffy";
        count++;

        System.out.println("We created a cat named " + smudge.name + ". His age is " + smudge.age);
        System.out.println("We created a cat named " + fluffy.name + ". His age is " + fluffy.age);

        System.out.println("Total number of cats = " + count);
    }
}
Изход от конзолата: Създадохме котка на име Smudge. Възрастта му е 3. Създадохме котка на име Пухкаво. Неговата възраст е 5 Общ брой котки = 2 Сега нашият клас има нова променлива, наречена count. Той отговаря за преброяването на създадените котки. Всеки път, когато създаваме котка в основнияметод, ние увеличаваме тази променлива с 1. Тази променлива се декларира с помощта на ключовата дума static. Това означава, че принадлежи към класа, а не към конкретен обект от класа. Което, разбира се, има смисъл: името на всяка котка принадлежи на тази конкретна котка, но имаме нужда от един брояч на котки, който да се отнася за всички тях. Точно това постига ключовата дума static: тя прави променливата count една променлива за всички котки. Забележка: когато показваме променливата, не използваме smudge.count or fluffy.count. Не принадлежи нито на Smudge, нито на Fluffy; той принадлежи към целия клас Cat . Ето защо просто се брои. Можете също да напишете Cat.count. Това също би било правилно. Когато показваме променливата име, не бихме направor следното:

public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";
        count++;

        System.out.println("We created a cat named " + name + ". His age is " + smudge.age);

        System.out.println("Total number of cats = " + count);
    }
}
Това е грешка! Всяка котка има свое име. Компилаторът се обърква тук. "Изведете име на конзолата? Чие име?" :/"

Методи

В допълнение към променливите, всеки клас има методи. Ще говорим за тях по-подробно в отделен урок, но общите принципи са доста прости. Методите определят функционалността на вашия клас, т.е. Howво могат да правят обектите от вашия клас. Вече сте запознати с един от тези методи: методът main() . Но, Howто може би си спомняте, основният метод е статичен, което означава, че принадлежи на целия клас (логиката е същата като при променливите). Въпреки това, стандартните, нестатични методи могат да бъдат извикани само на конкретни обекти, които сме създали. Например, ако искаме да напишем клас котка, трябва да знаем Howви функции трябва да има котката в нашата програма. Въз основа на тази предпоставка, нека напишем няколко метода за нашата котка:

public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Pounce!");
    }

    public static void main(String[] args) {
        Cat smudge = new Cat();
        smudge.age = 3;
        smudge.name = "Smudge";

        smudge.sayMeow();
        smudge.jump();

    }
}
Виж това! Сега нашият клас е много по-близо до това да прorча на котка! Сега нямаме само котка с име („Smudge“) и възраст (3). Той също може да каже мяу и да скочи! Каква котка би била без тази „функционалност“? :) Взимаме конкретен обект (размазване) и извикваме неговите методи sayMeow() и jump() . Да погледнем конзолата: Мяу! Нахвърляй се! Истинска котка! :)

Създаване на собствени класове. Абстракция

В бъдеще ще трябва да пишете свои собствени класове. За Howво трябва да внимавате, когато ги пишете? Ако говорим за променливи, тогава ще трябва да използвате нещо, наречено абстракция. Абстракцията е един от четирите основни принципа на обектно-ориентираното програмиране. Това означава извличане на най-важните и значими характеристики на даден елемент и обратното, отхвърляне на тези, които са незначителни or незначителни. Например, нека създадем шкаф за documentи за служителите на компанията. За да създадем обекти за служители, ние написахме Employeeклас. Какви характеристики са важни дескриптори на един служител за картотеката на нашата компания? Име, дата на раждане, SSN и ID на служител. Но е малко вероятно да имаме нужда от височината, цвета на очите or цвета на косата на служителя за досието на служителите на компанията. Компаниите не се нуждаят от тази информация. И така, в класа Employee ние декларираме следните променливи: String name , int age , int socialSecurityNumber и int employeeId. И пропускаме ненужната информация (като цвета на очите). С други думи, създаваме абстракция. Ако обаче правим картотека за агенции за модели, ситуацията се променя драстично. Височината, цветът на очите и косата на модела са важни характеристики, но нейният SSN е абсолютно без meaning за нас. И така, в класа Model трябва да създадем следните променливи: String height , String hair , String eyes . Ето How работи абстракцията – лесно е! :)

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

Да се ​​върнем към нашия пример с котка.

public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat smudge = new Cat();

        System.out.println("Here the program does something for 2 hours...");

        smudge.age = 3;
        smudge.name = "Smudge";

    }
}
Разгледайте този code и се опитайте да разберете Howво не е наред с нашата програма. Нашата програма имаше котка без име or възраст за 2 часа! Разбира се, това по своята същност е грешно. Базата данни на ветеринарната клиника не трябва да включва котки без информация. В момента нашата котка е оставена на милостта на програмиста. Вярваме, че няма да забрави да посочи име и възраст и всичко ще бъде наред. Ако забрави, базата данни ще има проблем: неназовани котки. Как можем да решим този проблем? Трябва по няHowъв начин да предотвратим създаването на котки без име и възраст. Тук на помощ идват конструкторите. Да дадем пример:

public class Cat {

    String name;
    int age;

    // Constructor for the Cat class
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat smudge = new Cat("Smudge", 5);
    }
}
По същество конструкторът е шаблон за обекти от клас. В този случай ние посочваме, че два аргумента, String и int , трябва да бъдат посочени за всеки обект 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 smudge = new Cat(); // Error!
    }
}
Сега, когато класът има конструктор, компилаторът на Java знае How трябва да изглеждат обектите и не позволява да се създават обекти, без да са посочени аргументите. Сега нека проучим ключовата дума this, която виждате в конструктора. Също така е просто. Ключовата дума this е за указване на определен обект. Кодът в конструктора

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 smudge = new Cat("Smudge", 5);
        System.out.println(smudge.name);
        System.out.println(smudge.age);
    }
}
Конзолен изход: Smudge 5 Когато конструкторът беше извикан:

Cat smudge = new Cat("Smudge", 5);
Ето Howво всъщност се случи вътрешно:

this.name = "Smudge";
this.age = 5;
И стойностите на аргументите, предадени на конструктора, бяха присвоени на smudge обекта (това се отнася в този случай). Всъщност, дори и да не декларирате ниHowви конструктори в клас, той пак ще извика конструктор! Но How е възможно това? О_О Защото всички Java класове имат така наречения конструктор по подразбиране. Не приема ниHowви аргументи, но се извиква всеки път, когато създавате обект от произволен клас.

public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
На пръв поглед това може да не е очевидно. Създадохме обект, Howво от това? Къде конструкторът прави нещо тук? За да го видите, нека изрично напишем празен конструктор за класа Cat . Вътре, ще изведем няHowва фраза към конзолата. Ако фразата е показана, тогава конструкторът е бил извикан.

public class Cat {

    public Cat() {
        System.out.println("A cat has been created!");
    }

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Изход от конзолата: Създадена е котка! Ето потвърждението. Конструкторът по подразбиране винаги присъства невидимо във вашите класове. Но трябва да знаете още нещо за това. Конструкторът по подразбиране се елиминира от клас, след като създадете конструктор с аргументи. Всъщност вече видяхме доказателство за това по-горе. Беше в този 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 smudge = new Cat(); // Error!
    }
}
Не можахме да създадем Cat без име и възраст, защото декларирахме конструктор Cat с параметри string и int. Това накара конструктора по подразбиране незабавно да изчезне от класа. Така че не забравяйте да запомните, че ако имате нужда от няколко конструктора във вашия клас, включително конструктор без аргументи, ще трябва да го декларирате отделно. Нашата клиника иска да направи добри дела и да помогне на бездомни котенца, чиито имена и възраст са неизвестни. Тогава нашият code трябва да изглежда така:

public class Cat {

    String name;
    int age;

    // For cats with owners
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // For street cats
    public Cat() {
    }

    public static void main(String[] args) {
        
        Cat smudge = new Cat("Smudge", 5);
        Cat streetCat = new Cat();
    }
}
Сега, след като сме посочor изричен конструктор по подразбиране, можем да създадем и двата типа котки. В конструктора можете директно да задавате стойности. Не е нужно винаги да ги взимате от аргументи. Например, можем да маркираме всички улични котки в базата данни, като използваме „No. на уличната котка <брой>“ като шаблон. :

public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat No. " + 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);
    }
}
Имаме променлива за броене , която брои нашите улични котки. Всеки път, когато се изпълнява конструкторът по подразбиране, ние увеличаваме броя с 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 smudge = new Cat("Smudge", 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;
}
Това са два напълно различни конструктора! Сега изпълнете няколко задачи, за да затвърдите разбирането си на материала. :)
  1. Музей на антиките.

    Вашата задача е да проектирате клас артефакт .
    В музея се съхраняват три вида артефакти.
    Не знаем нищо за първия тип, освен серийния номер, даден от музея (например: 212121).
    За втория тип знаем серийния номер и културата, която го е създала (например: 212121, „Ацтеките“).
    За третия тип знаем серийния номер, културата, която го е създала, и века, в който е създаден (например: 212121, „Ацтеките“, 12).

    Създайте клас Artifact , който описва антиките, съхранявани в музея, и напишете необходимия набор от конструктори за класа. След това в метода main() създайте по един артефакт от всеки вид.

    
    public class Artifact {
        
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
    
  2. Уебсайт за запознанства

    Нека създадем потребителска база данни за уебсайт за запознанства.
    Но ето го проблемът: забравor сте необходимия ред на аргументите и няма налична техническа documentация.
    Проектирайте потребителски клас, който ще има следните полета: име ( String ), възраст ( short ) и височина ( int ).
    Създайте подходящия брой конструктори, така че името, възрастта и височината да могат да бъдат посочени в произволен ред.

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
    
За да затвърдите наученото, ви предлагаме да гледате видео урок от нашия курс по Java
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION