Creating Constructors
Constructor class adı ilə eyni olan və geri dönüş tipi (return type) olmayan xüsusi metoddur.
class Book { public book() {} // line1, DOES NOT COMPILE public void Book() {} // line2 public Book() {} // line3 public Book(Book b) {} // line4 }
- line1 – java case sensitive dildir və class adı eyni olmadığından bu constructor ola bilməz. Java bunu normal metod kimi görür və geri dönüş tipi buraxıldığından compile olunmur.
- line2 – normal metoddur, dönüş tipi olduğundan constructor ola bilməz.
- line3 – düzgün conctructordur.
- line4 – düzgün conctructordur, parametr olaraq özü ilə eyni olan tip qəbul edə bilər.
Constructor yeni obyekt yaratmaq üçün istifadə edilir. Bu proses instantiation adlanır, çünki classın instansı yaradılır. Constructoru çağırmaq üçün new
açar sözündən istifadə edilir. Java new
sözünü görən kimi yeni yaradılacaq obyekt üçün yaddaş sahəsi ayırır, həmçinin constructoru axtarır və onu çağırır.
Constructor həmçinin instance dəyişənlərə dəyər mənimsətmək üçün istifadə edilir. Bəzən ola bilər ki, instance dəyişən adı ilə constructorun qəbul etdiyi parametrin adı eyni olsun. Parametr local dəyişən hesab edildiyindən ilkin olaraq ona müraciət edilir. Əgər instance dəyişəni local dəyişəndən fərqləndirmək istəyiriksə, o zaman instance dəyişənin adının önündə this
açar sözünü istifadə edirik:
class Book { private String author; private int page; private int weight; public Book(int page, int theWeight) { page = this.page; // dəyər dəyişilmir, yaxşı hal deyil weight = theWeight; // normaldır, çünki fərqli adlardır this.author = "Roel"; // normaldır, amma this artıqdır // this.page = page; // ən çox istifadə edilən forma } public static void main(String[] args) { Book b = new Book(7, 2); System.out.printf("%d %d %s", b.page, b.weight, b.author); // 0 2 Roel } }
Constructorlara access modifier (public
, private
, protected
) tətbiq edilə bilər. Amma static
, final
, synchronized
, native
və abstract
açar sözləri constructorlarla istifadə edilə bilməz.
Default Constructor
Sizin kodlayıb kodlamamağınızdan asılı olmayaraq hər bir classın constructoru var. Əgər siz classda hər hansı bir constructor yaratmasanız Java sizin üçün parametrsiz constructor yaradacaq və bu constructor default constructor adlanır. Bəzən biz onu default no-arguments constructor da adlandırırıq. Default constructorun parametr listi və gövdəsi boş olur.
Default constructor ancaq o halda təchiz (supply) edilir ki, cari classda heç bir constructor olmasın. Əgər hər hansı bir constructor olarsa, o zaman default constructor buraxılır (omit).
class Book1 { } class Book2 { public Book2() {} } class Book3 { public Book3(int i) {} } class Book4 { private Book4() {} } class BuyBook { public static void main(String[] args) { Book1 b1 = new Book1(); Book2 b2 = new Book2(); Book3 b3 = new Book3(5); Book3 b33 = new Book3(); // line1, DOES NOT COMPILE Book4 b4 = new Book4(); // line2, DOES NOT COMPILE } }
Ancaq Book1
classının default constructoru var. Line1 ona görə compile olunmur ki, Book3
classının arqumentsiz constructoru yoxdur, manual olaraq parametrli constructor yaradıldığından default no-argument constructor buraxlib. Line2 – constructor private
olduğundan compile olunmur. Private constructor yaratmaqda məqsəd odur ki, compiler classı default constructorla təmin etməsin. Belə olduqda başqa classlar tərəfindən bu classın obyektinin yaradılmasının qarşısı alınır. Bu o zaman faydalı olur ki, ya class ancaq static metodlara sahib olur, ya da class yeni instanslarının yaradılmasına özü nəzarət etmək istəyir.
Default constructorun access modifier`i classın access modifier`i ilə eyni olur. Əgər class public
olarsa, default constructor da public
olacaq.
Overloading Constructors
Constructorların adı class adı ilə eyni olduğuna görə overload olması üçün ancaq parametr listi fərqli olmalıdır:
class Cars { String color; int speed; public Cars(int speed) { this.speed = speed; color = "green"; } public Cars(int speed, String color) { this.speed = speed; this.color = color; } }
Bu kodda azacıq təkrarlanma var, hər iki constructorda da demək olar ki, təkrar işlər görülür. Bu təkrarı aradan qaldırmaq üçün biz bir parametrli constructorda dəyişiklik edə və onun daxilində digər constructoru çağıra bilərik:
public Cars(int speed){ // Cars(speed, "green"); // DOES NOT COMPILE new Cars(speed, "green"); // Compile olunur, amma bizə lazım olan bu deyil }
new
yazmayanda kod compile olunmur, new
yazanda isə artıq nəticə biz istədiyimiz kimi olmur. Bir parametrli constructor çağırılanda classın obyekti yaradılır və color
& speed
dəyişənlərinə default dəyərlər mənimsədilir. Sonra biz həmin constructorun daxilində ikiparametrli constructoru new
ilə çağıranda artıq yeni bir obyekt yaradılır və set olunan dəyərlər birinci obyektə aid olmur və onlardan imtina edilir (ignore).
class CarsDetail { public static void main(String[] args) { Cars c = new Cars(240); System.out.println(c.speed + " " + c.color); // 0 null } }
Əgər eyni obyektin başqa constructorunu çağırmaq istəyiriksə, o zaman this()
ifadəsindən istifadə edirik. Və bu zaman set olunan yeni dəyərlər həmin obyektin dəyişənlərinə mənimsədilir. Cars
classının təkparametrli constructorunun daxilini aşağıdakı kimi dəyişsək onda nəticə biz istədiyimiz kimi olacaq:
public Cars(int speed){ // System.out.println("this() must be in the first line"); this(speed, "green"); }
class CarsDetail { public static void main(String[] args) { Cars c = new Cars(240); System.out.println(c.speed + " " + c.color); // 240 green } }
this()
ifadəsi həmişə mütləq birinci sətirdə olmalıdır, əgər println
ifadəsini commentdən çıxarsaq kod compile olunmayacaq.
[topics lang=az]