Java - Konstruktori


Šta je konstruktor?

U Javi svaka klasa ima svoj konstruktor koji se automatski poziva kada se kreira objekt klase. Konstruktor je sličan metodi, ali zapravo nije metoda. Java metoda i Java konstruktor mogu se razlikovati po imenu i tipu vraćanja. Konstruktor ima isto ime kao i klasa i ne vraća nikakvu vrijednost. Na primjer:

class Test {
    Test() {
        // tijelo konstruktora
    }
}

Ovdje je Test() konstruktor. Ima isto ime kao i klasa i nema povratni tip.

class Test {
    void Test() {
        // tijelo metode
    }
}

Ovdje Test() ima isto ime kao i klasa. Međutim, ima povratni tip void. Dakle, to je metoda, a ne konstruktor.


Primjer: Java konstruktora

class Main {
   private int x;

   // konstruktor
   private Main(){
       System.out.println("Pozivanje konstruktora");
       x = 5;
   }

   public static void main(String[] args){
       // konstruktor se poziva prilikom kreiranja objekta
       Main obj = new Main();
       System.out.println("Vrijednost od x = " + obj.x);
   }
}

U gornjem primjeru imamo privatni (private) konstruktor po imenu Main(). Unutar glavne metode kreiramo objekt nazvan obj klase.

Main obj = new Main();

Tokom ovog procesa poziva se konstruktor. Dakle, naredba ispisa se izvršava i varijabla x se inicijalizuje.



Vrste konstruktora

U Javi se konstruktori mogu podijeliti u 3 vrste:

  • Konstruktor bez argumenata
  • Zadani konstruktor
  • Parametarski konstruktor


Konstruktor bez argumenata

Java konstruktor može, ali i ne mora imati bilo kakve parametre (argumente). Ako konstruktor ne prihvati nijedan parametar, poznat je kao konstruktor bez argumenata. Na primjer:

private Constructor() {
   // tijelo konstruktora
}

Primjer: Konstruktor bez argumenata

class Main {

   int i;

   // konstruktor bez parametara
   private Main(){
       i = 5;
       System.out.println("Stvoren je objekt i = " + i);
   }

   public static void main(String[] args) {

       // pozivanje konstruktora bez ikakvog parametra
       Main obj = new Main();
   }
}

Ovdje konstruktor Main() ne prihvata nikakve parametre. Jeste li primijetili da je modifikator pristupa konstruktora Main() privatan (private)? To je zato što je objekt instanciran iz iste klase. Dakle, može pristupiti konstruktoru. Međutim, ako je objekt kreiran izvan klase, morate proglasiti konstruktor javnim da bi mu pristupio. Na primjer:

class Company {
    String domainName;

    // public konstruktor
    public Company(){
        domainName = "ittutorijali.net";
    }
}

public class Main {
    
    public static void main(String[] args) {

    // objekt je kreiran u drugoj klasi
        Company companyObj = new Company();
        System.out.println("Domain ime = "+ companyObj.domainName);
    }
}


Zadani konstruktor

Ako ne kreirate nijedan konstruktor, Java kompajler će automatski stvoriti konstruktor bez argumenata za vrijeme izvođenja. Ovaj konstruktor poznat je kao zadani konstruktor. Zadani konstruktor inicijalizuje sve neinicijalizovane varijable instance sa zadanim vrijednostima.

Tip Difoltna vrijednost
boolean false
byte 0
short 0
int 0
long 0L
char \u0000
float 0.0f
double 0.0d
object Reference null

Primjer: zadani konstruktor

class DefaultConstructor {

    int a;
    boolean b;

    public static void main(String[] args) {

        // Poziva se zadani konstruktor
        DefaultConstructor obj = new DefaultConstructor();

        System.out.println("a = " + obj.a);
        System.out.println("b = " + obj.b);
    }
}

U gornjem programu nismo inicijalizovali vrijednost obe varijable, a i b. Međutim, kada kreiramo objekt klase u izlazu možemo vidjeti da su vrijednosti inicijalizovane nekim vrijednostima. To je zato što je Java kompajler automatski kreirao zadani konstruktor. Konstruktor će inicijalizovati vrijednost varijabli a i b sa zadanim vrijednostima 0 i false. Gornji program je ekvivalentan:

class DefaultConstructor {

    int a;
    boolean b;

    // privatni konstruktor
    private DefaultConstructor() {
        a = 0;
        b = false;
    }

    public static void main(String[] args) {
        // pozivanje konstruktora
        DefaultConstructor obj = new DefaultConstructor();

        System.out.println("a = " + obj.a);
        System.out.println("b = " + obj.b);
    }
}


Parametarski konstruktor

Slično metodama i parametre možemo prosljediti konstruktoru. Takvi konstruktori poznati su kao parametrizovani konstruktori. Na primjer:

private Constructor (arg1, arg2, ..., argn) {
    // tijelo konstruktora
}

Primjer: Parametarski konstruktor

class Vehicle {

    int wheels;

    // konstruktor koji prihvata jednu vrijednost
    private Vehicle(int wheels){
        this.wheels = wheels;
        System.out.println(wheels + " kreirano vozilo na točkovima.");
    }

    public static void main(String[] args) {

        // pozivanje konstruktora prosljeđivanjem jedne vrijednosti
        Vehicle v1 = new Vehicle(2);
        Vehicle v2 = new Vehicle(3);
        Vehicle v3 = new Vehicle(4);
    }
}

U gornjem primjeru imamo konstruktor nazvan Vehicle(). Konstruktor prihvata jedan parametar nazvan točkovi (wheels). Dok stvaramo objekte, prosljeđujemo argumente konstruktoru. I, na osnovu argumenta, on generiše izlaz.



Preopterećenje konstruktora u Javi

Slično preopterećenju metoda i mi možemo preopteretiti konstruktore u Javi. U preopterećenju konstruktora postoje dva ili više konstruktora s različitim parametrima. Na primjer:

class Company {

    String domainName;

    // konstruktor bez parametara
    public Company(){
        this.domainName = "default";
    }

    // konstruktor s jednim parametrom
    public Company(String domainName){
        this.domainName = domainName;
    }

    public void getName(){
        System.out.println(this.domainName);
    }

    public static void main(String[] args) {
        // pozivanje konstruktora bez parametra
        Company defaultObj = new Company();

        // pozivanje konstruktora s jednim parametrom
        Company programizObj = new Company("ittutorijali.net");

        defaultObj.getName();
        programizObj.getName();
    }
}

U gornjem primjeru imamo dva konstruktora: public Company() i public Company(String domainName). Oba konstruktora inicijalizuju varijablu domainName s različitim vrijednostima. Zbog toga na osnovu vrijednosti koju želimo, možemo pozvati konstruktora iz metode main(). Imajte na umu da smo ovu ključnu riječ koristili za specifikovanje varijable klase.