Įvadas

Aptarsime konstruktorių sąvoką ir kūrimą.

Naudojam įrankiai:

  • Eclipse Luna (4.4.0);
  • Java 7

Konstruktoriai

Konstruktorius, tai Java klasės elementas kuriantis objektą. Konstruktorių galima įsivaizduoti kaip specialų metodą (funkciją), kuri sukuria ir grąžina objektą. Klasėje konstruktorius apsirašo kaip metodas su pavadinimu lygiu klasės pavadinimui ir negrąžinantis jokio rezultato (tiksliau jo iškvietimas sukonstruoja objektą ir grąžina, tačiau sintaksiškai tai niekaip nepažymima).

Sukurkime klasę aprašančią automobilį. Klasę aprašo gamybos metai, automobilio markė ir modelis. Pavyzdžiui 2014 metų Audi A4 automobilis.

package com.zerotoherodev.tutorial.crs.model;

public class Car {
	int year;
	String mark;
	String model;

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public String getMark() {
		return mark;
	}

	public void setMark(String mark) {
		this.mark = mark;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}
	
	public String toString() {
		return mark + " " + model + " (" + year + ")";
	}
}

Dabar klasėje CarRentSystem panaikiname pasisveikinimo informaciją ir sukuriame automobilio objektą. Jam nustatome aukščiau paminėtus duomenis ir atspausdiname automobilio informaciją. 

package com.zerotoherodev.tutorial.crs;

import com.zerotoherodev.tutorial.crs.model.Car;

public class CarRentSystem {

	String greeting = "Hello world!";

	public String getGreeting() {
		return greeting;
	}

	public void setGreeting(String greeting) {
		this.greeting = greeting;
	}

	public static void main(String[] args) {
		Car audiCar = new Car();
		audiCar.setYear(2014);
		audiCar.setMark("Audi");
		audiCar.setModel("A4");
		
		System.out.println(audiCar);
	}
}

Sukūrėme objektą pasinaudodami konstruktoriumi pagal nutylėjimą (angl. default), t.y. toks konstruktorius kuris nėra aprašomas klasėje, o Java jį sukuria automatiškai. Toks konstruktorius būna be parametrų ir išreikštinai klasėje neaprašomas. Tačiau jei klasėje išreikštinai aprašomas konstruktorius su parametrais, konstruktorius pagal nutylėjimą nėra kuriamas.

Pridėkime dar vieną Audi automobilio modelį - A6, 2013 metų ir atspausdinkime rezultatą.

package com.zerotoherodev.tutorial.crs;

import com.zerotoherodev.tutorial.crs.model.Car;

public class CarRentSystem {

	String greeting = "Hello world!";

	public String getGreeting() {
		return greeting;
	}

	public void setGreeting(String greeting) {
		this.greeting = greeting;
	}

	public static void main(String[] args) {
		Car audiCar = new Car();
		audiCar.setYear(2014);
		audiCar.setMark("Audi");
		audiCar.setModel("A4");

		Car audiA6Car = new Car();
		audiA6Car.setYear(2013);
		audiA6Car.setMark("Audi");
		audiA6Car.setModel("A6");
		
		System.out.println(audiCar);
		System.out.println(audiA6Car);
	}
}

Matome, kad kaskart sukūrus objektą reikia naudoti set metodus užpildyti klasės duomenis. Tai galima atlikti ir paprasčiau - juos užpildyti sukuriant objektą. Tam sukursime konstruktorių su parametrais, kuriais bus užpildomi objekto laukai. Papildome klasę Car konstruktoriumi su trimis parametrais:

package com.zerotoherodev.tutorial.crs.model;

public class Car {
	int year;
	String mark;
	String model;
	
	public Car(int year, String mark, String model) {
		this.year = year;
		this.mark = mark;
		this.model = model;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public String getMark() {
		return mark;
	}

	public void setMark(String mark) {
		this.mark = mark;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}
	
	public String toString() {
		return mark + " " + model + " (" + year + ")";
	}
}

Dabar matome, kad nesikompiliuoja klasė CarRentSystem. Gauname klaidą "The constructor Car() is undefined" 18 ir 23 eilutėse. Taip atsitiko kodėl, kad sukūrėme konstruktorių su parametrais. Tokiu atveju konstruktorius pagal nutylėjimą (be parametrų) nėra automatiškai sukuriamas. Mes jį galime sukurti išreikštinai.

Sukuriame konstruktorių pagal nutylėjimą Car klasei:

package com.zerotoherodev.tutorial.crs.model;

public class Car {
	int year;
	String mark;
	String model;
	
	public Car() {
	}
	
	public Car(int year, String mark, String model) {
		this.year = year;
		this.mark = mark;
		this.model = model;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public String getMark() {
		return mark;
	}

	public void setMark(String mark) {
		this.mark = mark;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}
	
	public String toString() {
		return mark + " " + model + " (" + year + ")";
	}
}

Dabar matome, kad CarRentSystem klasė vėl kompiliuojasi be klaidų.

Pakoreguojame CarRentSystem klasę, kad naudotume naujai sukurtą konstruktorių:

package com.zerotoherodev.tutorial.crs;

import com.zerotoherodev.tutorial.crs.model.Car;

public class CarRentSystem {

	String greeting = "Hello world!";

	public String getGreeting() {
		return greeting;
	}

	public void setGreeting(String greeting) {
		this.greeting = greeting;
	}

	public static void main(String[] args) {
		Car audiCar = new Car(2014, "Audi", "A4");
		Car audiA6Car = new Car(2013, "Audi", "A6");
		
		System.out.println(audiCar);
		System.out.println(audiA6Car);
	}
}

Matome, kaip supaprastėjo CarRentSystem klasė ir programuoti su parametrais kurti objektą yra paprasčiau nei nustatant kiekvieną duomenį atskirai.

Užduotis. Sukurti užsakymo klasę Order, kuri turi laukus užsakymo numeris, užsakovas (vardas ir pavardė), pastaba. Sukurti šiai klasei konstruktorių pagal nutylėjimą, konstruktorių su visais parametrais ir konstruktorių su parametrais numeris ir užsakovas. CarRentSystem klasėje sukurti 3 užsakymus panaudojant skirtingus konstruktorius.

 

 

Comments powered by CComment