1. Objektum létrehozása

Nos, elérkeztünk az objektumok létrehozásához. Korábban már találkozott ezzel, de most részletesebben elemezzük ezt a témát. Valójában nagyon könnyű objektumokat létrehozni.

Objektum létrehozásához az új operátort kell használni. Egy objektum létrehozása körülbelül így néz ki:

new Class(arguments)

Egy objektum létrehozása után leggyakrabban azonnal elmentünk egy hivatkozást egy változóba, amely nagyon gyakran ugyanazt a típust használja, mint a létrehozott objektum. Ez azt jelenti, hogy egy objektum létrehozásakor általában a következő kódot látja:

Class name = new Class(arguments)

Hol van egy új változó létrehozása, és az egyenlőségjeltől jobbra lévő kód egy új objektum létrehozása, amelynek típusa .Class nameClass

Példák:

Kód jegyzet
Object o = new Object();
Hozzon létre egy Objectobjektumot
Cat pet = new Cat();
Hozzon létre egy Catobjektumot
Scanner console = new Scanner(System.in)
Hozzon létre egy Scannerobjektumot

A programozók gyakran az osztályaik után nevezik el a változókat, de kisbetűvel. Egy kezdő programozó számára ez a kód zavaró lehet:

Kód
BufferedReader bufferedReader = new BufferedReader( reader );
Cat cat = new Cat();
PersonInfo personInfo = new PersonInfo()

Ezzel a kóddal nincs semmi baj – ez a legáltalánosabb kód, amelyben létrejön egy változó, majd egy azonos típusú objektum azonnal inicializálja.

Az egyenlőségjeltől balra van egy változó létrehozása. Jobb oldalon egy tárgy létrehozása. Ez az.

2. Konstruktor

Valószínűleg látta, hogy bizonyos argumentumok gyakran átadásra kerülnek egy objektum létrehozásakor. Sőt, egyes objektumok mellett érveket adnak át, míg másokat nem. Hogyan működik ez az egész mechanizmus az érvekkel?

Itt is minden egyszerű: minden osztálynak van egy speciális metódusa (vagy metódusai), amelyek az objektum létrehozásakor átadott argumentumok kezeléséért felelősek. Ezeket a módszereket konstruktoroknak nevezzük . Vagy ha csak egyről beszélünk: a konstruktorról .

Könnyű megkülönböztetni a konstruktor metódust a hagyományostól. Ennek a módszernek két megkülönböztető jellemzője van:

  • a konstruktor neve megegyezik az osztály nevével (és nagybetűvel kezdődik)
  • a konstruktornak nincs visszatérési típusa.

Általában így néz ki:

modifiers Class(arguments)
{
   Code
}

Példa:

Kód jegyzet
public class Point
{
   public int x;
   public int y;

   Point(int x, int y)
   {
      this.x = x;
      this.y = y;
   }
}
Pointosztályú




Pointosztályépítő
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Hozzon létre egy objektumot az osztályból Point. Meg lesz hívva az osztálykonstruktor.

Figyeljük meg, hogyan néz ki a konstruktor: nincs visszatérési típusa, és a neve megegyezik az osztály nevével.

És még valami: nézd meg a kódot a konstruktor belsejében. A konstruktor paramétereinek neve megegyezik az osztály mezőivel: x és y. Általános gyakorlat, hogy kerüljük az új paraméternevek kidolgozását. A nevek megegyeznek az osztály mezőinek neveivel. A névütközés feloldása a kulcsszó használatával történik.

3. Konstruktor hívása

Ha az új operátort és egy parancsot, például "új osztály ( argumentumok )" használ egy új objektum létrehozásához, két dolog történik:

  • A Java gép létrehoz egy objektumot, amelynek típusa Class
  • A Java gép meghívja az objektum konstruktorát, és átadja az argumentumokat

Programozóként el kell döntenie, hogy milyen konstruktorokkal rendelkezzen az osztály, és milyen paraméterekkel rendelkezzenek ezek a konstruktorok.

Tegyük fel, hogy úgy dönt, hogy létrehoz egy osztályt a macskák nyomon követésére egy állatmenhelyen. Akkor az Catosztályod így nézhet ki:

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);
Ez megengedett
Cat cat = new Cat("Whiskers");
De ez nem megengedett Ez a kód nem fordítható le.
Cat cat = new Cat();
Ez pedig nem megengedett. Ez a kód nem fordítható le.

Az Catosztálynak csak egy konstruktora van név és életkor paraméterekkel. Mivel nincs más konstruktor, az objektum létrehozásakor argumentumként kell megadnia a macska nevét ( name) és életkorát ( ). ageAz argumentumok átadása a konstruktornak nem kötelező .

4. Több konstruktor

De ha szükséges, több konstruktort is hozzáadhat az osztályhoz. A konstruktorok száma vagy paraméterei nincsenek korlátozva. Objektum létrehozásakor a fordító automatikusan kiválasztja a paramétereknek megfelelő konstruktort

Kód jegyzet
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);
Ez megengedett: az első konstruktor meghívásra kerül
Cat cat = new Cat("Whiskers");
Ez megengedett: a második konstruktor meghívásra kerül
Cat cat = new Cat();
De ez nem megengedett Ez a kód nem fordítható le.

Úgy döntöttünk, hogy figyelembe vesszük azt a tényt, hogy egy macska életkora nem ismert. Ennek az esetnek a kezeléséhez hozzáadtuk a speciális állandót UNKNOWNegy konstruktorral együtt, amelynek egyetlen paramétere van - a macska neve.

Vegye figyelembe, hogy mindkét változót mindkét konstruktorban inicializáljuk. Az ismeretlen/hiányzó paramétereket a konstansra cseréljük UNKNOWN.

Ha nincs érték hozzárendelve az életkor változóhoz, akkor az alapértelmezett értéke 0 lesz. Végül is egy utcán talált cica 0 teljes éves lehet. Ez azt jelenti, hogy a nulla az életkor változóban nem feltétlenül jelenti az "ismeretlen életkort".

5. Alapértelmezett konstruktor

Ha azt szeretné, hogy az objektumok paraméterek nélkül példányosodjanak, az osztálynak deklarálnia kell egy argumentummentes konstruktort.

A paraméterek nélküli konstruktor nem feltétlenül konstruktor kód nélkül. Egy ilyen konstruktor tartalmazhat olyan kódot, amely inicializálja a változókat kezdőértékekkel:

Kód jegyzet
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);
Ez megengedett: az első konstruktor meghívásra kerül
Cat cat = new Cat();
Ez megengedett: a második konstruktor meghívásra kerül

Alapértelmezett konstruktor

Van egy nagyon fontos pont, amit tudnia kell és emlékeznie kell.

Ha az osztály nem egy konstruktort deklarál , a fordító hozzáad egy alapértelmezett konstruktort, amely egy argumentummentes konstruktor a nyilvános módosítóval.

De ha az osztály csak egy konstruktort deklarál , akkor nem lesz hozzáadva alapértelmezett konstruktor, és ha akarod, magadnak kell hozzáadnod.

Kód jegyzet
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Ez megengedett: az alapértelmezett konstruktor kerül meghívásra