Рӯз ба хайр, марди Ҷавраш. Ман ба гирифтани саволҳо дар бораи навъҳои истинод дар Java шурӯъ кардам. Барои он ки ҳар дафъа як чизро такрор накунам, ман тасмим гирифтам, ки мақолаи кӯтоҳе нависам.
Аввалан, биёед бубинем, ки навъи кастинг чист.
Кастинги навъи (табдилдиҳии намуд) табдor арзиши тағирёбандаи як намуд ба арзиши навъи дигар аст. Биёед мисолеро бубинем, ки он чӣ аст ва бо чӣ хӯрда мешавад. Мо баъзе иерархияи синф дорем ( ба расми 1 нигаред ). Дар ин ҷо шумо метавонед ҳамаи синфҳои иерархияро бинед, кӣ ба кӣ мерос мегирад ва усулҳои ҳар як синф. Афзоиш ва контраксия вуҷуд дорад. Мо мебинем, ки синфCat
аз авлоди синф аст Pet
. Pet
, дар навбати худ, давомдихандаи синфи Animal
. Вақте ки мо менависем:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Ин як ҳайати васеъкунанда аст (ё як ғайриимкон). Мо звенохоро вусъат додем animalCat
ва animalDog
. Онҳо ба an objectҳо Cat
ва Dog
. Бо чунин cast, мо наметавонем animalCat/animalDog
усулҳоро тавассути истиноде даъват кунем, ки дар Cat/Dog
, аммо дар Animal
. Намоиши танг (ё возеҳ) дар самти муқобил рух медиҳад:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
Мо ба таври возеҳ нишон додем, ки мо ин an objectро ба кадом намуд партоем. АММО, ЭҲТИЁТ БОШЕД!!! Агар шумо ин тавр кунед:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
компилятор ин codeро мегузаронад. Аммо RunTime
он ба шумо хоҳад дод:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTime
мебинад, ки ду синфи гуногун Cat
вуҷуд дорад . YorkshireTerrier
Барои пешгирӣ кардани ClassCastException ҳангоми табдилдиҳии танг, истифода баред instanceof
.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Агар animalCat
ин бошад YorkshireTerrier
, пас супориш ба амал меояд, агар не, ҳеҷ чиз рӯй нахоҳад дод.
Ҳоло ин барои чӣ лозим аст, агар мо усулҳоро аз даст диҳем ва чунин хатогиҳоро ба даст орем
Биёед codeеро бубинем, ки ман мувофиқи диаграмма дар расми 2 сохтаам. 1 . СинфAnimal
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
, ки аз он мерос мегирадAnimal
public abstract class WildAnimal extends Animal
{
public void steelChicken()
{
System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
}
}
Синф Pet
, ки аз он мерос мегирадAnimal
public abstract class Pet extends Animal
{
public void peeInTray(){
System.out.println(nameOfClass + ": Master, I peed");
}
}
Синф Fox
, ки аз он мерос мегирадWildAnimal
public class Fox extends WildAnimal
{
public void eatColobok(){
System.out.println(nameOfClass + ": I will eat you, Colobok");
}
}
Синф Wolf
, ки аз он мерос мегирадWildAnimal
public class Wolf extends WildAnimal
{
public void hawlAtTheMoon(){
System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
}
}
Синф Cat
, ки аз он мерос мегирадPet
public class Cat extends Pet
{
public void sleepOnKeyboard(){
System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
}
}
Синф YorkshireTerrier
, ки аз он мерос мегирадPet
public class YorkshireTerrier extends Pet
{
public void bark(){
System.out.println(nameOfClass + ": Meow!!! Meow!!!");
}
}
Вазъиятро тасаввур кунед. Мо бояд хамаи хайвонотро дар як руйхат чамъ карда, ба онхо хурок дихем ва баъд хобонем. Ин кор осон аст, агар мо ArrayList
ҳайвонҳоро эҷод кунем ( Animal
). Ва он гоҳ мо усулҳои мувофиқро барои ҳар як ҳайвон меномем:
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();
}
}
}
Ман animal
усули bark()
ё sleepOnKeyboard()
. Зеро дар варақ allAnimals
гурба, гург, йорик ва рӯбоҳ мавҷуд аст, аммо онҳо ба Animal
. Ва онҳо танҳо усулҳое доранд, ки дар Animal
. Ин хеле хуб аст, зеро агар мо метавонистем ҳамаи усулҳоро даъват кунем, пас чаро ба мо гурги дар клавиатура хобида лозим аст ё ёрик, ки мурғдуздӣ мекунад? Ба диққататон ташаккур. Ман умедворам, ки ин мақола барои шумо муфид хоҳад буд. Танқид ва шарҳҳо хуш омадед)
GO TO FULL VERSION