1. Oprettelse af et objekt

Nå, vi er nået frem til at skabe objekter. Du har allerede stødt på dette før, men nu vil vi analysere dette emne mere detaljeret. Det er faktisk meget nemt at skabe objekter.

For at oprette et objekt skal du bruge den nye operator. Oprettelse af et objekt ser omtrent sådan ud:

new Class(arguments)

Efter at have oprettet et objekt, gemmer vi oftest straks en reference til det i en variabel, som meget ofte deler samme type som det oprettede objekt. Det betyder, at når du opretter et objekt, ser du normalt kode som denne:

Class name = new Class(arguments)

Hvor er oprettelsen af ​​en ny variabel, og koden til højre for lighedstegnet er oprettelsen af ​​et nyt objekt, hvis type er .Class nameClass

Eksempler:

Kode Bemærk
Object o = new Object();
Opret et Objectobjekt
Cat pet = new Cat();
Opret et Catobjekt
Scanner console = new Scanner(System.in)
Opret et Scannerobjekt

Programmører navngiver ofte variabler efter deres klasser, men med et lille bogstav. For en nybegynder programmør kan sådan kode være forvirrende:

Kode
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Der er intet galt med denne kode - dette er den mest almindelige kode, hvor en variabel oprettes og derefter straks initialiseres af et objekt af samme type.

Til venstre for lighedstegnet har vi oprettelsen af ​​en variabel. Til højre, skabelsen af ​​et objekt. Det er det.

2. Konstruktør

Du har sikkert set, at nogle argumenter ofte sendes, når du opretter et objekt. Hvad mere er, argumenter sendes for nogle objekter, men ikke andre. Hvordan fungerer hele denne mekanisme med argumenter?

Alt er også enkelt her: hver klasse har en speciel metode (eller metoder), der er ansvarlige for at håndtere argumenter, der sendes, når du opretter et objekt. Disse metoder kaldes konstruktører . Eller når vi kun taler om én: konstruktøren .

Det er let at skelne en konstruktørmetode fra en almindelig metode. Denne metode har to kendetegn:

  • navnet på en konstruktør er det samme som navnet på dens klasse (og starter med et stort bogstav)
  • en konstruktør har ingen returtype.

Generelt ser det sådan ud som regel:

modifiers Class(arguments)
{
   Code
}

Eksempel:

Kode Bemærk
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Pointklasse




Pointklasse konstruktør
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Opret et objekt af Pointklassen. Klassekonstruktøren vil blive kaldt.

Bemærk, hvordan konstruktøren ser ud: den har ingen returtype, og dens navn er det samme som klassenavnet.

Og en ting mere: Tag et kig på koden inde i konstruktøren. Konstruktørens parametre har samme navne som felterne i klassen: x og y. Det er standardpraksis at undgå at lave nye parameternavne. Navnene er de samme som på klassens felter. Navnekonflikten løses ved at bruge dette nøgleord.

3. Kald en konstruktør

Når du bruger den nye operator og en kommando som "ny klasse ( argumenter )" til at oprette et nyt objekt, sker der to ting:

  • Java-maskinen opretter et objekt, hvis type er Klasse
  • Java-maskinen kalder objektets konstruktør og sender dine argumenter

Som programmør kan du bestemme, hvilke konstruktører din klasse skal have, og hvilke parametre disse konstruktører skal have.

Antag, at du beslutter dig for at oprette en klasse for at holde styr på katte på et dyreinternat. Så Catkan din klasse se sådan ud:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Whiskers", 2);
Dette er tilladt
Cat cat = new Cat("Whiskers");
Men dette er ikke tilladt. Denne kode vil ikke kompilere.
Cat cat = new Cat();
Og dette er ikke tilladt. Denne kode vil ikke kompilere.

Klassen Cathar kun én konstruktør med navn og aldersparametre. Fordi der ikke er andre konstruktører, skal du videregive kattens navn ( name) og alder ( age) som argumenter, når du opretter et objekt. Det er ikke valgfrit at sende argumenter til konstruktøren .

4. Flere konstruktører

Men hvis du har brug for det, kan du tilføje flere konstruktører til klassen. Der er ingen begrænsning på antallet af konstruktører eller deres parametre. Når du opretter et objekt, vælger compileren automatisk den konstruktør, der matcher parametrene

Kode Bemærk
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
   public Cat(String name)
   {
      this.name = name;
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Dette er tilladt: den første konstruktør vil blive kaldt
Cat cat = new Cat("Whiskers");
Dette er tilladt: den anden konstruktør vil blive kaldt
Cat cat = new Cat();
Men dette er ikke tilladt. Denne kode vil ikke kompilere.

Vi besluttede at tage højde for det faktum, at en kats alder måske ikke kendes. For at håndtere denne sag tilføjede vi den særlige konstant UNKNOWNsammen med en konstruktør, der kun har én parameter - navnet på katten.

Bemærk, at vi stadig initialiserer begge variabler i begge konstruktører. Vi erstatter de ukendte/manglende parametre med konstanten UNKNOWN.

Hvis der ikke tildeles nogen værdi til aldersvariablen, vil den have standardværdien 0. En killing fundet på gaden kan trods alt godt være 0 hele år. Det betyder, at et nul i aldersvariablen ikke nødvendigvis betyder "ukendt alder".

5. Standard konstruktør

Hvis du ønsker, at dine objekter skal instantieres uden nogen parametre, skal din klasse erklære en no-argument constructor.

En konstruktør uden parametre er ikke nødvendigvis en konstruktør uden kode. En sådan konstruktør kan indeholde kode, der initialiserer variabler med startværdier:

Kode Bemærk
class Cat
{
   public static final int UNKNOWN = -1;
   public String name;
   public int age;

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

   public Cat()
   {
      this.name = "Nameless";
      this.age = UNKNOWN; // Unknown
   }
}
Cat cat = new Cat("Whiskers", 2);
Dette er tilladt: den første konstruktør vil blive kaldt
Cat cat = new Cat();
Dette er tilladt: den anden konstruktør vil blive kaldt

Standard konstruktør

Der er en meget vigtig pointe, som du bør kende og huske.

Hvis din klasse ikke erklærer én konstruktør , tilføjer compileren en standardkonstruktør, som er en konstruktør uden argumenter med den offentlige modifikator.

Men hvis din klasse erklærer blot én konstruktør , vil der ikke blive tilføjet nogen standardkonstruktør , og du bliver nødt til at tilføje den selv, hvis du ønsker det.

Kode Bemærk
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Dette er tilladt: standardkonstruktøren vil blive kaldt