14. Polymorphism¶
Oldingi bobda inheritance, ya'ni meros olishni o‘rgandik.
Endi inheritance bilan juda ko‘p ishlatiladigan yana bir muhim tushuncha — polymorphism bilan tanishamiz.
"Polymorphism" so‘zi "ko‘p shakllilik" degan ma'noni anglatadi.
Oddiy qilib aytganda:
Bitta method turli objectlarda turlicha ishlashi mumkin.
Oddiy misol¶
Tasavvur qiling, bizda Animal classi bor:
class Animal {
void ovoz() {
System.out.println("Hayvon ovoz chiqaryapti.");
}
}
Endi Dog va Cat undan meros oladi.
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
class Cat extends Animal {
@Override
void ovoz() {
System.out.println("Miyov!");
}
}
Endi:
Dog it = new Dog();
Cat mushuk = new Cat();
it.ovoz();
mushuk.ovoz();
Natija:
Vov-vov!
Miyov!
Ikkalasida ham method nomi bir xil:
ovoz()
Lekin natija har xil.
Bu polymorphismning oddiy ko‘rinishi.
Parent type bilan ishlash¶
Polymorphismning muhim tomoni — child objectni parent type orqali saqlash mumkin.
Masalan:
Animal it = new Dog();
Animal mushuk = new Cat();
Bu yerda:
Animal
type hisoblanadi.
Lekin objectlar:
Dog
Cat
hisoblanadi.
Keyin:
it.ovoz();
mushuk.ovoz();
Natija:
Vov-vov!
Miyov!
Java objectning haqiqiy turiga qarab kerakli methodni ishlatadi.
Nima uchun bu foydali?¶
Tasavvur qiling, bizda ko‘p hayvonlar bor:
Dog
Cat
Horse
Ularning hammasida:
ovoz()
methodi mavjud.
Biz ularning hammasini Animal sifatida ishlatishimiz mumkin.
Masalan:
Animal[] hayvonlar = {
new Dog(),
new Cat(),
new Horse()
};
Keyin:
for (Animal hayvon : hayvonlar) {
hayvon.ovoz();
}
Har bir hayvon o‘zining ovoz() methodini ishlatadi.
To‘liq misol¶
class Animal {
void ovoz() {
System.out.println("Hayvon ovoz chiqaryapti.");
}
}
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
class Cat extends Animal {
@Override
void ovoz() {
System.out.println("Miyov!");
}
}
public class Main {
public static void main(String[] args) {
Animal it = new Dog();
Animal mushuk = new Cat();
it.ovoz();
mushuk.ovoz();
}
}
Natija:
Vov-vov!
Miyov!
Polymorphism va array¶
Polymorphism arraylar bilan juda qulay ishlaydi.
Masalan:
Animal[] hayvonlar = {
new Dog(),
new Cat()
};
Keyin:
for (Animal hayvon : hayvonlar) {
hayvon.ovoz();
}
Natija:
Vov-vov!
Miyov!
Bu yerda bitta array ichida turli objectlar bor.
Ularning umumiy tomoni — Animaldan meros olgan.
Method overriding¶
Polymorphism ko‘pincha method overriding bilan birga ishlatiladi.
Masalan:
class Animal {
void ovoz() {
System.out.println("Hayvon ovoz chiqaryapti.");
}
}
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
Dog parent classdagi ovoz() methodini o‘ziga moslab o‘zgartirdi.
Yana bir misol¶
Transport vositalarini olaylik.
class Vehicle {
void yur() {
System.out.println("Transport yurmoqda.");
}
}
class Car extends Vehicle {
@Override
void yur() {
System.out.println("Mashina yo‘lda yurmoqda.");
}
}
class Bicycle extends Vehicle {
@Override
void yur() {
System.out.println("Velosiped yurmoqda.");
}
}
Endi:
Vehicle[] transportlar = {
new Car(),
new Bicycle()
};
for (Vehicle transport : transportlar) {
transport.yur();
}
Natija:
Mashina yo‘lda yurmoqda.
Velosiped yurmoqda.
Polymorphismning yana bir turi¶
Java'da polymorphismning yana bir ko‘rinishi — method overloading.
Masalan:
class Calculator {
int qosh(int a, int b) {
return a + b;
}
int qosh(int a, int b, int c) {
return a + b + c;
}
}
Bu yerda method nomi bir xil:
qosh()
Lekin parametrlar soni har xil.
Shuning uchun:
Calculator calc = new Calculator();
System.out.println(calc.qosh(10, 20));
System.out.println(calc.qosh(10, 20, 30));
Natija:
30
60
Bu method overloading deyiladi.
Overloading va overriding farqi¶
Ularni adashtirmang.
Overloading¶
Bir class ichida bir xil nomli methodlar, lekin parametrlar har xil.
qosh(int a, int b)
qosh(int a, int b, int c)
Overriding¶
Child class parent classdagi methodni qayta yozadi.
class Dog extends Animal {
@Override
void ovoz() {
System.out.println("Vov-vov!");
}
}
Oddiy tasavvur¶
Polymorphismni quyidagicha tasavvur qilish mumkin:
Animal
|
+---- Dog → Vov-vov!
|
+---- Cat → Miyov!
|
+---- Horse → I-hah!
Hammasida:
ovoz()
bor.
Lekin har biri o‘ziga mos natija beradi.
Qachon polymorphism kerak?¶
Polymorphism katta dasturlarda juda foydali.
Masalan, dasturda:
Dog
Cat
Horse
Bird
kabi ko‘plab classlar bo‘lsa, ularni umumiy Animal type orqali boshqarish mumkin.
Bu kodni yanada tartibli va moslashuvchan qiladi.
Amaliy mashqlar¶
1-mashq¶
Animal classini yarating.
Unda:
ovoz()
methodi bo‘lsin.
Keyin:
Dog
Cat
classlarini yarating.
Har biri ovoz() methodini o‘ziga moslab yozsin.
2-mashq¶
Vehicle classini yarating.
Unda:
yur()
methodi bo‘lsin.
Keyin:
Car
Bicycle
classlarini yarating.
Har biri yur() methodini o‘zgartirsin.
3-mashq¶
Animal[] array yarating.
Ichiga:
Dog
Cat
Dog
objectlarini joylashtiring.
Loop yordamida barcha hayvonlarning ovozini chiqaring.
4-mashq¶
Calculator classida qosh() methodini overloading qiling.
Quyidagilarni yarating:
qosh(int a, int b)
va:
qosh(int a, int b, int c)
Muhim narsalarni eslab qoling¶
Polymorphism — bitta method turli objectlarda turlicha ishlashi.
Masalan:
Animal it = new Dog();
Animal mushuk = new Cat();
it.ovoz();
mushuk.ovoz();
Natija:
Vov-vov!
Miyov!
Overriding — child class parent methodini qayta yozadi.
Overloading — bir xil nomli methodlar turli parametrlar bilan ishlaydi.
Polymorphism Java'da katta va murakkab dasturlarni tartibli yozishda juda muhim tushunchadir.