Mavhum sinf - bu boshqa hosila sinflarni yaratish uchun faqat tayanch sinf sifatida yaratilgan maxsus sinf. Abstrakt sinflarning namunalarini yaratib bo'lmaydi. Boshqacha qilib aytganda, agar FourWheelVhicles mavhum sinf bo'lsa,
keyin buyruqni bajarishga harakat qilganingizda
FourWheelVehicle myVeh = new FourWheelVehicle();
mavhum sinf ob'ektini yaratish mumkin emasligi sababli siz xatoga yo'l qo'yasiz .
8.3. Referat sinflar va metodlar 157
Boshqa har qanday sinf singari, mavhum sinflar ham maydonlar va usullarni o'z ichiga olishi mumkin. Bundan tashqari, ular maxsus turdagi usullarni - mavhum usullarni o'z ichiga olishi mumkin. Mavhum usullarning tanasi yo'q va ular olingan sinfda amalga oshirilishi kerak. Abstrakt usullar faqat mavhum sinflarda mavjud bo'lishi mumkin.
Yuqoridagi fitnes klubi misolida ota-onalar sinfi (A'zo) yillik to'lov maydonini 0 ga o'rnatadigan AnnualFee() hisoblash usulini e'lon qildi .
Bunday ma'nosiz usulni amalga oshirishni ota-sinfga kiritish o'rniga , usulni abstrakt deb e'lon qilish yaxshiroqdir .
Keling, buni qanday qilishni fitness klubi misolida ko'rib chiqaylik. Dastur bir qator o'zgarishlarni amalga oshirishi kerak.
Ota-onalar sinfidagi o'zgarishlar
Avval siz chiziqlarni almashtirishingiz kerak
umumiy bekor hisoblangan yillik to'lov()
{
yillik to'lov = 0;
}
a'zolar sinfida quyidagi qatorga ega:
mavhum ommaviy bekor hisoblashAnnualFee();
Usul deklaratsiyasidagi mavhum kalit so'z usulning mavhum ekanligini ko'rsatadi. Bundan tashqari, {} jingalak qavslar usul deklaratsiyasidan keyin qo'shilmaydi, shuning uchun
158 8 -bob. Obyektga yo‘naltirilgan dasturlash
mavhum usullar qanday tanaga ega emas. Buning o'rniga, deklaratsiya nuqtali vergul (;) bilan tugaydi .
Keyin a'zolar sinfi mavhum deb e'lon qilinishi kerak . Gap shundaki, mavhum usullar faqat mavhum sinflarda mavjud bo'lishi mumkin. Buning uchun siz Ro'yxatdan sinfining deklaratsiyasiga kalit so'zni qo'shishingiz kerak .
so'z abstrakt:
mavhum ommaviy sinf a'zosi
Bu sinfda amalga oshirilishi kerak bo'lgan barcha o'zgarishlar
a'zosi.
InheritanceDemichidao sinfidagi o'zgarishlar
Shuningdek, Inheri sinfiga bitta o'zgartirish kiritishingiz kerak bo'ladi
tanceDemo.
Chunki mavhum sinfning namunasini yaratish mumkin emas
chiziqni bajarishga harakat qilganda, mumkin
clubMembers[5] = yangi a'zo("Yvonne", 6, 2013);
InheritanceDemo.java faylida xatolik yuz berdi.
Iteratsiyani tuzatish uchun siz ob'ektni ushlab turish uchun clubMember massivining oxirgi elementini o'zgartirishingiz mumkin Oddiy a'zo yoki VIPMember . Ushbu yechim ushbu
dastur mantig'ida yaxshi ishlaydi, chunki klubga tashrif
buyuruvchi faqat a'zo emas, balki ikkita toifadan biriga (NormalMember yoki VIPMember) tegishli bo'lishi kerak .
Bizning misolimizda element VIP ob'ektga aylantirilgan.
a'zosi.
Referat sinflar va metodlar 159
Chiziqni shunday qiling:
clubMembers[5] = new VIPmember("Yvonne", 6, 2013);
Aslida, bu Inheri -da bajarilishi kerak bo'lgan hamma narsa
tanceDemo.
Olingan sinflardagi o'zgarishlar
Nihoyat, olingan sinflarga o'tamiz. Abstrakt usullar olingan sinflarda amalga oshirilishi kerak, shuning uchun siz accountAnnualFee() usuli ikkala hosila sinfda ham amalga oshirilishiga ishonch hosil qilishingiz kerak .
Oldingi misolda bu usul ularning ikkala sinfida ham qo'llanilgan. Shuning uchun, hech qanday o'zgarish yo'q
suv sinflari qilish shart emas.
Dasturni saqlang va ishga tushiring. Hamma narsa ishlashi kerak
odatdagidek, avvalgidek; uchun faqat chiqish
oxirgi mehmon (Yvonne). Yillik to'lov quyida ko'rsatilganidek, $1200 bo'lishi kerak.
A'zo nomi: Yvonne A'zo identifikatori: 6 2013 yildan beri a'zo Yillik to'lov: 1200,0
Xulosa qilib aytadigan bo'lsak, mavhum sinf asosiy sinfning maxsus turi bo'lib, uni namuna qilib bo'lmaydi . U amalga oshirish tafsilotlari bo'lmagan mavhum usullarni o'z ichiga olishi mumkin va olingan sinflarda amalga oshirilishi kerak.
160 8 -bob. Obyektga yo‘naltirilgan dasturlash
INTERFEYSLAR
Keling, interfeyslarga o'tamiz. Interfeyslar mavhum sinflarga o'xshaydi: ularni ham instantsiya qilib bo'lmaydi. Buning o'rniga ular kerak
sinflar tomonidan amalga oshirilishi yoki boshqa interfeyslar tomonidan kengaytirilishi mumkin. Sinf interfeysni amalga oshirganda, u ushbu interfeysdagi barcha mavhum usullarni amalga oshirishi kerak .
Java 7 dan oldin interfeyslarda faqat mavhum usullar (ya'ni, tanasi bo'lmagan usullar) va doimiylar (ya'ni, yakuniy kalit so'zli maydonlar) bo'lishi mumkin edi.
Interfeysdagi barcha usullar bevosita ochiq deb e'lon qilinadi
mi, shu bilan birga barcha doimiy qiymatlar yashirindir
ommaviy, statik va yakuniy deklaratsiyalar . Ushbu modifikatorlarni aniq belgilashingiz shart emas.
Mavhum sinf va interfeys o'rtasidagi asosiy farqlardan biri shundaki, sinf bitta mavhum sinfni kengaytirishi mumkin, lekin u ko'plab interfeyslarni amalga oshirishi mumkin. Biroq, kitob bir nechta interfeyslarni amalga oshirish misollarini qamrab olmaydi , chunki bu juda murakkab mavzu bo'lib, undan tashqarida.
kitobdan tashqarida.
Mavhum sinf va interfeys o'rtasida yana bir farq bor : interfeys faqat mavhum usullarni o'z ichiga olishi mumkin (Java 7 dan oldin), mavhum sinflar esa mavhum bo'lmagan usullarni o'z ichiga olishi mumkin.
Java 7 dan oldin interfeyslar qanday ishlaganiga misol bilan boshlaylik .
8.4. Interfeyslar 161
NetBeans-ni ishga tushiring va InterfaceDemo nomli yangi Java loyihasini yarating. InterfaceDemo -da kodni almashtiring .
java quyidagicha:
1 paket interfeysi demo;
2
3 umumiy sinf InterfaceDemo {
to'rtta
5
6
7
umumiy statik void main(String[] args) { MyClass a = yangi MyClass();
a.someMethod();
sakkiz
9
o'n }
o'n bir}
12
System.out.println("Kontaktning qiymati "
+ MyInterface.myInt);
13-sinf MyClass MyInterface-ni amalga oshiradi
o'n to'rt {
o'n besh
16
17
o'n sakkiz
@Override
public void someMethod()
{
System.out.println("Bu MyClass-da joriy qilingan usul");
19 }
yigirma }
21
22 interfeysi MyInterface{
23
24
25
26
27}
int myInt = 5; void someMethod();
Ushbu misolda interfeys 22-27-qatorlarda e'lon qilingan. 24-satr maydonni e'lon qiladi (bu ochiq, statik va final kalit so'zlari bilan bilvosita e'lon qilinadi ), 25- satr esa usulni e'lon qiladi. Usulni e'lon qilishda
162 8 -bob. Obyektga yo‘naltirilgan dasturlash
interfeysda mavhum kalit so'zdan foydalanish shart emas ; usul sukut bo'yicha mavhum hisoblanadi.
13-20 qatorlar ushbu interfeysni amalga oshiradigan MyClass sinfini e'lon qiladi. Ushbu munosabatlarni bildirish uchun implements kalit so'zi ishlatiladi . Sinf ichida someMethod() usuli 15-19-qatorlarda amalga oshiriladi.
3-11 qatorlar main() usulini o'z ichiga olgan InterfaceDemo sinfini o'z ichiga oladi. main() usulida biz MyClass obyektini
yaratamiz va undan someMethod() ni chaqirish uchun foydalanamiz.
7-satrda. 9-qator myInt doimiysining qiymatini chop etadi. E'tibor bering, interfeyslardagi konstantalar statik bo'lgani uchun biz ularga MyClass ob'ekti nomi bilan emas, balki interfeys nomi (MyInterface.myInt) bilan murojaat qilamiz .
Ushbu dasturni ishga tushirganingizda, siz quyidagilarni olasiz
natija:
Bu MyClass-da qo'llaniladigan usul Konstantaning qiymati 5 ga teng
Bu misol Java 7 ning chiqarilishidan oldin interfeyslar qanday ishlaganini ko'rsatadi. Biroq, Java 8 da vaziyat biroz boshqacha.
o'zgardi.
Java 8 dan oldin interfeys faqat mavhum usullarni o'z ichiga olishi mumkin edi. Java 8 da til ostida paydo bo'ldi
interfeyslarda standart va statik usullarni saqlash .
Standart usullar va statik usullar qanday ishlashini ko'rish uchun MyInterface
-ga quyidagi ikkita usulni qo'shing. E'tibor bering, ikkala usul ham interfeysning o'zida amalga oshiriladi:
Interfeyslar 163
umumiy statik bekor someStaticMethod()
{
System.out.println("Bu interfeysdagi statik usul");
}
umumiy standart bekor someDefaultMethod()
{
System.out.println("Bu interfeysdagi standart usul");
}
Keyin main() usuliga quyidagi qatorlarni kiriting :
a.someDefaultMethod(); MyInterface.someStaticMethod();
Dasturni saqlang va ishga tushiring. Siz quyidagi natijaga erishasiz:
Bu MyClass-da qo'llaniladigan usul
Konstantaning qiymati 5 ga teng Bu interfeysdagi standart usul Bu interfeysdagi statik usul
Java 8 dan beri interfeyslar shunday ishlaydi. Endi interfeyslarga metodlarni amalga oshirishni qo'shishingiz
mumkin. Biroq , interfeyslarda faqat usullarni amalga oshirish mumkin. standart va statik usullar.
Standart usullar va statik usullar interfeyslarga asosan ikkilik moslik uchun qo'shilgan. Oddiy qilib aytganda, bu interfeysni o'zgartirganingizda , ushbu interfeysni amalga oshiradigan sinflarni o'zgartirishingiz shart emasligini anglatadi.
Masalan, MyInterface interfeysiga yangi usul qo'shmoqchi ekanligingizni tasavvur qiling. Agar siz quyida ko'rsatilgandek interfeysga oddiygina usul deklaratsiyasini qo'shishga harakat qilsangiz , xatolik yuz beradi.
164 8 -bob. Obyektga yo‘naltirilgan dasturlash
Mening interfeysim{
int myInt = 5;
void someMethod();
Do'stlaringiz bilan baham: |