JavaRush /Java блогы /Random-KK /Java тіліндегі сілтеме түрлерін түрлендіру
Sant9Iga
Деңгей

Java тіліндегі сілтеме түрлерін түрлендіру

Топта жарияланған
Қайырлы күн, Джараш жігіт. Мен Java тіліндегі сілтеме түрлерін трансляциялау туралы сұрақтар ала бастадым. Әр кезде бір нәрсені қайталамас үшін шағын мақала жазуды жөн көрдім.

Алдымен, кастингтің қандай түрін қарастырайық.

Типті құю (типті түрлендіру) – бір түрдегі айнымалы мәнді басқа түрдегі мәнге түрлендіру. Оның не екенін және оны немен жейтінін мысалға қарастырайық. Бізде кейбір класс иерархиясы бар ( 1-суретті қараңыз ). Мұнда иерархияның барлық сыныптарын, кім кімді мұра ететінін және әр сыныптың әдістерін көре аласыз. 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
RunTimeCatекі түрлі класс бар екенін көреді 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()allAnimalsAnimalAnimal
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION