Reja: Visibility (kirishni boshqarish sinf a'zolari)
Sinf a'zolariga kirish modifikatorlarining qisqacha mazmuni
Download 28.82 Kb.
|
Visibility
- Bu sahifa navigatsiya:
- Interfeys azolari
Sinf a'zolariga kirish modifikatorlarining qisqacha mazmuni
Modifikatorning ko'rinishi merosiga kirish Faqat shaxsiy sinfni meros qilib bo'lmaydi Modifikator yo'q / Paketdagi paket paketdagi pastki sinf mavjud bo'lsa Himoyalangan paketda quyi sinfda mavjud Hamma joyda ommaviy. Kichik sinfda mavjud Bir paytlar usullar yoki usullarga qo'llanilishi mumkin bo'lgan shaxsiy himoyalangan (bir vaqtning o'zida ikkala kalit so'z) modifikatori mavjud edi o'zgaruvchilar ularni paketdan tashqaridagi kichik sinfdan foydalanishlari mumkin, lekin ularni sinflar uchun shaxsiy qilib qo'ying bu paket. Biroq, bu Java 1.0 versiyasida olib tashlandi. Interfeys a'zolari public interface MyInterface { public void foo(); int bar(); public String TEXT = "Hello"; int ANSWER = 42; public class X { } class Y { } } Interfeys a'zolari har doim ochiq ko'rinishga ega bo'ladi, hatto ochiq kalit so'z o'tkazib yuborilgan bo'lsa ham. Shunday qilib, foo(), bar(), TEXT, ANSWER, X va Y ham hammaga ochiq ko'rinishga ega. Biroq, kirish hali ham o'z ichiga olgan interfeys bilan cheklangan bo'lishi mumkin - MyInterface umumiy ko'rinishga ega bo'lganligi sababli, uning a'zolariga istalgan joydan kirish mumkin, ammo MyInterface paket ko'rinishiga ega bo'lganida, uning a'zolariga faqat bitta paket ichidan kirish mumkin bo'lar edi. Umumiy Umumiy sinflar, interfeyslar va usullarni boshqa sinflar va interfeyslarni tip parametrlari sifatida qabul qilish imkonini beradi. Bu misolda burchakli qavslar (<>) bilan ajratilgan yagona turdagi T parametrini olish uchun Param umumiy sinfidan foydalaniladi. public class Param private T value; public T getValue() { return value; } public void setValue(T value) { this.value = value; } } Bu sinfni yaratish uchun T o‘rniga tip argumentini keltiring. Masalan, Integer: Param Tur argumenti har qanday mos yozuvlar turi bo'lishi mumkin, jumladan massivlar va boshqa umumiy turlar: Param Param Param > objectNestedParam; Java SE 7 va undan keyingi versiyalarida turdagi argumentni bo'sh turdagi argumentlar to'plami (<>) bilan almashtirish mumkin. olmos: Version ≥ Java SE 7 Param Boshqa identifikatorlardan farqli o'laroq, tip parametrlarida nomlash cheklovlari yo'q. Biroq, ularning nomlari odatda birinchi ularning maqsadi katta harf bilan yozilgan. (Bu hatto rasmiy JavaDocs uchun ham amal qiladi.) Masalan, “tur” uchun T, “element” uchun E va “kalit”/”qiymat” uchun K/V. Extending a generic class public abstract class AbstractParam private T value; public T getValue() { return value; } public void setValue(T value) { this.value = value } } AbstractParam - T tipi parametri bilan e'lon qilingan mavhum sinfdir. Bu sinfni kengaytirganda, o'sha turdagi parametr <> ichida yozilgan tip argumenti bilan almashtirilishi mumkin yoki tip parametri o'zgarishsiz qolishi mumkin. In quyidagi birinchi va ikkinchi misollar, String va Integer turi parametrini almashtiradi. Uchinchi misolda, turi parametri o'zgarishsiz qoladi. To'rtinchi misolda generiklardan umuman foydalanilmaydi, shuning uchun u sinfda mavjud bo'lganiga o'xshaydi Ob'ekt parametri. Kompilyator AbstractParam ning xom turi ekanligi haqida ogohlantiradi, lekin u kompilyatsiya qiladi ObjectParam klassi. Beshinchi misolda 2 turdagi parametr mavjud (quyida "bir nechta turdagi parametrlar" ga qarang), ikkinchi parametr tur parametri sifatida superklassga o'tdi. public class Email extends AbstractParam // ... } public class Age extends AbstractParam // ... } public class Height // ... } public class ObjectParam extends AbstractParam { // ... } public class MultiParam // ... } Foydalanish quyidagicha: Email email = new Email(); email.setValue("test@example.com"); String retrievedEmail = email.getValue(); Age age = new Age(); age.setValue(25); Integer retrievedAge = age.getValue(); int autounboxedAge = age.getValue(); Height heightInInt.setValue(125); Height heightInFloat.setValue(120.3f); MultiParam multiParam.setValue(3.3); E'tibor bering, Email sinfida T getValue() usuli xuddi String getValue() imzosi bordek ishlaydi va void setValue(T) usuli xuddi void setValue(String) deb e'lon qilingandek ishlaydi. Bundan tashqari, bo'sh jingalak qavslar ({}) bilan anonim ichki sinf bilan misol qilish mumkin: AbstractParam Bir nechta turdagi parametrlar Java umumiy sinf yoki interfeysda bir nechta turdagi parametrlardan foydalanish imkoniyatini beradi. Ko'p turdagi parametrlar burchak orasiga vergul bilan ajratilgan turlar ro'yxatini qo'yish orqali sinf yoki interfeysda ishlatilishi mumkin. qavslar. Misol: public class MultiGenericParam private T firstParam; private S secondParam; public MultiGenericParam(T firstParam, S secondParam) { this.firstParam = firstParam; this.secondParam = secondParam; } public T getFirstParam() { return firstParam; } public void setFirstParam(T firstParam) { this.firstParam = firstParam; } public S getSecondParam() { return secondParam; } public void setSecondParam(S secondParam) { this.secondParam = secondParam; }} Foydalanish quyidagi tarzda amalga oshirilishi mumkin: MultiGenericParam MultiGenericParam Java generics sintaksisi noma'lum turni ifodalovchi joker belgilar bilan chegaralangan? bu: ? kengaytiradi T yuqori chegaralangan joker belgini ifodalaydi. Noma'lum tur a bo'lishi kerak bo'lgan turni ifodalaydi T ning kichik turi yoki T turining o'zi. ? super T pastki chegaralangan joker belgini ifodalaydi. Noma'lum tur a bo'lishi kerak bo'lgan turni ifodalaydi T ning super turi yoki T turining o'zi. Qoida tariqasida, siz foydalanishingiz kerak Agar sizga faqat "o'qish" ruxsati kerak bo'lsa, T ni kengaytiradi ("kirish") super T agar sizga "yozish" ruxsati kerak bo'lsa ("chiqish") Agar ikkalasiga ham kerak bo'lsa ("o'zgartirish") Extensions yoki super dan foydalanish odatda yaxshiroqdir, chunki u sizning kodingizni yanada moslashuvchan qiladi (masalan: foydalanishga ruxsat berish subtiplar va supertiplar), quyida ko'rib turganingizdek. class Shoe {} class IPhone {} interface Fruit {} class Apple implements Fruit {} class Banana implements Fruit {} class GrannySmith extends Apple {} public class FruitHelper { public void eatAll(Collection extends Fruit> fruits) {} public void addApple(Collection super Apple> apples) {}} Endi kompilyator ma'lum bir yomon foydalanishni aniqlay oladi: public class GenericsTest { public static void main(String[] args){ FruitHelper fruitHelper = new FruitHelper() ; List fruits.add(new Apple()); // Allowed, as Apple is a Fruit fruits.add(new Banana()); // Allowed, as Banana is a Fruit fruitHelper.addApple(fruits); // Allowed, as "Fruit super Apple" fruitHelper.eatAll(fruits); // Allowed Collection bananas.add(new Banana()); // Allowed //fruitHelper.addApple(bananas); // Compile error: may only contain Bananas! fruitHelper.eatAll(bananas); // Allowed, as all Bananas are Fruits Collection fruitHelper.addApple(apples); // Allowed apples.add(new GrannySmith()); // Allowed, as this is an Apple fruitHelper.eatAll(apples); // Allowed, as all Apples are Fruits. Collection fruitHelper.addApple(grannySmithApples); //Compile error: Not allowed. // GrannySmith is not a supertype of Apple apples.add(new GrannySmith()); //Still allowed, GrannySmith is an Apple fruitHelper.eatAll(grannySmithApples);//Still allowed, GrannySmith is a Fruit Collection Download 28.82 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling