Agar funksiyani qayta yuklansa (overload) bu — (compile time polimorfizmga) kompilyatsiya vaqtidagi polimorfizmga misol bo'ladi. Funksiyalarni qayta yuklash haqida oldingi maqolalarimizda to'xtalib o'tganmiz.
Quyidagi misolga e'tiboringizni qarating:
Source code
class X
{
void metodA(int num)
{
System.out.println("metodA:"+ num);
}
void metodA(int num1, int num2)
{
System.out.println("metodA:"+ num1 +","+ num2);
}
double metodA(double num){
System.out.println("metodA:"+ num);
return num;
}
}
class Y
{
publicstaticvoid main (String args [])
{
X Obj =new X();
double natija;
Obj.metodA(20);
Obj.metodA(20, 30);
result = Obj.metodA(5.5);
System.out.println("Javob:"+ result);
}
}
Natija:
metodA:20
metodA:20,30
metodA:5.5
Javob:5.5 Yuqoridagi misolda, X classning 3 ta funksiyasi bor. Uchala funksiyalarning ham nomlari bir xil — metodA, ammo funksiyalarning argumentlarida farqlar mavjud. Kompilyatsiya vaqtida kompilyator funksiyaga yuborilayotgan argumentlarning soni va ma'lumot turiga qarab kerakli funksiyani tanlab oladi. Qaysi funksiyalarni chaqirish kompilatsiya vaqtida aniqlanishi tufayli ham bu polimorfizm turi kompilyatsiya vaqtidagi polimorfizm deb nomlanadi.
Kompilyatsiya vaqtidagi polimorfizmni yana (Static binding) statik bog'lash, (Early binding) erta bog'lash deb ham ataladi. Ishchi vaqtdagi kompilyatsiya (Runtime polimorfizm)
Dastlab casting, up-casting va down-casting tushunchalari bilan tanishib olaylik (Aslida, ishchi vaqtdagi polimorfizmni tushunish uchun faqat up-casting ni o'zini bilish yetadi, ammo men to'liqroq yozdim). Ob’yektni bir turdan boshqa turga o'tkazishga (casting) deyiladi.
Agar ota klassning ob’yekti bola klassga o'tkazilsa bu down-casting deyiladi. Misol:
Object satrObject = "Bu shunchaki satr"; // Object – ota class
Yuqoridagi misolda Object turidagi o'zgaruvchi (satrObject) String turiga o'zgartirilyapti. Bilamizki, Ob’yekt klass barcha classlarning otasi hisoblanadi.
Agar bola klassning ob’yekti ota klass turiga o'tkazilsa bu up-casting deyiladi. Misol:
String satrString = "Bu shunchaki satr"; Object satrObject = (Object)satrString;
Agar ota klassning o'zgaruvchisi bola klass ob’yektini ko'rsatsa (xotiradagi adresini ko'rsatsa) ham up-casting deyiladi. Misol:
Source code
class A{}
class B extends A{}
A a =new B();//upcasting
Yuqoridagi misolda A class toifasidagi a o'zgaruvchi (reference variable) B bola classning ob’yektini ko'rsatadi (xotiradagi manzilini ko'rsatadi).
Runtime polimorfizmda bola classdagi override qilingan metod, ota class toifasidagi o'zgaruvchi orqali chaqiriladi. Quyidagi misolga qarang:
Chevrolet Malibu Yuqoridagi misolda biz ikkita klass yaratyapmiz. Malibu class Chevrolet class dan nasl olayapti va run() funksiyani qayta yozyapti(override). Qayta yozilgan run funksiya ota klass turidagi o'zgaruvchi ch orqali chaqirilayapti. ch o'zgaruvchi Malibu turidagi ob’yektni ko'rsatayotgani uchun Malibu klassda qayta yozilgan funksiya chaqiriladi.
20-dars - Javada abstrakt klass Abstract kalit so'zi bilan yaratilgan klasslar abstrakt klasslar deb nomlanadi. Abstrakt klasslar abstakt funksiyalar (tanasi yozilmagan funksiya) yoki abstrakt bo'lmagan funksiyalardan (tanasi yozilgan funksiya) tashkil topgan bo'ladi.
Abstrakt klass quyidagicha e'lon qilinadi:
abstractclass A{
}
Abstrakt klasslar odatda super(ota) klasslar yaratishda ishlatiladi;
Abstrakt klasslardan yaratilayotgan klasslarimizni sxemasini ya'ni skletini yaratishda foydalaniladi;
Abstrakt klassimizda undan meros oladigan klasslar uchun umumiy bo'lgan funksiyalar, konstantlar, o'zgaruvchilar e'lon qilinadi.
Tanasi (implementation) yozilmagan va abstract kalit so'zi bilan yaratilgan funksiya — abstrakt funksiya deyiladi.
abstractvoid funksiya();
Abstrakt funksiyasi bor bo'lgan abstrakt klassga misol:
Source code
publicabstractclass Mashina {
abstractvoid madeli();
abstractvoid mashinaTuri();
abstractvoid uzunligi();
abstractvoid rangi();
}
publicclass Malibu extends Mashina{
@Override
void madeli(){
System.out.println("Chevrolet");
}
@Override
void mashinaTuri(){
System.out.println("Malibu");
}
@Override
void uzunligi(){
System.out.println("4.7 metr");
}
@Override
void rangi(){
System.out.println("Qora");
}
publicstaticvoid main(String[] args){
Mashina mashina =new Malibu();
mashina.madeli();
mashina.mashinaTuri();
mashina.uzunligi();
mashina.rangi();
}
}
Natija :
Chevrolet
Malibu
4.7 metr
Qora Yuqoridagi misolda Malibu klassi abstrakt funksiyalari (modeli, mashinaTuri, uzunligi, rangi) bor bo'lgan Mashina abstarkt klassidan nasl olyapti va uning abstrakt klassi tanasini realizatsiya(Override) qilayapti.
Amaliyotda abstrakt klass bir nechta klasslar uchun ota klass vazifasini bajaradi va abstrakt funksiyalar turli bola klasslarda turlicha realizatsiya qilinadi.
Shuningdek abstrakt klass konstruktor, tanasi bor funksiya, ma'lumotlar va hattoki main() funksiyaga ega bo'lishi mumkin. Quyidagi misolga qarang: