OBJEKTINIS PROGRAMAVIMAS

Java konstruktoriai

Konstruktorius yra specialus klasės elementas, kuris automatiškai iškviečiamas kuriant naują objektą. Jis nustato pradines objekto atributų reikšmes ir paruošia objektą naudojimui.

Kas yra konstruktorius?

Konstruktorius panašus į metodą, tačiau turi dvi svarbias taisykles:

  • jo pavadinimas turi tiksliai sutapti su klasės pavadinimu;
  • prieš jo pavadinimą nerašomas grąžinamasis tipas – net void.
public class Knyga {
    String busena;

    Knyga() {
        busena = "Neskaityta";
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        System.out.println(knyga.busena);
    }
}
Konsolės rezultatas

Neskaityta

  1. Konstruktoriaus pavadinimas Knyga tiksliai sutampa su klasės pavadinimu.
  2. Prieš konstruktoriaus pavadinimą nėra nei void, nei kito grąžinamojo tipo.
  3. Išraiška new Knyga() sukuria naują objektą ir automatiškai paleidžia konstruktorių.
  4. Konstruktorius į objekto atributą busena įrašo tekstą Neskaityta.
  5. Po objekto sukūrimo println() parodo jau nustatytą pradinę būseną.

Konstruktorius su parametrais

Parametrai leidžia kuriant objektą iš karto perduoti jam reikalingas pradines reikšmes:

public class Knyga {
    String pavadinimas;
    int puslapiuSkaicius;

    Knyga(String pavadinimas, int puslapiuSkaicius) {
        this.pavadinimas = pavadinimas;
        this.puslapiuSkaicius = puslapiuSkaicius;
    }

    public static void main(String[] args) {
        Knyga knyga = new Knyga("Mažasis princas", 96);

        System.out.println(knyga.pavadinimas);
        System.out.println(knyga.puslapiuSkaicius);
    }
}
Konsolės rezultatas

Mažasis princas
96

  1. Konstruktorius laukia dviejų duomenų: knygos pavadinimo ir puslapių skaičiaus.
  2. Kuriant objektą perduodami argumentai Mažasis princas ir 96.
  3. .pavadinimas reiškia kuriamo objekto atributą, o dešinėje esantis pavadinimas – parametrą.
  4. Taip abu perduoti duomenys išsaugomi naujame objekte.
  5. Po konstruktoriaus darbo konsolėje galima parodyti jau paruošto objekto atributus.
this nurodo kuriamą objektą.

this.pavadinimas yra objekto atributas, o dešinėje esantis pavadinimas – konstruktoriaus parametras.

Skirtingi objektai iš vieno konstruktoriaus

Tas pats konstruktorius gali inicializuoti daug objektų skirtingais argumentais:

public class Knyga {
    String pavadinimas;
    int puslapiuSkaicius;

    Knyga(String pavadinimas, int puslapiuSkaicius) {
        this.pavadinimas = pavadinimas;
        this.puslapiuSkaicius = puslapiuSkaicius;
    }

    public static void main(String[] args) {
        Knyga pirma = new Knyga("Mažasis princas", 96);
        Knyga antra = new Knyga("Pepė Ilgakojinė", 160);

        System.out.println(pirma.pavadinimas + ": " + pirma.puslapiuSkaicius);
        System.out.println(antra.pavadinimas + ": " + antra.puslapiuSkaicius);
    }
}
Konsolės rezultatas

Mažasis princas: 96
Pepė Ilgakojinė: 160

  1. Pirmas new Knyga(...) iškvietimas sukuria objektą su pavadinimu Mažasis princas.
  2. Antras iškvietimas sukuria kitą objektą su pavadinimu Pepė Ilgakojinė.
  3. Abu kartus vykdomas tas pats konstruktorius, tačiau jam perduodami skirtingi argumentai.
  4. Kiekvienas objektas išsaugo savo pavadinimą ir puslapių skaičių.
  5. Todėl konsolėje matome dvi skirtingas knygas.

Keli klasės konstruktoriai

Klasė gali turėti kelis konstruktorius, jei skiriasi jų parametrų skaičius arba tipai. Tai vadinama (angl. constructor overloading).

public class Knyga {
    String pavadinimas;
    int puslapiuSkaicius;

    Knyga(String pavadinimas) {
        this(pavadinimas, 0);
    }

    Knyga(String pavadinimas, int puslapiuSkaicius) {
        this.pavadinimas = pavadinimas;
        this.puslapiuSkaicius = puslapiuSkaicius;
    }

    public static void main(String[] args) {
        Knyga bePuslapiu = new Knyga("Užrašų knygelė");
        Knyga romanas = new Knyga("Mažasis princas", 96);

        System.out.println(bePuslapiu.pavadinimas + ": " + bePuslapiu.puslapiuSkaicius);
        System.out.println(romanas.pavadinimas + ": " + romanas.puslapiuSkaicius);
    }
}
Konsolės rezultatas

Užrašų knygelė: 0
Mažasis princas: 96

  1. Pirmasis konstruktorius priima tik knygos pavadinimą.
  2. Jis su this(pavadinimas, 0) iškviečia antrą tos pačios klasės konstruktorių ir puslapių skaičiui perduoda numatytąją reikšmę 0.
  3. Antrasis konstruktorius priima ir pavadinimą, ir tikrą puslapių skaičių.
  4. Java pasirenka konstruktorių pagal perduotų argumentų skaičių.
  5. this(...) iškvietimas privalo būti pirmoji konstruktoriaus instrukcija.

Numatytasis konstruktorius

Jei klasėje neparašytas nė vienas konstruktorius, Java kompiliatorius suteikia numatytąjį konstruktorių be parametrų:

public class Knyga {
    String pavadinimas;

    public static void main(String[] args) {
        Knyga knyga = new Knyga();
        System.out.println(knyga.pavadinimas);
    }
}
Konsolės rezultatas

null

  1. Klasėje Knyga neparašytas nė vienas konstruktorius.
  2. Java kompiliatorius automatiškai suteikia tuščią konstruktorių be parametrų.
  3. Dėl to išraiška new Knyga() yra leidžiama.
  4. Atributui pavadinimas patys reikšmės nesuteikėme, todėl jis gauna numatytąją objektų nuorodų reikšmę null.
  5. println() konsolėje parodo null.
Parašius savo konstruktorių, automatinis konstruktorius nebesukuriamas.

Jei tada vis dar reikia objekto kūrimo be argumentų, tokį konstruktorių reikia deklaruoti patiems.

Konstruktorius ir metodas

Java konstruktoriaus ir metodo skirtumai
SavybėKonstruktoriusMetodas
PavadinimasSutampa su klaseAprašo atliekamą veiksmą
Grąžinamasis tipasNerašomasPrivalomas, pavyzdžiui, void ar int
IškvietimasAutomatiškai su newKviečiamas pagal pavadinimą
Pagrindinė paskirtisInicializuoti objektąAtlikti objekto ar klasės veiksmą

Konstruktorių naudojimo gairės

  • Po konstruktoriaus objektas turėtų būti tinkamos ir nuoseklios būsenos.
  • Privalomus duomenis perduok konstruktoriaus parametrais.
  • Venk ilgo ar daug išorinių veiksmų atliekančio konstruktoriaus.
  • Keliems konstruktoriams bendrą inicializavimą sutelk vienoje vietoje su this(...).