Жакшы күн, Джараш жигит. Мен Java'да маалымдама түрлөрүн кастинг боюнча суроолорду ала баштадым. Ар бир жолу бир эле нерсени кайталабаш үчүн чакан макала жазууну туура көрдүм.
Биринчиден, кастинг кандай экенин карап көрөлү.
Типти кастинг (типти конвертациялоо) – бир түрдөгү өзгөрмө маанисин башка түрдөгү мааниге айландыруу. Келгиле, анын эмне экенин жана эмне менен жегенин бир мисал карап көрөлү. Бизде класстык иерархия бар ( 1-сүрөттү караңыз ). Бул жерден иерархиянын бардык класстарын, ким кимди мурастай турганын жана ар бир класстын ыкмаларын көрө аласыз. Кеңейүү жана жыйрылуу аддукциясы бар.Cat
Класс класстын тукуму экенин көрөбүз Pet
. Pet
, өз кезегинде, класстын улантуучусу болуп саналат Animal
. Биз жазганда:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Бул кеңейген кастинг (же ачык эмес). Биз шилтемелерди кеңейттик animalCat
жана animalDog
. Алар an objectтерге Cat
жана Dog
. Мындай кастинг менен биз ичинде бар , бирок ичинде жок 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
. Конversionны тарытуу учурунда ClassCastException болбош үчүн колдонуңуз instanceof
.
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
Эгерде animalCat
ал болсо YorkshireTerrier
, анда тапшырма ишке ашат, эгер жок болсо, эч нерсе болбойт.
Эми бул эмне үчүн керек, эгерде биз методдорду жоготуп, ушундай каталарды ала турган болсок
Сүрөттөгү диаграммага ылайык мен жасаган codeду карап көрөлү . 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