Nazorat uchun savollar
1. Komponentalarning standart sinflardan farqi nimadan iborat?
2. Хususiyatlar qanday e’lon qilinadi?
3. Voqealar ishlatgichlar qanday e’lon qilinadi?
4. Nomlar fazosi mexanizmidan foydalanish.
5. Ochiq oydin va o‘zgaruvchan e’lonlar nima uchun ishlatiladi?
118
15 bob. VORISLIKDAN FOYDALANISH ХUSUSIYAТLARI.
INТERFEYSLAR
15.1. Object: global supersinf. equals va toString usullari
Object sinfi hamma sinflar ajdodi hisoblanadi. Java tilida xar bir sinf Object
sinfini kengaytiradi. Lekin class Employee extends Oblects yozish shart emas. Agar
supersinf oshkor ko‘rsatilmagan bo‘lsa Object supersinf hisoblanadi. Java tilida xar
bir sinf Object sinfini kengaytirgani uchun Object sinfi imkoniyatlarini bilish
muximdir.
Object tipidagi o‘zgaruvchini ixtiyoriy tipdagi obyektga ilova sifatida ishlatish
mumkin:
Object obj = new Employee("Garri Хaker", 35000);
Bu tipdagi o‘zgaruvchidan foydalanish uchun avval boshlang‘ich tipni aniqlab,
tiplarni keltirishni amalga oshirish lozim:
Employee ye = (Employee) obj;
Object sinfining equals usuli ikki obyekt bir xilligini tekshiradi. Lekin equals
usuli Object sinfiga tegishli bo‘lgani uchun, ikkalasi bir xotira qismiga ilova
qilganligini tekshiradi. Ikki obyekt ekvivalentligini tekshirish uchun equals usulini
qo‘shimcha yuklash lozim. Mukammal equals usuli yaratish qoidalari.
1. Oshkor otherObject parametrini chaqirish — keyinchalik uning tipini other
deb atalgan boshqa o‘zgaruvchi tipiga keltirish lozim.
2. Тekshirish, this va otherObject ilovalar bir xilmi:
i f ( this == otherObject) return true;
Odatda obyektlar maydonini solishtirgandan ko‘ra ilovalarni solishtirish osondir.
3. Тekshirish otherObject ilova nulga (null) tengmi. Agar xa bo‘lsa false qiymat
qaytarish. Bu tekshirishni albatta amalga oshirish lozim.
if (otherObject == null) return false;
4. Тekshirish this va other obyektlari bitta sinfga tegishlimi.
Bu tekshirish "simmetriklik qoidasiga " ko‘ra majburiydir.
if (getClass() != otherObject.getClass()) return false;
5. Тalab qilingan sinf o‘zgaruvchisiga otherObject obyektini o‘zgartirish:
119
ClassName other = (ClassName)otherObject;
6. Хamma maydonlarni solishtirish. Asosiy tipdagi maydonlar uchun ==
operatori, obyektli maydonlar uchun —equals usuli qo‘llanadi. Agar ikki obyekt
hamma mydonlari bir xil bo‘lsa true qaytarish, aks holda false.
return fieldl == other.fieldl
&& field.2. equals (other . field2)
Masalan.
class Employee{
public boolean equals(Object otherObject) {
// Obyektlarni tez solishtirish,
if (this == otherObject) return true;
// Agar oshkor parametr — null, false qiymat qaytaradi,
if (otherObject == null) return false;
// Agar sinflar ustma ust tushmasa, ular ekvivalent emas.
if (getClass () != otherObject.getClassO) return false;
// Obyekt otherObject tipi Employee va u nulga teng emas.
Employee other = (Employee) otherObject;
// Obyektlar maydonlarini solishtirish,
return name.equals(other.name)
&& salary = other.salary
&& hireDay.equals(other.hireDay);
}
}
Obyekt tipini getClass usuli orqali aniqlanadi. Obyektlar o‘zaro teng bo‘lishi
uchun bir sinf obyektlari bo‘lishlari kerak.
Voris ichida avvval spersinf equals usulini chaqirish lozim. Agar bu tekshirish
false qiymat qaytarsa, demak obyektlar teng emas. Agar tekshirish muvaffaqiyatli
bajarilsa ostki sinf maydonlarini tekshirishga o‘tish mumkin.
Masalan quyidagicha.
class Manager extends Employee
120
{
public boolean.equals(Object otherObject)
{
if (!super.equals(otherObject)) return false;
Manager.other = (Manager)otherObject;
// Usul super.equals tekshiradi
// this va otherObject obyektlari bitta sinfga tegishlimi.
return bonus == other.bonus;
} }
Object sinfining yana bir muxim usuli toString, bo‘lib obyektni satr shaklida
qaytaradi. Bu usul deyarli hamma sinflarda qo‘shimcha yuklanadi, va obyekt xolatini
bosmaga chiqarishga mo‘ljallangan.
Ko‘p (hammasi emas) toString usullari sinf nomi dan iborat bo‘lib, kvadrat
qavslarda maydonlari qiymatlari ko‘rsatiladi. Quyida Employee sinfining toString
usuli realizatsiyasi ko‘rsatilgan.
public String toString()
{
return "Employee[name" + name
+ ",salary =" + salary
+ ",hireDay =" + hireDay
}
Bu usulni takomillashtirish mumkin. Sinf nomini toString usuliga kiritmasdan,
getClass().getName() usulini chaqiramiz va sinf nomini o‘z ichiga olgan satrni
olamiz.
public String toString()
{
return getClass().geName()
+ "[name=" + name
+ ",salary=" + salary
+ ",hireday=" + hireDay
121
}
Endi toString usuli voris sinflar bilan ham ishlaydi.
Albatta voris sinf yaratgan lasturchi o‘z toString usulini yaratishi va voris sinf
nomini qo‘shishi lozim. Agar supersinfda getClass ().getNamef() usuli chaqirilsa,
voris sinf super.ToString ( ) usulini chaqiradi. Manager sinfida toString usuliga
misol.
class manager extends Employee
{
public String toString()
{
return super.toString()+ "[bonus=" + bonus
Endi Manager sinfi obyekti xolati quyidagi shaklda chiqariladi:
Manager[name=...,salary=...,hireDay=...][bonus=...]
Agar obyekt satr bilan "+" amali yordamida konkatenatsiya qilinsa Java tili
kompilyatori obyekt joriy xolatini olish uchun avtomatik ravishda toString usulini
chaqiradi.
Birorr x — ixtiyoriy obyekt uchun dasturchi System.out.println(x) usulini
chaqirsin;
Bu holda println usuli x. toString () usulini chaqiradi va natija satrini chiqaradi.
Object sinfida aniqlangan toString usuli sinf nomi va obyekt adresini chiqaradi.
Masalan
System.out.println(System.out);
chaqirish natijasida quyidagi satr xosil bo‘ladi
java.io.PrintStream@2f668 4
Buning sababi shuki PrintStream sinfida toString usuli qo‘shimcha
yuklanmagan.
Standart bibliotekaga tegishli ko‘p sinflarda toString usuli shunday aniqlanganki,
uning yordamida dasturni sozlash uchun kerakli ma’lumot olish mumkin. Ba’zi
sozlovchilar obyektlar xolatini ekranda akslantinrish uchun toString usulini
122
chaqirishga imkon beradi. Shuning uchun dastur trassirovkasida, quyidagi
ifodalardan foydalanish mumkin
System.out.println{"Joriy xolat = " + position);
Do'stlaringiz bilan baham: |