Қайырлы күн, Джараш жігіт. Мен 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;
Біз бұл нысанды қандай түрге жібергіміз келетінін анық көрсеттік. БІРАҚ, САҚ БОЛЫҢЫЗ!!! Егер сіз мұны осылай жасасаңыз:
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ты қарастырайық . 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