OCA Java imtahan mövzuları

Redeclaring private Methods & Hiding Static Methods

Redeclaring private Methods

Java`da parent classda olan private metodları child classda override etmək mümkün deyil, çünki access modifier`ə görə private metodlar child classda görsənmir. Amma bu o demək deyil ki, biz child classda parent classdakı private metodla eyni quruluşa malik olan metod yarada bilmərik. Bu mümkündür, amma child classda yaradılmış bu metod tamamilə yeni, ayrı və müstəqil metoddur, parent classdakı metodun override olunmuş versiyası deyil və bir-biri ilə heç bir əlaqələri yoxdur.

public class City {
    private String getNumberOfPeople() {
        return "Undefined";
    }
}

class Baku extends City {
    private long getNumberOfPeople() {
        return 2_225_800L;
    }
}

Yuxarıdakı kod normal compile olunur. Çünki bu metodlar bir-birindən ayrı, müstəqil metodlardır və child classdakı metod override qaydalarına əməl etmək məcburiyyətində deyil.

 

Hiding Static Methods

Gizli metodlar (hidden/static method) override olunmuş metodlara çox oxşayır, amma fərqli cəhətləri də var. Gizli metodlar da override metodlar üçün keçərli olan 4 qaydaya mütləq riayət etməli və əlavə olaraq yeni 5-ci qaydanın tələblərinə uyğun olmalıdır.

5. Əgər parent classdakı metod static`dirsə, o zaman child classdakı metod da mütləq static olmalıdır (method hiding). Yox əgər parent classdakı metod static deyilsə, o zaman child classdakı metod da static olmamalıdır (method overriding).

class Bear {

    public static void eat() {
        System.out.println("Bear is eating");
    }

    public static void sleep() {
        System.out.println("Bear is slepping");
    }

    protected void wakeUp() {
        System.out.println("Bear wake up");
    }
}

public class Panda extends Bear {

    public static void eat() {
        System.out.println("Panda is eating");
    }

    public void sleep() {    // DOES NOT COMPILE
        System.out.println("Panda is slepping");
    }

    protected static void wakeUp() {    // DOES NOT COMPILE
        System.out.println("Panda wake up");
    }

    public static void main(String[] args) {
        Bear b = new Panda();
        b.eat();    // Bear is eating
    }
}

eat() metodu gizləmə (hiding) qaydalarına riayət edir, həm parent, həm də child metod static`dir. Ona görə də main() metodda eat() metodunu çağıranda child classdakı metodu override etmir.

sleep() metodu parent classda static`dir, amma child classda yox. Buna görə də compiler şübhələnir ki, siz əslində gizli olmalı olan metodu override etməyə çalışırsız və buna görə də compile xətası verir.

wakeUp() metodu parent classda instance metoddur, amma child classda static. Bu səbəbdən compiler elə fikirləşir ki, siz əslində override etməli olduğunuz metodu gizlətməyə çalışırsız və xəta verir.

*Praktikada gizli metodlardan (hiding static methods) istifadə etmək məsləhət görülmür.

 

Overriding vs. Hiding Methods

Runtime vaxtı metodun child yaxud parent classda çağırılmasından asılı olmayaraq həmişə child classda override olunmuş versiya icra olunur. Bu qaydaya görə parent metod heç vaxt istifadə edilmir, əgər aşkar olaraq həmin metod çağırılmayıbsa – new ParentClassName().method().

Amma static metodlarda vəziyyət fərqlidir. Əgər gizli (static) metod parent classda çağırılıbsa, o zaman həmin metodun həmişə parent versiyası icra ediləcək:

public class Vehicle {

    public static int getNumberOfWheels() {
        return 4;
    }

    public void vehicleDescription() {
        System.out.println("The most of vehicles have " + getNumberOfWheels() + " wheels.");
    }
}

class Bicycle extends Vehicle {

    public static int getNumberOfWheels() {
        return 2;
    }

    public void bicycleDescription() {
        System.out.println("Bicycle has " + getNumberOfWheels() + " wheels.");
    }

    public static void main(String[] args) {
        Bicycle b = new Bicycle();
        b.vehicleDescription();
        b.bicycleDescription();
    }
}

Output:

The most of vehicles have 4 wheels.
Bicycle has 2 wheels.

Əgər hər iki classdakı getNumberOfWheels() metodunundan static sözünü silsək o zaman nəticə dəyişəcək:

The most of vehicles have 2 wheels.
Bicycle has 2 wheels.

 

[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.