1. Utwórz obiekt

Tutaj dochodzimy do tworzenia obiektów. Spotkałeś się już z tym wcześniej, ale teraz przeanalizujemy ten temat bardziej szczegółowo. W rzeczywistości bardzo łatwo jest tworzyć obiekty.

Aby utworzyć obiekt, musisz użyć operatora new . Tworzenie obiektu wygląda następująco:

new Класс(параметры)

Najczęściej zaraz po utworzeniu obiektu zapisujemy odniesienie do niego w zmiennej, która również bardzo często ma ten sam typ co tworzony obiekt. Dlatego zwykle widzisz kod tworzenia obiektów w następujący sposób:

Класс Nazwa = new Класс(параметры)

Gdzie jest tworzenie nowej zmiennej, a kod po prawej stronie znaku równości to tworzenie nowego obiektu typu .Класс NazwaКласс

Przykłady:

Kod Notatka
Object o = new Object();
Tworzenie obiektu typuObject
Cat pet = new Cat();
Tworzenie obiektu typuCat
Scanner console = new Scanner(System.in)
Tworzenie obiektu typuScanner

Bardzo często programiści nazywają zmienne tymi samymi nazwami co klasy, tylko małymi literami. Dla początkującego programisty ten kod może być mylący:

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

W rzeczywistości nie ma nic strasznego w tym kodzie - jest to najczęstszy kod, w którym tworzona jest zmienna i natychmiast inicjowana obiektem własnego typu.

Na lewo od znaku równości znajduje się tworzenie zmiennej. Po prawej stronie jest tworzenie obiektu. Wszystko.

2. Konstruktor

Prawdopodobnie często widziałeś, że podczas tworzenia obiektu przekazywane są do niego pewne parametry. Ponadto parametry są przekazywane do niektórych obiektów, a do innych nie. Jak ogólnie działa ten cały mechanizm z parametrami?

Tutaj również wszystko jest proste: każda klasa ma specjalną metodę (lub metody), które są odpowiedzialne za przetwarzanie parametrów podczas tworzenia obiektu. Takie metody nazywane są konstruktorami . A jedną z metod jest odpowiednio konstruktor .

Łatwo jest odróżnić metodę konstruktora od normalnej metody w kodzie. Ta metoda ma dwie cechy:

  • nazwa metody konstruktora jest taka sama jak nazwa jej klasy (i zaczyna się wielką literą)
  • Metoda konstruktora nie ma zwracanego typu.

Jego ogólna postać jest zwykle taka:

модификаторы Класс(параметры)
{
   kod
}

Przykład:

Kod Notatka
public class Point
{
   public int x;
   public int y;

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




Klasa Konstruktor klasyPoint
public class Solution
{
   public static void main(String[] args)
   {
      Point point = new Point(5, 10);
   }
}




Tworząc obiekt klasy Point, zostanie wywołany konstruktor klasy.

Zwróć uwagę, jak wygląda metoda konstruktora: nie ma typu wyniku, a jej nazwa jest taka sama jak nazwa-klasy.

I jeszcze jedno: spójrz na kod wewnątrz konstruktora. Zmienne parametrów konstruktora mają takie same nazwy jak pola klasy - x, y. Standardową praktyką jest nie wymyślanie nazw zmiennych. Te same nazwy są traktowane jako pola klasy, a konflikt nazw jest rozwiązywany za pomocą słowa kluczowego this.

3. Wywołanie konstruktora

Kiedy tworzysz nowy obiekt z operatorem new i poleceniem takim jak „new Class ( parametry )”, dzieją się dwie rzeczy:

  • Maszyna Java tworzy obiekt typu Class
  • Maszyna Java wywołuje konstruktor obiektu i przekazuje tam twoje parametry .

Jako programista decydujesz, jakie konstruktory powinna mieć twoja klasa i jakie parametry powinny mieć te konstruktory.

Załóżmy, że postanawiasz utworzyć klasę do śledzenia kotów w schronisku dla zwierząt. Wtedy twoja klasa Catmoże wyglądać tak:

class Cat
{
   public String name;
   public int age;

   public Cat(String name, int age)
   {
      this.name = name;
      this.age = age;
   }
}
Cat cat = new Cat("Васька", 2);
Jest to więc możliwe
Cat cat = new Cat("Васька");
I tak - to niemożliwe. Kod się nie skompiluje.
Cat cat = new Cat();
I tak jest to niemożliwe. Kod się nie skompiluje.

Klasa ma Cattylko jednego konstruktora z parametrami nazwa i wiek. Ponieważ namenie ma innych konstruktorów, musisz podać imię ( ) i wiek ( ) kota jako parametry podczas tworzenia obiektu age. Nie możesz przekazać parametrów do konstruktora.

4. Wiele konstruktorów

Jeśli jednak zajdzie taka potrzeba, możesz dodać do klasy wiele konstruktorów. Nie ma ograniczeń co do liczby konstruktorów ani ich parametrów. Podczas tworzenia obiektu kompilator sam dobierze odpowiedni konstruktor dla parametrów.

Kod Notatka
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; // неизвестно
   }
}
Cat cat = new Cat("Васька", 2);
Więc możesz: zostanie wywołany pierwszy konstruktor
Cat cat = new Cat("Васька");
Jest więc możliwe: zostanie wywołany drugi konstruktor
Cat cat = new Cat();
I tak - to niemożliwe. Kod się nie skompiluje.

Postanowiliśmy wziąć pod uwagę sytuację, że wiek kota może być nieznany. W tym przypadku dodaliśmy do kodu specjalną stałą - UNKNOWNi konstruktora, który przyjmuje tylko jeden parametr - nazwę kota.

Zauważ, że nadal inicjujemy obie zmienne klasy wewnątrz obu konstruktorów. Zastępujemy nieznane/brakujące parametry stałą UNKNOWN.

Jeśli do zmiennej wieku nie zostanie przypisana żadna wartość, zostanie zachowana wartość domyślna == 0. Ale kociak znaleziony na ulicy może równie dobrze mieć 0 pełnych lat. Dlatego zero w zmiennej wieku niekoniecznie oznacza „nieznany wiek”.

5. Konstruktor domyślny

Jeśli chcesz, aby obiekty klasy były tworzone bez żadnych parametrów, musisz zadeklarować konstruktor bez parametrów dla swojej klasy.

Konstruktor bez parametrów niekoniecznie jest konstruktorem bez kodu, może równie dobrze zawierać kod inicjujący zmienne klasy z wartościami początkowymi:

Kod Notatka
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 = "Безымянный";
      this.age = UNKNOWN; // неизвестно
   }
}
Cat cat = new Cat("Васька", 2);
Więc możesz: zostanie wywołany pierwszy konstruktor
Cat cat = new Cat();
Jest więc możliwe: zostanie wywołany drugi konstruktor

Konstruktor domyślny

Jest bardzo ważny punkt, o którym powinniście wiedzieć i pamiętać.

Jeśli twoja klasa w ogóle nie ma konstruktora , kompilator doda do twojej klasy domyślny konstruktor - konstruktor bez parametrów i kodu, ale z modyfikatorem public.

Jeśli jednak twoja klasa ma co najmniej jednego konstruktora , domyślny konstruktor nie będzie już dodawany — musisz go dodać samodzielnie.

Kod Notatka
class Cat
{
   public String name;
   public int age;
}
Cat cat = new Cat();
Więc możesz: zostanie wywołany domyślny konstruktor