« poprzedni punkt  następny punkt »

4. Definiowanie sposobu tworzenia obiektów (konstruktory)

Specjalną operacją jest operacja tworzenia obiektu.

Jak wiemy, wykonywana jest ona za pomocą wyrażenia new.
Okazuje się, że to co w nim zapisujemy oznacza wywołanie konstruktora klasy.

Konstruktor służy (głównie) do inicjowania pól obiektów.
O konstruktorze można myśleć jako o specjalnej metodzie, która:
  • zawsze ma nazwę taką samą jak nazwa klasy
  • nie ma żadnego typu wyniku (nawet void!)
  • ma listę parametrów (w szczególności może być pusta)

Podobnie jak przy definicji metod - w definicji konstruktora możemy podać specyfikator dostępu, który określa czy konstruktor może być wywołany spoza klasy.

Postać definicji konstruktora:
   
[ public] class nazwa_klasy {

    // Definicja konstruktora
    [ specyfikator_dostępu ] nazwa_klasy(lista_parametrów) {
        // czynności wykonywane przez konstruktor
    }         
}

W klasie Para możemy mieć np. takie konstruktory:

public class Para {
  private int a;
  private int b;

  public Para(int x, int y) {  // Nadaje polom a i b wartości
    a = x;                     // przekazane konstruktorowi jako
    b = y;                     // argumenty
  }
  ...
}

albo:

public class Para {
   private int a, b;
   public Para(int x) {    // Konstruktor ma jeden parametr:
      a = x;               // oba pola są nim inicjowane
      b = x;
   }
...
}

ProblemMożemy też w tej samej klasie mieć kilka konstruktorów, które różnią się listą parametrów (np. oba w/w konstruktory w klasie Para). Jest to jak gdyby odpowiednik przeciążania metod.


Mając tak zdefiniowane dwa konstruktory w klasie Para, możemy teraz łatwo tworzyć obiekty-pary o zadanych wartościach np.

Para p1 = new Para(10,11);  // para 10, 11
Para p2 = new Para(2);         // para 2, 2


Konstruktory zawsze są wywoływane za pomocą wyrażenia new

Szczególnym rodzajem konstruktora jest konstruktor bezparametrowy.
Jest on automatycznie dodawany do definicji klasy, gdy nie zdefiniowano żadnego konstruktora (przy czym jego ciało jest puste). Zatem jeśli nie dostarczymy w klasie żadnego konstruktora, to przy tworzeniu obiektu zostanie wywołany automatycznie dodany konstruktor bezparametrowy (który nie robi nic).

Uwaga: konstruktor bezparametrowy nie jest dodawany, gdy w klasie zdefiniowano jakikolwiek konstruktor.


« poprzedni punkt  następny punkt »