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]