Blok inicijalizator instance se koristi da inicijalizira podatak-član instance. On se pokreće svaki put kada se kreira objekt klase. Inicijalizacija instansne varijable može biti direktna ali moguće je izvršiti i neke dodatne operacije prilikom inicijalizovanja instansne varijable u bloku inicijalizatoru instance. Zašto se koristi blok inicijalizator instance? Znamo da je moguće direktno dodijeliti vrijednost podatku-članu instance. Napr.
class Bike{ int speed=100; }
Pretpostavimo da moramo izvršiti neke operacije prilikom dodjeljivanja vrijednosti podatku-članu instance, napr. for petlju koja će popuniti neki kompleksni niz ili rukovanje greškama itd. Primjer bloka inicijalizatora instance Pogledajmo jednostavan primjer bloka inicijalizatora instance koji izvršava inicijalizaciju
class Bike7{ int speed; Bike7(){System.out.println("brzina je "+speed);} {speed=100;} public static void main(String args[]){ Bike7 b1=new Bike7(); Bike7 b2=new Bike7(); } } Ispis na ekranu: brzina je 100 brzina je 100
Postoje tri mjesta u javi gdje se mogu izvoditi operacije: 1. metoda 2. konstruktor 3. blok Da li se prvo poziva blok inicijalizator instance ili konstruktor?
class Bike8{ int speed; Bike8(){System.out.println("konstruktor je pozvan");} {System.out.println("blok inicijalizator instance je pozvan");} public static void main(String args[]){ Bike8 b1=new Bike8(); Bike8 b2=new Bike8(); } } Ispis na ekranu: blok inicijalizator instance je pozvan konstruktor je pozvan blok inicijalizator instance je pozvan konstruktor je pozvan
U ovom primjeru, izgleda kao da je blok inicijalizator instance prvi pozvan, ali zapravo nije. Blok inicijalizator instance je pozvan u vrijeme kreiranja objekta. Java kompajler kopira blok inicijalizator instance u konstruktor nakon prve naredbe super(). Tako je prvo pozvan konstruktor. Ovo je pokazano na sljedećoj slici: Napomena: java kompajler kopira kod bloka inicijalizatora instance u svaki konstruktor.
Pravila za blok inicijalizator instance: Postoje uglavnom tri pravila za blok inicijalizator instance. To su:
Primjer 1: blok inicijalizator instance koji se poziva nakon super()
class A{ A(){ System.out.println("pozvan je konstruktor roditeljske klase"); } } class B2 extends A{ B2(){ super(); System.out.println("pozvan je konstruktor klase-djeteta"); } {System.out.println("pozvan je blok inicijalizator instance");} public static void main(String args[]){ B2 b=new B2(); } } Ispis na ekranu: pozvan je konstruktor roditeljske klase Blok inicijalizator instance pozvan je konstruktor klase-djeteta
Primjer 2:
class A{ A(){ System.out.println("pozvan je konstruktor roditeljske klase"); } } class B3 extends A{ B3(){ super(); System.out.println("pozvan je konstruktor klase-djeteta"); } B3(int a){ super(); System.out.println("pozvan je konstruktor klase-djeteta"+a); } {System.out.println("pozvan je blok inicijalizator instance");} public static void main(String args[]){ B3 b1=new B3(); B3 b2=new B3(10); } } Ispis na ekranu: pozvan je konstruktor roditeljske klase Blok inicijalizator instance pozvan je konstruktor klase-djeteta pozvan je konstruktor roditeljske klase Blok inicijalizator instance pozvan je konstruktor klase-djeteta 10
Zadaci iz ovog poglavlja Objektno orijentisano programiranje u Javi Index