Xayrli kun, Javarash yigit. Men Java-da mos yozuvlar turlarini tarqatish bo'yicha savollar ola boshladim. Har safar bir xil narsani takrorlamaslik uchun men kichik maqola yozishga qaror qildim.
Birinchidan, quyma turini ko'rib chiqaylik.
Turni quyish (turni o'zgartirish) - bir turdagi o'zgaruvchan qiymatni boshqa turdagi qiymatga aylantirish. Keling, uning nima ekanligini va nima bilan iste'mol qilinishini misol qilib ko'rib chiqaylik. Bizda ba'zi sinflar ierarxiyasi mavjud ( 1-rasmga qarang ). Bu yerda siz ierarxiyaning barcha sinflarini, kimni meros qilib olishini va har bir sinfning usullarini ko'rishingiz mumkin. Kengayuvchi va qisqaruvchi adduksiya mavjud.Cat
Biz sinfning avlod avlodi ekanligini ko'ramiz Pet
. Pet
, o'z navbatida, sinfning davomchisi hisoblanadi Animal
. Biz yozganimizda:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Bu kengaytiruvchi tarkib (yoki yashirin). Biz havolalarni kengaytirdik animalCat
va animalDog
. Ular ob'ektlarga Cat
va Dog
. Bunday cast bilan biz animalCat/animalDog
ichida bo'lgan Cat/Dog
, lekin ichida bo'lmagan havola orqali usullarni chaqira olmaymiz Animal
. Torayish (yoki aniq) teskari yo'nalishda sodir bo'ladi:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Biz ushbu ob'ektni qaysi turga o'tkazmoqchi ekanligimizni aniq ko'rsatdik. LEKIN, Ehtiyot bo'ling!!! Agar shunday qilsangiz:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
kompilyator ushbu kodni o'tkazib yuboradi. Ammo RunTime
u sizga ta'sir qiladi:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTime
Cat
ikki xil sinf borligini ko'radi YorkshireTerrier
. Konvertatsiyani qisqartirish paytida ClassCastException ni oldini olish uchun foydalaning instanceof
.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Agar animalCat
shunday bo'lsa YorkshireTerrier
, u holda topshiriq sodir bo'ladi, agar bo'lmasa, hech narsa bo'lmaydi.
Endi biz usullarni yo'qotib qo'ysak va bunday xatolarga duch kelsak, bu nima uchun kerak
Keling, rasmdagi diagramma bo'yicha men qilgan kodni ko'rib chiqaylik . 1 . SinfAnimal
public abstract class Animal
{
String name;
int age;
String nameOfClass = getClass().getSimpleName();
public void eat(){
System.out.println(nameOfClass + ": Omnomnom");
}
public void sleep(){
System.out.println(nameOfClass + ": Z-z-z-z");
}
}
WildAnimal
Meros olgan sinfAnimal
public abstract class WildAnimal extends Animal
{
public void steelChicken()
{
System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
}
}
Pet
Meros olgan sinfAnimal
public abstract class Pet extends Animal
{
public void peeInTray(){
System.out.println(nameOfClass + ": Master, I peed");
}
}
Fox
Meros olgan sinfWildAnimal
public class Fox extends WildAnimal
{
public void eatColobok(){
System.out.println(nameOfClass + ": I will eat you, Colobok");
}
}
Wolf
Meros olgan sinfWildAnimal
public class Wolf extends WildAnimal
{
public void hawlAtTheMoon(){
System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
}
}
Cat
Meros olgan sinfPet
public class Cat extends Pet
{
public void sleepOnKeyboard(){
System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
}
}
YorkshireTerrier
Meros olgan sinfPet
public class YorkshireTerrier extends Pet
{
public void bark(){
System.out.println(nameOfClass + ": Meow!!! Meow!!!");
}
}
Vaziyatni tasavvur qiling. Biz barcha hayvonlarni bitta ro'yxatda to'plashimiz, ularni ovqatlantirishimiz va keyin ularni yotqizishimiz kerak. ArrayList
Agar biz hayvonlarni yaratsak, buni qilish oson ( Animal
). Va keyin biz har bir hayvon uchun mos usullarni chaqiramiz:
public class ZOO
{
public static void main(String[] args)
{
List<Animal> allAnimals = new ArrayList<>();
allAnimals.add(new Cat());
allAnimals.add(new Wolf());
allAnimals.add(new Fox());
allAnimals.add(new YorkshireTerrier());
for (Animal animal : allAnimals)
{
animal.eat();
animal.sleep();
}
}
}
Men yoki animal
usulini chaqira olmayman . Chunki varaqda mushuk, bo'ri, yorik va tulki bor, lekin ular ga qisqartiriladi . Va ular faqat mavjud usullarga ega . Bu juda yaxshi, chunki agar biz barcha usullarni chaqira olsak, unda klaviaturada uxlaydigan bo'ri yoki tovuq o'g'irlaydigan yorik nima uchun kerak? E'tiboringiz uchun rahmat. Umid qilamanki, ushbu maqola siz uchun foydali bo'ladi. Tanqid va sharhlar qabul qilinadi) bark()
sleepOnKeyboard()
allAnimals
Animal
Animal
GO TO FULL VERSION