You are on page 1of 60

Konstruktori

vrste
primena
Inicijalizacija atributa klase
 Atributi se mogu inicijalizovati unutar
definicije klase u okviru statickih i ne
statickih inicijalizacionih blokova
Korišćenje inicijalizacionih blokova

Statički inicijalizacioni blok – izvršava se


jedanput, prilikom učitavanja klase i pritom
inicijalizovati samo statičke atribute klase

Nestatički inicijalizacioni blok – izvršava se za


svaki objekat koji se kreira i inicijalizuje
nestatičke atribute klase
Klasa airplane
class Airplane
{
static String company = “ ADRIA"; // static atribut
String licensePlate = “ "; // atribut
double speed; = 0.0; // atribut
double maxSpeed; = 1200.0; // atribut
void floorIt()
{ // ubrzanje do maksimalne brzine
this.speed = this.maxSpeed; }
}
 Možemo imati više inicijalizacionih blokova i
onda se oni izvršavaju onim redom kojim su
navedeni u definiciji klase
Podrazumevana inicijalizacija
Svaki atribut se inicijalizuje na podrazumevanu
vrednost njegovog tipa pri kreiranju objekta.
Ova inicijalizacija se izvrsava kao deo poziva
operatotra new
Dizajner klase odredjuje alternativnu inicijalnu
vrednost.
Korisniku klase treba omoguciti da da inicijalnu
vrednost pri kreiranju objekta.
KONSTRUKTOR klase je mehanizam koji to
omogucava.
kreiranje objekta
Airplane c = new Airplane();

konstruktor Airplane().

Novi objekat se kreira korišćenjem operatora


new čiji je jedini argument u stvari poziv
konstruktora klase kojim se instancira.
Konstruktori

 Primarna svrha konstruktora jeste da za


objekat koji se kreira izvrši inicijalizaciju
nestatičkih atributa
 Inicijalizacioni blokovi koji su eventualno
definisani u klasi uvek se izvršavaju pre tela
konstruktora
 Konstruktor ima 2 specifične osobine:

nikada ne vraća vrednost ( ni void! )


uvek ima isto ime kao i klasa kojoj pripada
Kao što je to slučaj i sa svakim drugim
metodom, može postojati veći broj konstruktora
koji se moraju razlikovati po broju i tipu svojih
argumenata.
konstruktori klase Rectangle koja je deo
java.awt paketa moze biti sledeceg oblika:
konstruktori klase Rectangle
public Rectangle();
public Rectangle(int width, int height);
public Rectangle(int x, int y, int width, int height);
public Rectangle(Dimension size);
public Rectangle(Point location);
public Rectangle(Point location, Dimension size);
Klasa Airplane
 class Airplane {
 String licensePlate; // registarcija
 double speed; // u kilometrima na sat
 double maxSpeed; // u kilometrima na sat
 }
void floorIt()
{ // ubrzanje do maksimalne brzine
this.speed = this.maxSpeed; }
Konstruktor
 Pošto je konstruktor metoda koja će biti
pozvana prilikom kreiranja objekta to njegovo
telo treba da sadrži kod koji inicijalizuje sve
članove klase shodno argumentima koji se
prosleđuju konstruktoru
Specifikator pristupa
 Kao i sve druge metode i konstruktori mogu
imati specifikatore pristupa.
 Ako je konstruktor privatan tada se ne mogu
instancirati objekti pomoću njega van klase, ali
klasa može sadržati javne statičke metode koji
mogu instancirati objekte posmatrane klase.
 Ukoliko je konstruktor zaštićen samo
subklase mogu instancirati objekte
posmatrane klase.
 U slučaju package pristupa konstruktoru
to ne može niko izvan paketa, dok u
slučaju javnog konstruktora svako može
instancirati klasu
Vrste konstruktora
Tri vrste konstruktora
Podrazumevani

Neparametrizovani

Parametrizovani
Podrazumevani konstruktor
 Ukoliko sami ne kreiramo konstruktor Java
kompajler ce automatski kreirati konstruktor
bez argumenata, za vreme run-time-a
 Ovaj konstruktor je poznat I kao default ili
podrazumevani konstruktor
 Podrazumevani konstruktor inicijalizuje sve
neinicijalizovane atribute (instancne
promenljive)
Podrazumevane vrednosti
Type Default Value

boolean False
byte 0
short 0
int 0
long 0L
char \u0000
float 0.0f
double 0.0d
object Reference null
Sintaksa
 <ime_klase>()
{
}
 Nema parametre

 Konstruktor se poziva kad god kreiramo objekat


 Ukoliko sami napišemo bar jedan konstruktor, kompajler
ne pravi podrazumevani konstruktor. Ako nam je i on
potreban, moramo ga eksplicitno definisati
Podrazumevani
 Airplane() {
 this.licensePlate = "";
 this.speed = 0.0;
 this.maxSpeed = 0.0;
 }
Primer podrazumevanog
konstruktora

class DefaultConstructor {
int a;
boolean b;

public static void main(String[] args) {


DefaultConstructor obj = new DefaultConstructor();
System.out.println("a = " + obj.a);
System.out.println("b = " + obj.b);
}
}
Ekvivalentan program
 class DefaultConstructor {
 int a;
 boolean b;
 DefaultConstructor() {
 a = 0;
 b = false;
 }
 public static void main(String[] args) {
 DefaultConstructor obj = new DefaultConstructor();
 System.out.println("a = " + obj.a);
 System.out.println("b = " + obj.b);
 }
 }
Neparametrizovani
Konstruktor
 Konstruktor je neparametrizovan ako ne
prima ni jedan parametar
 Sintaksa
 Modifikatorpristupa ImeKlase() {
 // telo konstruktora
 }
 Airplane() {
 this.licensePlate = "";
 this.speed = 0.0;
 this.maxSpeed = 1200.0;
 }
Parametrizovani konstruktor
 ModifikatorPristupa ImeKlase(arg1, arg2, ..., argn)
 { // telo konstruktora }
Konstruktor koji prima tri argumenta i koristi ih za
inicijaliziranje odgovarajućih atributa:

 Airplane(String licensePlate, double speed, double maxSpeed)


{

 this.licensePlate = licensePlate;
 this.speed = speed;
 if (maxSpeed > 0) this.maxSpeed = maxSpeed;
 else this.maxSpeed = 0.0;
 if (speed > this.maxSpeed) this.speed = this.maxSpeed;
 if (speed < 0) this.speed = 0.0;
 else this.speed = speed;
 }
Konstruktor koji obezbedjuje da inicijalna
brzina uvek bude jedanaka nuli
 Airplane(String licensePlate, double maxSpeed) {

 this.licensePlate = licensePlate;
 this.speed = 0.0;
 if (maxSpeed > 0) this.maxSpeed = maxSpeed;
 else this.maxSpeed = 0.0;

primer
 class Vehicle {

 int wheels;
 Vehicle(int wheels){
 this.wheels = wheels;
 System.out.println(wheels + " wheeler vehicle created.");
 }

 public static void main(String[] args) {


 Vehicle v1 = new Vehicle(2);
 Vehicle v2 = new Vehicle(3);
 Vehicle v3 = new Vehicle(4);
 }
 }
Izlaz
2 wheeler vehicle created.
3 wheeler vehicle created.
4 wheeler vehicle created
Metodi preopterecenja
(Overloading methods)
 Kreiranje metoda sa razlicitim definicijama I
potpisima, ali sa istim nazivom
 Moguće je definisanje više metoda klase sa istim
imenom i jedinstvenim skupom parametara. To se
naziva preopterecenjem metoda
 Ime metoda, zajedno sa tipovima njegovih
parametara čini potpis metoda
Metodi preopterecenja
(Overloading methods)
 Potpis svakog metoda u klasi mora biti različit
kako bi kompajler mogao u svakom trenutku
da odredi koji metod pozivamo
 Tip povratne vrednosti metoda nema uticaja
na potpis metoda
Preopterecenje konstruktora
 Konstruktori se mogu preopteretiti, kao i bilo
koji drugi metod klase
 Konstruisanje objekata od različitih skupova
inicijalnih podataka
 Kompajler odabira koji konstruktor će koristiti
na osnovu prosleđenih argumenata
 Za potpis metoda bitan je broj i tip
parametara, a ne njihova imena
Preopterecenje konstruktora
 Public class brojac {
 Int brojac;
 Public brojac( ) {

 brojac = 0;
 }

 }
Preopterecenje konstruktora
Konstruktoru mozemo proslediti parametar
inicijalizacije koji omogucava da brojac
moze brojati od raznih pocetnih vrednosti
 Public brojac( int broj) {

 brojac = broj;
 }

 }
primer
 class Company {
 String domainName;
 public Company() {
 this.domainName = "default";
 }
 public Company(String domainName){
 this.domainName = domainName;
 }
 public void getName(){
 System.out.println(this.domainName);
 }
 public static void main(String[] args) {
Company defaultObj = new Company();
Company CompanyObj = new Company(“ Libero");

 defaultObj.getName();
 CompanyObj.getName();
 }
 }
Poziv konstruktora iz drugog
konstruktora
 Jedan konstruktor klase može pozivati drugi
konstruktor te klase u svojoj prvoj izvršnoj
naredbi. Time se često može uštedeti na
ponovnom pisanju koda.
 Za referisanje drugog konstruktora iste klase
koristi se this kao ime metoda praćen
odgovarajućim argumentima između zagrada
Ključna reč this u
konstruktorima
 Česta je praksa da overloaded metode budu
suštinski iste, ali neka od njih definiše default
vrednosti za jedan ili više argumenata.
 U tom slučaju dobro je (iako neznatno
sporije) da svu programsku logiku stavite u
metodu koja uzima najviše argumenata i
onda jednostavno pozivate tu metodu iz svih
overloaded varijanti koje uglavnom
popunjavaju odgovarajuće default vrednosti.
Ključna reč this u
konstruktorima
class Airplane
{  String licensePlate; // npr. " AN–067-TB "
double speed; // u kilometrima na sat
double maxSpeed; // u kilometrima na sat
Airplane()
{
this.licensePlate = “ ";
this.speed = 0.0;
this.maxSpeed = 1200.0;
}
Ključna reč this u
konstruktorima
Airplane(String licensePlate, double speed, double maxSpeed)

this.licensePlate = licensePlate;
this.speed = speed;
if (maxSpeed > 0) this.maxSpeed = maxSpeed;
else this.maxSpeed = 0.0;
if (speed > this.maxSpeed) this.speed = this.maxSpeed;
if (speed < 0) this.speed = 0.0;
else this.speed = speed; }
Ključna reč this u
konstruktorima
Airplane(String licensePlate, double maxSpeed)

this.licensePlate = licensePlate;
this.speed = 0.0;
if (maxSpeed > 0) this.maxSpeed = maxSpeed;
else this.maxSpeed = 0.0; 
}
public Airplane(String licensePlate, double maxSpeed)

Airplane(licensePlate, 0.0, maxSpeed);
//ovo nije legalno unutar konstruktora!!!  
}
  Za pozivanje drugog konstruktora iste klase koristi se ključna reč this.

public Airplane(String licensePlate, double maxSpeed) { 


this(licensePlate, 0.0, maxSpeed); }
" copy " - konstruktor
Pravljenje identične kopije objekta
Ako kreiramo objekat klase Sphere sa:

Sphere eightBall = new Sphere(10.0, 10.0, 0.0);

Sphere newBall = eightBall;


" copy " - konstruktor
Ovim nije postignuto ono što želimo, već
će samo obe promenljive newBall i
eightBall referisati na isti objekat. Kreira
se nova promenljiva newBall, ali ne
poziva se konstruktor i ne kreira se novi
objekat
" copy " - konstruktor
 objekat newBall identičan objektu
eightBall dobijamo dodavanjem novog
konstruktora koji kao argument prima
postojeći objekat klase Sphere i kopira
vrednosti instancnih promenljivih objekta
koji je prosleđen kao argument u
odgovarajuće instancne promenljive
novog objekta
Metodi preklapanja
 Metodi preklapanja Kreiranje razlicite
definicije za metod koji je već definisan u
superklasi
Metodi preklapanja
 Prva varijanta
 Kada se pozove metod jednog objekta Java
interpreter trazi definiciju tog metoda u
njegovoj klasi (klasi tog objekta).
 Ukoliko ne pronadje prelazi na neki drugi
metod na visem nivou lestvice u hijerarhiji
klasa (krenuvsi sa dna hijerarhije pa navise)
Metodi preklapanja
 Druga varijanta
 Moguce je da neki put objekat odgovori na
iste metode ali sa razlicitim ponasanjem.
 Da bi to uradili treba definisati metod u
nekoj podklasi sa istim potpisom kao kod
metoda u superklasi.
 Kako Java izvrsava prvu definiciju metoda
koja se slaze sa potpisom, novi potpis skriva
prvobitnu definiciju metoda.
Pozivanje prvobitnog metoda
 Dva razloga za preklapanje metoda koji je
superklasa vec implementirala
 Da bi se potpuno zamenila definicija tog
prvobitnog metoda
 Da bi se uvecao prvobitni metod sa
dodatnim ponasanjem
Set i Get metode
 Privatnim poljima je potrebno omogućiti
pristup van klase pomoću Set i Get metoda
 Te metode treba da imaju određeni
modyfikator pristupa i obično je public
 za kreirane atribute u Eclipse razvojnom
okruzenju dobijaju se automatski opicjom
 Source->Generate getters and setters
Setter metode

 Setter metode su poznate kao “mutator”


metode, ove metode samo postavljaju
vrednosti promenljivih (obicno privatnih)
unutar klase.
Setter metode
 class TwoDPoint { 
 double x;
 double y;
 String getAsString() {
 return "(" + this.x + "," + this.y + ")";
 }
Setter metode
 void setX(double value)
 {
 this.x = value;
 }
 void setY(double value)
 {
 this.y = value;
 }
 }
Setter metode
 class OriginPrinter { 
 public static void main(String[] args) {
 TwoDPoint origin;
 origin = new TwoDPoint();
 origin.setX(0.0);
 origin.setY(0.0);
System.out.println(origin.getAsString()); }
 }
Getter metode
 Getter metode poznate kao accessor
metode, ove metode samo vracaju vrednosti
varijabli unutar klase.

 
Getter metode
 class TwoDPoint {
 double x;
 double y;
 ……
 double getX() {
 return this.x;
 } double getY() {
 return this.y; }
 }
Setter I Getter metode
 class OriginPrinter { 
 public static void main(String[] args) {
 TwoDPoint origin;
 origin = new TwoDPoint();
 origin.setX(0.0);
 origin.setY(0.0);
 System.out.println("(" + origin.getX() + "," +
origin.getY() + ")");
 }
 }
ToString metoda
 Opisuje predstavljanje (string predstava )objekta
prilikom ispisa na standardnom izlazu
 Defineše se unutar klase kao javna metoda članica
Klasa koordinata
 public class Koordinata
 {
 private double x;
 private double y;
 private double z;
 }
toString
 @Override
 public String toString() {
 // OPIS ATRIBUTA KLASE
 return ("X= "+x+", Y= "+y+", Z=
"+z);
 }
 public class Glavna {
  
 public static void main(String[] args) {
 // kreira se objekat pozivom podrazumevanog
konstruktora
 Koordinata k = new Koordinata();
  
 //kada se redefinise toString()
 //moguce je na ispis poslati celu koordinatu
 System.out.println(k);
  
 //BEZ toString(): Koordinata@a90653
 //SA toString(): X= 0, Y=0, Z=0
 }
 }

You might also like