JavaRush /Блоги Java /Random-TG /Васеъ ва ихтисори намудҳои истинод

Васеъ ва ихтисори намудҳои истинод

Дар гурӯҳ нашр шудааст
Салом! Дар яке аз лексияҳои қаблӣ мо дар бораи кастинги навъҳои ибтидоӣ сӯҳбат кардем. Биёед ба таври мухтасар ба хотир орем, ки мо дар бораи чй сухан мерафтем. Васеъ ва ихтисори намудҳои истинод - 1Мо навъҳои ибтидоиро (дар ин ҳолат ададӣ) ҳамчун лӯхтакҳои лона аз рӯи миқдори хотираи ишғолкардаашон муаррифӣ кардем. Тавре ки шумо дар хотир доред, ҷойгир кардани лӯхтаки хурдтар ба калонтар ҳам дар ҳаёти воқеӣ ва ҳам дар барномасозии Java оддӣ хоҳад буд.
public class Main {
   public static void main(String[] args) {
        short smallNumber = 100;
        int bigNumber =  smallNumber;
        System.out.println(bigNumber);
   }
}
Ин як мисоли табдилдиҳии автоматӣ ё васеъшавӣ аст . Ин худ аз худ рӯй медиҳад, бинобар ин ба навиштани рамзи иловагӣ лозим нест. Дар ниҳоят, мо ҳеҷ чизи ғайриоддӣ намекунем: мо танҳо як лӯхтаки хурдтареро ба лӯхтаки калонтар мегузорем. Ин чизи дигар аст, агар мо кӯшиш кунем, ки баръакс кор кунем ва як лӯхтаки матрешкаи калонро ба хурдтар гузорем. Инро дар зиндагӣ кардан мумкин нест, аммо дар барномасозӣ метавон анҷом дод. Аммо як огоҳӣ вуҷуд дорад. Агар мо кӯшиш кунем, ки арзишро intба тағирёбанда гузорем short, он ба осонӣ кор намекунад. Дар ниҳоят, танҳо 16 бит маълумот метавонад ба тағирёбанда мувофиқат кунад short, аммо арзиш int32 битро мегирад! Дар натиҷа, арзиши интиқол вайрон карда мешавад. Компилятор ба мо хато медиҳад (" духтарам, шумо ягон кори шубҳанок мекунед! ”), аммо агар мо ба таври возеҳ нишон диҳем, ки арзиши худро ба кадом навъи худ мегузорем, он ба ҳар ҳол чунин амалро иҷро мекунад.
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       bigNumber = (short) bigNumber;

       System.out.println(bigNumber);

   }

}
Дар мисоли дар боло овардашуда, мо ин корро кардем. Амалиёт анҷом ёфт, аммо азбаски shortаз 32 бит танҳо 16-тоаш ба тағирёбанда мувофиқат мекунад, арзиши ниҳоӣ таҳриф шуд ва дар натиҷа мо рақами -27008 гирифтем . Ин амалиёт табдor ошкор ё танг номида мешавад .

Намунаҳои тамдид ва кашиши намудҳои истинод

Ҳоло мо дар бораи ҳамон амалиётҳо сӯҳбат хоҳем кард, аммо на ба намудҳои ибтидоӣ, балки ба an objectҳо ва тағирёбандаҳои истинод дахл дорад ! Ин дар Java чӣ гуна кор мекунад? Дар асл хеле оддӣ. Объектхое хастанд, ки ба хамдигар алокаманд нестанд. Фарз кардан мантиқӣ мебуд, ки онҳоро ба таври возеҳ ё ба таври худкор ба ҳамдигар табдил додан мумкин нест:
public class Cat {
}

public class Dog {
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Dog();//error!

   }

}
Дар ин ҷо мо, албатта, хато хоҳем кард. Дарсхо бо хам ало-каманд Catнестанд Dogва мо аз як-дигар «конвертер» на-виштаем. Мантиқист, ки мо ин корро карда наметавонем: компилятор намедонад, ки чӣ гуна ин an objectҳоро байни ҳамдигар табдил диҳад. Ин масъалаи дигар аст, агар an objectҳо ба ҳамдигар пайваст бошанд! Чӣ хел? Пеш аз ҳама, истифодаи мерос. Биёед кӯшиш кунем, ки системаи хурди синфро бо мерос эҷод кунем. Мо як синфи умумӣ дорем, ки ҳайвонотро намояндагӣ мекунанд:
public class Animal {

   public void introduce() {

       System.out.println("i'm Animal");
   }
}
Ҳайвонҳо, чунон ки шумо медонед, хонагӣ ва ваҳшӣ мебошанд:
public class WildAnimal extends Animal {

   public void introduce() {

       System.out.println("i'm WildAnimal");
   }
}

public class Pet extends Animal {

   public void introduce() {

       System.out.println("i'm Pet");
   }
}
Масалан, сагҳоро гирем - саги хонагӣ ва койот:
public class Dog extends Pet {

   public void introduce() {

       System.out.println("i'm Dog");
   }
}





public class Coyote extends WildAnimal {

   public void introduce() {

       System.out.println("i'm Coyote");
   }
}
Синфҳои мо дидаву дониста ибтидоӣ мебошанд, то дарк кардани онҳоро осон кунанд. Дар ин ҷо ба мо аслан майдонҳо лозим нест ва як усул кофӣ аст. Биёед кӯшиш кунем, ки рамзи зеринро иҷро кунем:
public class Main {

   public static void main(String[] args) {

       Animal animal = new Pet();
       animal.introduce();
   }
}
Ба фикри шумо, ба консол чӣ натиҷа дода мешавад? Оё усули introduceсинф Petё синф кор мекунад Animal? Пеш аз идомаи хондан кӯшиш кунед, ки ҷавоби худро асоснок кунед. Ва ин аст натиҷа! Ман Пет ҳастам Чаро ҷавоб ин тавр шуд? Ин оддӣ аст. Мо як тағирёбандаи волидайн ва an objectи кӯдак дорем. Бо навиштан:
Animal animal = new Pet();
Мо навъи истинодро васеъ кардемPet ва an objectи онро дар тағирёбанда нигоҳ доштем Animal. Мисли намудҳои ибтидоӣ, васеъкунии намудҳои истинод дар Java ба таври худкор анҷом дода мешавад. Барои ин навиштани рамзи иловагӣ лозим нест. Ҳоло мо як an objectи кӯдакро ба истинод ба волидайн замима кардаем ва дар натиҷа мо мебинем, ки усул дар синфи кӯдак даъват карда мешавад. Агар шумо то ҳол пурра нафаҳмед, ки чаро ин code кор мекунад, онро бо забони содда аз нав нависед:
Животное животное = new ДомашнееЖивотное();
Бо ин ҳеҷ мушкиле нест, дуруст? Тасаввур кунед, ки ин ҳаёти воқеӣ аст ва истиноди ин ҳолат як теги оддии коғазист, ки дар он "Ҳайвонот" навишта шудааст. Агар чунин когазро гирифта ба гиребони ягон хайвон часпонед, хамааш хуб мешавад. Ҳар як ҳайвон ҳанӯз ҳайвон аст! Раванди баръакс, яъне гузаштан аз дарахти мерос ба ворисон, танг аст:
public class Main {

   public static void main(String[] args) {

       WildAnimal wildAnimal = new Coyote();

       Coyote coyote = (Coyote) wildAnimal;

       coyote.introduce();
   }
}
Тавре ки шумо мебинед, дар ин ҷо мо ба таври возеҳ нишон медиҳем, ки мо an objectи худро ба кадом синф гузорем. Пештар мо як тағирёбанда доштем WildAnimalва ҳоло Coyote, ки ба дарахти мерос меравад. Мантиқист, ки компилятор чунин амалиётро бидуни нишондоди возеҳ нагузаронад, аммо агар шумо навъи онро дар қавс нишон диҳед, ҳама чиз кор мекунад. Васеъ ва ихтисори намудҳои истинод - 2 Биёед мисоли дигареро дида бароем, ки ҷолибтар аст:
public class Main {

   public static void main(String[] args) {

       Pet pet = new Animal();//error!
   }
}
Компилятор хато мекунад! Сабаб чист? Далели он аст, ки шумо кӯшиш мекунед, ки an objectи волидайнро ба тағирёбандаи кӯдак таъин кунед. Ба ибораи дигар, шумо мехоҳед ин корро кунед:
ДомашнееЖивотное домашнееЖивотное = new Животное();
Аммо, шояд, агар мо ба таври возеҳ нишон диҳем, ки мо кӯшиш мекунем, ки ба он табдил диҳем, мо муваффақ хоҳем шуд? Рақамҳо кор мекунанд, биёед кӯшиш кунем! :)
public class Main {

   public static void main(String[] args) {

       Pet pet = (Pet) new Animal();
   }
}
Истисно дар риштаи "main" java.lang.ClassCastException: Ҳайвонро ба Pet Error интиқол додан мумкин нест! Мураттиб ин дафъа шикоят накард, вале дар натица мо истисно гирифтем. Мо аллакай сабабашро медонем: мо кӯшиш мекунем, ки an objectи волидайнро ба тағирёбандаи кӯдак таъин кунем. Чаро, дар асл, ин корро кардан мумкин нест? Зеро на ҳама Ҳайвонот Ҳайвоноти хонагӣ мебошанд. Шумо an object офаридаед Animalва кӯшиш мекунед, ки онро ба тағирёбанда таъин кунед Pet. Аммо, масалан, койот низ аст , аммо ин ҳайвони хонагӣ Animalнест . PetБа ибораи дигар, вақте ки шумо менависед:
Pet pet = (Pet) new Animal();
new Animal()Ҳар як ҳайвон метавонад дар он ҷо бошад ва он набояд хонагӣ бошад! Табиист, ки тағирёбандаи шумо Pet petтанҳо барои нигоҳ доштани ҳайвоноти хонагӣ (ва наслҳои онҳо) мувофиқ аст, на барои ҳама. Аз ин рӯ, барои чунин ҳолатҳо, дар Java истиснои махсус эҷод карда шуд - ClassCastExceptionхатогӣ ҳангоми рехтани синфҳо. Барои равшантар шудани он боз такрор мекунем. Тағйирёбандаи волидайн (истинод) метавонад ба an objectи синфи насл ишора кунад:
public class Main {

   public static void main(String[] args) {

       Pet pet =  new Pet();
       Animal animal = pet;

       Pet pet2 = (Pet) animal;
       pet2.introduce();
   }
}
Масалан, мо дар ин ҷо ягон мушкилот нахоҳем дошт. Мо an objectе дорем Pet, ки ба он пайванд ишора мекунад Pet. Сипас пайванди нав ба ҳамон an object ишора кард Animal. Пас аз он мо табдилро animalба Pet. Дар омади гап, чаро мо ин корро кардем? Дафъаи гузашта мо истисно доштем! Зеро ин дафъа an objectи аслии мо Pet pet!
Pet pet =  new Pet();
Ва дар мисоли қаблӣ он an object буд Animal:
Pet pet = (Pet) new Animal();
Ба тағирёбандаи насл an objectи аҷдодӣ таъин карда намешавад. Баръакс, шумо метавонед ин корро кунед.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION