OCA Java imtahan mövzuları

Constructors

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, nativeabstract 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]

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.