CodeGym /Java blog /Tilfældig /Java-klasser: skrivning af dine egne klasser, konstruktør...
John Squirrels
Niveau
San Francisco

Java-klasser: skrivning af dine egne klasser, konstruktører

Udgivet i gruppen
Hej! I dag vil vi tale om klasser i Java. Man kan sige, at klasser udgør hjørnestenen i Java-programmering. Når du bliver programmør, vil næsten hele dit job være at skrive dine egne klasser, der har forskellige funktioner. Lad os se, hvad det betyder, og hvordan det virker. :) Java er som bekendt et objektorienteret programmeringssprog. Alle programmer består af objekter, der på den ene eller anden måde er relateret til hinanden. En klasse er i bund og grund en skabelon for et objekt. Det bestemmer, hvordan objektet vil se ud, og hvilke funktioner det vil have. Hvert objekt er et objekt af en eller anden klasse. Overvej dette meget enkle eksempel:

public class Cat {

    String name;
    int age;

}
Lad os sige, at vi skriver et program, der involverer katte af en eller anden grund (for eksempel har vi en veterinærklinik, der tilbyder adgang til en onlinekonto). Vi har oprettet en Cat- klasse og erklæret to variable i den: String name og int age . Disse medlemsvariable kaldes felter. I det væsentlige er dette en skabelon for alle de katte, vi vil skabe i fremtiden. Hvert Cat- objekt vil have to variabler: et navn og en alder.

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);
    }

}
Sådan fungerer det! Vi skaber en kat, giver den et navn og en alder og viser det hele på konsollen. Et stykke kage. :) Oftere end ikke beskriver undervisningen ting og fænomener i den virkelige verden. En kat, et bord, en person, et lyn, en side i en bog, et hjul – du vil skabe alle disse ting i dine programmer ved hjælp af individuelle klasser. Lad os indtil videre fokusere på de variabler, vi erklærede i Cat- klassen. De kaldes felter eller instansvariabler. Deres navn siger virkelig det hele. Hver forekomst (eller objekt) af Cat -klassen vil have disse variable. Hver kat, vi skaber, vil have sin egen navnevariabel og sin egen aldervariabel. Dette giver mening - det er dybest set, hvordan det er med rigtige katte. :) Ud over instansvariabler er der også klassevariabler (statiske variable). Lad os afslutte vores eksempel:

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);
    }
}
Konsoloutput: Vi oprettede en kat ved navn Smudge. Hans alder er 3. Vi skabte en kat ved navn Fluffy. Hans alder er 5 Total antal katte = 2 Nu har vores klasse fået en ny variabel kaldet count. Den er ansvarlig for at tælle de skabte katte. Hver gang vi skaber en kat i hovedsagenmetode øger vi denne variabel med 1. Denne variabel erklæres ved hjælp af nøgleordet static. Det betyder, at den tilhører klassen, ikke til et specifikt objekt i klassen. Hvilket selvfølgelig giver mening: hver kats navn tilhører den specifikke kat, men vi har brug for én kattetæller, der gælder for dem alle. Det er præcis, hvad nøgleordet static opnår: det gør tællevariablen til en enkelt variabel for alle kattene. Bemærk: Når vi viser variablen, bruger vi ikke smudge.count eller fluffy.count. Den tilhører hverken Smudge eller Fluffy; den tilhører hele Katteklassen . Derfor er det simpelthen tælle. Du kunne også skrive Cat.count. Det ville også være korrekt. Når vi viser navnevariablen, ville vi ikke gøre følgende:

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);
    }
}
Dette er en fejl! Hver kat har sit eget navn. Oversætteren bliver forvirret her. "Skriv et navn til konsollen? Hvems navn?" :/"

Metoder

Ud over variabler har hver klasse metoder. Vi vil tale om dem mere detaljeret i en separat lektion, men de generelle principper er ret enkle. Metoder definerer din klasses funktionalitet, dvs. hvad objekter i din klasse kan gøre. Du er allerede bekendt med en af ​​disse metoder: main() metoden. Men som du måske husker, er hovedmetoden statisk, hvilket betyder, at den tilhører hele klassen (logikken er den samme som med variabler). Standard, ikke-statiske metoder kan dog kun kaldes på specifikke objekter, vi har oprettet. Hvis vi for eksempel vil skrive en katteklasse, skal vi vide, hvilke funktioner en kat i vores program skal have. På den forudsætning, lad os skrive et par metoder til vores kat:

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();

    }
}
Tjek det ud! Nu er vores klasse meget tættere på at ligne en kat! Nu har vi ikke kun en kat med et navn ("Smudge") og en alder (3). Han kan også sige mjav og hoppe! Hvilken slags kat ville det være uden den "funktionalitet"? :) Vi tager et bestemt objekt (smudge) og kalder dets sayMeow() og jump() metoder. Lad os se på konsollen: Mjau! Kast! En rigtig kat! :)

Opret dine egne klasser. Abstraktion

I fremtiden skal du skrive dine egne klasser. Hvad skal du være opmærksom på, når du skriver dem? Hvis vi taler om variable, så bliver du nødt til at gøre brug af noget, der hedder abstraktion. Abstraktion er et af de fire grundlæggende principper for objektorienteret programmering. Det betyder at udtrække de vigtigste og væsentligste egenskaber ved en vare, og omvendt at tilsidesætte dem, der er mindre eller ubetydelige. Lad os for eksempel skabe et arkivskab til virksomhedens ansatte. For at oprette medarbejderobjekter har vi skrevet en medarbejderklasse. Hvilke egenskaber er vigtige beskrivelser af en medarbejder til vores virksomheds arkivskab? Navn, fødselsdato, SSN og medarbejder-id. Men det er usandsynligt, at vi får brug for medarbejderens højde, øjenfarve eller hårfarve til virksomhedens medarbejderrekord. Virksomheder har ikke brug for disse oplysninger. Så i Employee- klassen erklærer vi følgende variabler: String name , int age , int socialSecurityNumber og int employeeId. Og vi udelader unødvendig information (som øjenfarve). Vi skaber med andre ord en abstraktion. Men hvis vi laver et arkivskab til modelbureauer, ændrer situationen sig dramatisk. En models højde, øjenfarve og hårfarve er vigtige egenskaber, men hendes SSN er absolut irrelevant for os. Så i Model- klassen skal vi oprette følgende variabler: String height , String hair , String eyes . Sådan fungerer abstraktion - det er nemt! :)

Konstruktører

Lad os gå tilbage til vores katteeksempel.

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";

    }
}
Se over denne kode og prøv at finde ud af, hvad der er galt med vores program. Vores program havde en kat uden navn eller alder i 2 timer! Selvfølgelig er dette i sagens natur forkert. Dyrlægeklinikkens database bør ikke indeholde katte uden information. I øjeblikket er vores kat prisgivet programmøren. Vi stoler på, at han ikke glemmer at angive navn og alder, og at alt vil være i orden. Hvis han glemmer det, vil databasen have et problem: unavngivne katte. Hvordan kan vi løse dette problem? Vi skal på en eller anden måde forhindre, at katte bliver skabt uden navn og alder. Det er her konstruktører kommer til undsætning. Lad os give et eksempel:

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);
    }
}
Grundlæggende er en konstruktør en skabelon for objekter i en klasse. I dette tilfælde angiver vi, at der skal angives to argumenter, en String og en int , for hvert katteobjekt . Hvis vi prøver at skabe en navnløs kat nu, vil det ikke virke.

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!
    }
}
Nu hvor klassen har en konstruktør, ved Java-kompileren, hvordan objekterne skal se ud, og tillader ikke, at objekter oprettes uden at angive argumenterne. Lad os nu undersøge søgeordet dette, som du ser inde i konstruktøren. Det er også enkelt. Nøgleordet dette er for at angive et bestemt objekt. Koden i konstruktøren

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
kan tolkes næsten ordret: "Navnet på denne kat (den vi opretter) = argumentet indgivet for konstruktørens navneparameter. Alderen på denne kat (den vi opretter) = argumentet sendt til konstruktørens aldersparameter." Når konstruktøren er kørt, kan du bekræfte, at alle de nødvendige værdier er blevet tildelt vores kat:

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);
    }
}
Konsoloutput: Smudge 5 Da konstruktøren blev kaldt:

Cat smudge = new Cat("Smudge", 5);
Dette er, hvad der faktisk skete internt:

this.name = "Smudge";
this.age = 5;
Og værdierne af argumenterne, der blev sendt til konstruktøren, blev tildelt til smudge- objektet (det er det, det refererer til i dette tilfælde). Faktisk, selvom du ikke erklærer nogen konstruktører i en klasse, vil den stadig kalde en konstruktør! Men hvordan er det muligt? О_О Fordi alle Java-klasser har en såkaldt standardkonstruktør. Det kræver ingen argumenter, men det kaldes hver gang du opretter et objekt af en klasse.

public class Cat {

    public static void main(String[] args) {

        Cat smudge = new Cat(); // The default constructor is invoked here
    }
}
Ved første øjekast er dette måske ikke indlysende. Vi skabte et objekt, hvad så? Hvor laver konstruktøren noget her? For at se det, lad os udtrykkeligt skrive en tom konstruktør til Cat- klassen. Indeni vil vi udsende en sætning til konsollen. Hvis sætningen vises, blev konstruktøren påkaldt.

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
    }
}
Konsoludgang: En kat er blevet oprettet! Der er bekræftelsen. Standardkonstruktøren er altid usynligt til stede i dine klasser. Men du skal vide en ting mere om det. Standardkonstruktøren fjernes fra en klasse, når du opretter en konstruktør med argumenter. Faktisk har vi allerede set bevis for dette ovenfor. Det stod i denne kode:

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!
    }
}
Vi kunne ikke oprette en kat uden navn og alder, fordi vi erklærede en Cat- konstruktør med streng- og int-parametre. Dette fik standardkonstruktøren til straks at forsvinde fra klassen. Så husk, at hvis du har brug for flere konstruktører i din klasse, inklusive en konstruktør uden argumenter, skal du angive det separat. Vores klinik ønsker at gøre gode gerninger og hjælpe hjemløse killinger, hvis navne og alder er ukendte. Så skulle vores kode se sådan ud:

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();
    }
}
Nu hvor vi har angivet en eksplicit standardkonstruktør, kan vi oprette begge typer katte. I konstruktøren kan du tildele værdier direkte. Du behøver ikke altid at tage dem fra argumenter. For eksempel kunne vi mærke alle gadekatte i databasen ved at bruge "Gadekat nr. <antal>" som skabelon. :

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);
    }
}
Vi har en tællevariabel , som tæller vores gadekatte. Hver gang standardkonstruktøren udføres, øger vi antallet med 1 og knytter dette tal til kattens navn. Argumenternes rækkefølge er meget vigtig for konstruktører. Lad os bytte navne- og aldersargumenterne, der er sendt til vores konstruktør.

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!
    }
}
Vi har en fejl! Konstruktøren angiver klart, at når et Cat- objekt oprettes, skal det sendes et tal og en streng i denne rækkefølge. Så vores kode virker ikke. Sørg for at huske og respektere denne regel, når du angiver dine egne klasser:

public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Det er to helt forskellige konstruktører! Udfør nu et par opgaver for at styrke din forståelse af materialet. :)
  1. Antikmuseet.

    Din opgave er at designe en artefakt- klasse.
    Der er tre typer artefakter opbevaret på museet.
    Vi ved intet om den første type undtagen serienummeret tildelt af museet (for eksempel: 212121).
    For den anden type kender vi serienummeret og den kultur, der skabte det (for eksempel: 212121, "aztekerne").
    For den tredje type kender vi serienummeret, den kultur, der skabte den, og det århundrede, den blev skabt i (for eksempel: 212121, "Aztecs", 12).

    Opret en artefakt- klasse, der beskriver de antikviteter, der opbevares på museet, og skriv det nødvendige sæt konstruktører til klassen. Derefter, i main()- metoden, skal du oprette en artefakt af hver art.

    
    public class Artifact {
        
        // Write your code here
    
        public static void main(String[] args) {
            // Write your code here
        }
    }
    
  2. Dating hjemmeside

    Lad os oprette en brugerdatabase til et datingwebsted.
    Men her er problemet: du glemte den påkrævede rækkefølge af argumenterne, og der er ingen teknisk dokumentation tilgængelig.
    Design en brugerklasse , som vil have følgende felter: navn ( streng ), alder ( kort ) og højde ( int ).
    Opret det passende antal konstruktører, så navn, alder og højde kan angives i vilkårlig rækkefølge.

    
    public class User {
    
        String name;
        short age;
        int height;
    
        // Write your code here
    
        public static void main(String[] args) {
            
        }
    }
    
For at styrke det, du har lært, foreslår vi, at du ser en videolektion fra vores Java-kursus
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION