JavaRush /Блоги Java /Random-TG /Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари ...

Таҳлили саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java. Кисми 15

Дар гурӯҳ нашр шудааст
Салом Салом! Як таҳиягари Java чӣ қадар бояд донад? Шумо метавонед дар ин масъала муддати тӯлонӣ баҳс кунед, аммо ҳақиқат ин аст, ки дар мусоҳиба шуморо назария ба пуррагӣ бармеангезад. Ҳатто дар он соҳаҳои дониш, ки шумо имкони дар кори худ истифода карданро нахоҳед дошт. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 1Хуб, агар шумо навкор бошед, дониши назариявии шумо хеле ҷиддӣ гирифта мешавад. Азбаски то ҳол таҷриба ва дастовардҳои бузург вуҷуд надорад, танҳо тафтиш кардани қувваи базаи дониш боқӣ мемонад. Имрӯз мо таҳкими ин пойгоҳро тавассути баррасии саволҳои маъмултарини мусоҳиба барои таҳиягарони Java идома медиҳем. Биёед парвоз кунем!

Java Core

9. Фарқи байни пайванди статикӣ ва динамикӣ дар Java чӣ гуна аст?

Ман аллакай ба ин савол дар ин мақола дар саволи 18 дар бораи полиморфизми статикӣ ва динамикӣ ҷавоб додам, ман ба шумо маслиҳат медиҳам, ки онро хонед.

10. Оё дар интерфейс истифода бурдани тағирёбандаҳои хусусӣ ё муҳофизатшаванда имконпазир аст?

Не, шумо наметавонед. Зеро вақте ки шумо интерфейсро эълон мекунед, компилятори Java ба таври худкор калимаҳои калидӣ ва абстрактиро пеш аз усулҳои интерфейс ва калимаҳои калидии оммавӣ , статикӣ ва ниҳоиро пеш аз аъзои додаҳо илова мекунад. Воқеан, агар шумо private ё protected -ро илова кунед, ихтилоф ба миён меояд ва компилятор аз тағирдиҳандаи дастрасӣ бо паём шикоят хоҳад кард: "Тағйирдиҳандаи '<тағирдиҳандаи интихобшуда>' дар ин ҷо иҷозат нест." Чаро компилятор оммавӣ , статикӣ ва ниҳоӣ илова мекунад. тағирёбандаҳо дар интерфейс? Биёед онро муайян кунем:
  • ҷамъиятӣ - интерфейс ба муштарӣ имкон медиҳад, ки бо an object муошират кунад. Агар тағирёбандаҳо оммавӣ намебуданд, муштариён ба онҳо дастрасӣ надоштанд.
  • статикӣ - интерфейсҳоро эҷод кардан мумкин нест (ё дурусттараш, an objectҳои онҳо), бинобар ин тағирёбанда статикӣ аст.
  • ниҳоӣ - азбаски интерфейс барои ноил шудан ба абстраксияи 100% истифода мешавад, тағирёбанда шакли ниҳоии худро дорад (ва тағир дода намешавад).

11. Classloader чист ва он барои чи истифода мешавад?

Classloader - ё Class Loader - боркунии синфҳои Java-ро таъмин мекунад. Аниктараш, боркуниро наслхои он — боркунакхои класси махсус таъмин мекунанд, зеро Худи ClassLoader абстрактӣ аст. Ҳар дафъае, ки файли .class бор карда мешавад, масалан, пас аз даъват кардани созанда ё усули статикии синфи мувофиқ, ин амал аз ҷониби яке аз насли синфи ClassLoader иҷро мешавад . Се намуди ворисон вуҷуд доранд:
  1. Bootstrap ClassLoader як боркунаки асосӣ аст, ки дар сатҳи JVM амалӣ карда мешавад ва аз муҳити кор ҳеҷ фикру мулоҳизае надорад, зеро он як қисми ядрои JVM буда, бо рамзи аслӣ навишта шудааст. Ин боркунак ҳамчун волидайни ҳамаи дигар мисолҳои ClassLoader хизмат мекунад.

    Асосан барои боркунии синфҳои дохorи JDK, одатан rt.jar ва дигар китобхонаҳои аслӣ, ки дар феҳристи $JAVA_HOME/jre/lib ҷойгиранд, масъуланд . Платформаҳои гуногун метавонанд татбиқи гуногуни ин боркунаки синф дошта бошанд.

  2. Extension Classloader як боркунаки васеъкунӣ, насли синфи боркунаки асосӣ мебошад. Барои бор кардани тамдиди синфҳои асосии Java ғамхорӣ мекунад. Аз феҳристи васеъшавии JDK бор карда мешавад, маъмулан $JAVA_HOME/lib/ext ё ягон директорияи дигаре, ки дар моликияти системаи java.ext.dirs зикр шудааст (ин хосиятро барои назорати боркунии васеъшавӣ истифода бурдан мумкин аст).

  3. System ClassLoader як боркунаки системаест, ки дар сатҳи JRE амалӣ карда шудааст ва барои бор кардани ҳама синфҳои сатҳи барнома ба JVM ғамхорӣ мекунад. Он файлҳоеро бор мекунад, ки дар тағирёбандаи муҳити синф -classpath ё опсияи сатри фармони -cp пайдо шудаанд.

Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 2Боркунакҳои синф як қисми вақти кории Java мебошанд. Лаҳзае, ки JVM синфро дархост мекунад, боркунаки синф мекӯшад синфро ёбад ва таърифи синфро бо истифода аз номи пурраи мувофиқи синф ба вақти корӣ бор кунад. Усули java.lang.ClassLoader.loadClass() барои бор кардани таърифи синф дар вақти корӣ масъул аст. Он кӯшиш мекунад, ки синфро дар асоси номи пурраи он бор кунад. Агар синф ҳанӯз бор карда нашуда бошад, он дархостро ба боркунандаи синфи волидайн медиҳад. Ин раванд ба таври рекурсивӣ сурат мегирад ва чунин менамояд:
  1. System Classloader мекӯшад синфро дар кэши худ пайдо кунад.

    • 1.1. Агар синф пайдо шавад, боркунӣ бомуваффақият анҷом дода мешавад.

    • 1.2. Агар синф пайдо нашавад, боркунӣ ба Extension Classloader таъин карда мешавад.

  2. Extension Classloader мекӯшад синфро дар кэши худ пайдо кунад.

    • 2.1. Агар синф пайдо шавад, он бомуваффақият анҷом меёбад.

    • 2.2. Агар синф пайдо нашавад, боркунӣ ба Classloader Bootstrap дода мешавад.

  3. Bootstrap Classloader мекӯшад синфро дар кэши худ пайдо кунад.

    • 3.1. Агар синф пайдо шавад, боркунӣ бомуваффақият анҷом дода мешавад.

    • 3.2. Агар синф пайдо нашавад, Classloader асосии Bootstrap кӯшиш мекунад, ки онро бор кунад.

  4. Агар боркунӣ:

    • 4.1. Бомуваффақият - боркунии синф анҷом ёфт.

    • 4.2. Агар он ноком шавад, назорат ба Extension Classloader интиқол дода мешавад.

  5. 5. Extension Classloader мекӯшад синфро бор кунад ва агар боркунӣ бошад:

    • 5.1. Бомуваффақият - боркунии синф анҷом ёфт.

    • 5.2. Агар он ноком шавад, назорат ба System Classloader интиқол дода мешавад.

  6. 6. System Classloader кӯшиш мекунад, ки синфро бор кунад ва агар боркунӣ бошад:

    • 6.1. Бомуваффақият - боркунии синф анҷом ёфт.

    • 6.2. Бомуваффақият нагузашт - истисно тавлид шуд - ClassNotFoundException.

Мавзӯи боркунакҳои синфӣ як мавзӯи васеъ аст ва набояд онро фаромӯш кард. Барои он ки бо он муфассалтар шинос шавед, ман ба шумо маслиҳат медиҳам, ки ин мақоларо хонед ва мо дер нахоҳем кард ва идома медиҳем.

12. Майдонҳои маълумотҳои Run-Time кадомҳоянд?

Ares Data Run-Time - минтақаҳои додаҳои JVM вақти корӣ. JVM баъзе минтақаҳои маълумотро муайян мекунад, ки ҳангоми иҷрои барнома заруранд. Баъзеи онҳо ҳангоми оғози JVM сохта мешаванд. Дигарон ришта-локалӣ буда, танҳо ҳангоми сохтани ришта сохта мешаванд (ва ҳангоми нобуд шудани ришта нобуд мешаванд). Майдонҳои додаҳои JVM вақти корӣ чунинанд: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 3
  • Реестри PC барои ҳар як ришта маҳаллӣ аст ва дорои суроғаи дастури JVM мебошад, ки ришта айни замон иҷро мекунад.

  • JVM Stack як минтақаи хотираест, ки ҳамчун анбор барои тағирёбандаҳои маҳаллӣ ва натиҷаҳои муваққатӣ истифода мешавад. Ҳар як ришта стеки алоҳидаи худро дорад: баробари қатъ шудани ришта ин стек низ нобуд мешавад. Қобor зикр аст, ки бартарии стек нисбат ба теппа иҷроиш аст, дар ҳоле ки теппа бешубҳа дар миқёси нигоҳдорӣ бартарӣ дорад.

  • Stack Method Native - Майдони додаҳои ҳар як ришта, ки унсурҳои додаҳоро, ки ба стеки JVM монанд аст, барои иҷрои усулҳои маҳаллӣ (ғайри Java) нигоҳ медорад.

  • Heap - аз ҷониби ҳама риштаҳо ҳамчун мағозае истифода мешавад, ки дорои an objectҳо, метамаълумоти синф, массивҳо ва ғайра мебошанд, ки дар вақти корӣ сохта мешаванд. Ин минтақа ҳангоми оғоз кардани JVM сохта мешавад ва ҳангоми қатъ шудани он нобуд мешавад.

  • Минтақаи усул - Ин минтақаи вақти корӣ барои ҳама риштаҳо маъмул аст ва ҳангоми оғози JVM сохта мешавад. Он сохторҳоро барои ҳар як синф нигоҳ медорад, ба монанди ҳавзи доимии Runtime, codeи созандаҳо ва усулҳо, маълумоти методӣ ва ғайра.

13. Объекти таѓйирнаёбанда чист?

Дар ин қисми мақола, дар саволҳои 14 ва 15, аллакай ба ин савол ҷавоб мавҷуд аст, бинобар ин вақти худро аз даст надода, як назар андозед.

14. Дар бораи синфи String чӣ хусусият дорад?

Қаблан дар таҳлил, мо борҳо дар бораи хусусиятҳои муайяни String гап зада будем (барои ин фасли алоҳида вуҷуд дошт). Акнун биёед хусусиятҳои String- ро ҷамъбаст кунем :
  1. Ин an objectи маъмултарин дар Java аст ва барои мақсадҳои гуногун истифода мешавад. Аз ҷиҳати басомади истифода, он ҳатто аз навъҳои ибтидоӣ кам нест.

  2. Объекти ин синфро бе истифодаи калимаи нав сохтан мумкин аст - бевосита тавассути нохунак String str = “string”; .

  3. String синфи тағирнопазир аст : ҳангоми сохтани an objectи ин синф маълумоти онро тағир додан мумкин нест (вақте ки шумо ба сатри муайян + "сатри дигар" илова мекунед, дар натиҷа шумо сатри нави сеюмро мегиред). Тағирнопазирии синфи String онро риштаи бехатар мегардонад.

  4. Синфи String ниҳоӣ шудааст ( тағирдиҳандаи ниҳоӣ дорад ), аз ин рӯ онро мерос гирифтан мумкин нест.

  5. Сатр дорои ҳавзи сатри худ, майдони хотира дар теппаест, ки арзишҳои сатри эҷодкардаи онро кэш мекунад. Дар ин қисми силсила , дар саволи 62, ман ҳавзи сатрро тавсиф кардам.

  6. Java дорои аналогҳои String мебошад , ки инчунин барои кор бо сатрҳо тарҳрезӣ шудааст - StringBuilder ва StringBuffer , аммо бо фарқияти он, ки онҳо тағирёбандаанд. Шумо метавонед бештар дар бораи онҳо дар ин мақола бихонед .

Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 4

15. Коварианси тип чист?

Барои фаҳмидани ковариатсия, мо як мисолро дида мебароем. Фарз мекунем, ки мо синфи ҳайвонот дорем:
public class Animal {
 void voice() {
   System.out.println("*тишина*");
 }
}
Ва баъзе синфи сагҳо онро васеъ мекунанд :
public class Dog extends Animal {

 @Override
 public void voice() {
   System.out.println("Гав, гав, гав!!!");
 }
}
Тавре ки мо дар хотир дорем, мо метавонем ба осонӣ an objectҳои навъи меросиро ба навъи волидайн таъин кунем:
Animal animal = new Dog();
Ин ҷуз полиморфизм дигар чизе нахоҳад буд. Қулай ва чандир, дуруст? Хуб, дар бораи рӯйхати ҳайвонот чӣ гуфтан мумкин аст? Оё мо метавонем рӯйхатеро бо ҳайвоноти умумӣ бо an objectҳои саг пешниҳод кунем ?
List<Dog> dogs = new ArrayList<>();
List<Animal> animals = dogs;
Дар ин ҳолат, сатри таъини рӯйхати сагҳо ба рӯйхати ҳайвонот бо ранги сурх, яъне. компилятор ин codeро намегузаронад. Сарфи назар аз он, ки ин супориш комилан мантиқӣ ба назар мерасад (дар ниҳоят, мо метавонем an objectи Dog -ро ба тағирёбандаи навъи Animal таъин кунем ), онро иҷро кардан ғайриимкон аст. Сабаб дар он аст, ки агар он иҷозат дода мешуд, мо метавонем an objectи ҳайвонотро ба рӯйхате гузорем, ки дар аввал барои саг пешбинӣ шуда буд , дар ҳоле ки фикр мекардем, ки мо дар рӯйхат танҳо сагҳо дорем . Ва он гоҳ, масалан, мо усули get()- ро барои гирифтани an object аз рӯйхати сагҳо истифода мебарем ва фикр мекунем, ки ин саг аст ва ягон усули an objectи Dog -ро дар он даъват мекунем, ки Ҳайвон надорад . Ва чунон ки шумо мефаҳмед, ин имконнопазир аст - хатогӣ рӯй медиҳад. Аммо, хушбахтона, мураттиб ин хатои мантиқиро бо таъини рӯйхати наслҳо ба рӯйхати волидайн (ва баръакс) аз даст намедиҳад. Дар Java, шумо метавонед танҳо an objectҳои рӯйхатро барои рӯйхат тағирёбандаҳо бо генерикҳои мувофиқ таъин кунед. Инро инвариатсия меноманд. Агар онҳо ин корро карда метавонистанд, онро ковариансӣ меноманд. Яъне, коварианс ин аст, ки агар мо метавонем an objectи навъи ArrayList<Dog> -ро ба тағирёбандаи навъи List<Animal> таъин кунем . Маълум мешавад, ки коварианс дар Java дастгирӣ намешавад? Новобаста аз он ки чӣ гуна аст! Аммо ин бо роҳи махсуси худ анҷом дода мешавад. Тарҳ барои чӣ истифода мешавад ? Ҳайвонотро васеъ мекунад . Он бо як генералии тағирёбанда, ки мо мехоҳем an objectи рӯйхатро ба он таъин кунем, бо як генералии насл ҷойгир карда шудааст. Ин сохти умумӣ маънои онро дорад, ки ҳар навъе, ки насли навъи Animal аст, иҷро хоҳад кард (ва навъи Animal низ ба ин умумӣ дохил мешавад). Дар навбати худ, Animal метавонад на танҳо синф, балки интерфейс бошад (бо калимаи калидии extensions фирефта нашавед ). Мо метавонем супориши қаблии худро чунин иҷро кунем: Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 5
List<Dog> dogs = new ArrayList<>();
List<? extends Animal> animals = dogs;
Дар натиҷа, шумо дар IDE хоҳед дид, ки компилятор аз ин сохтмон шикоят намекунад. Биёед функсияи ин тарҳро тафтиш кунем. Фарз мекунем, ки мо усуле дорем, ки тамоми ҳайвонҳоеро, ки ба он интиқол дода шудаанд, садо медиҳанд:
public static void animalsVoice(List<? extends Animal> animals) {
 for (Animal animal : animals) {
   animal.voice();
 }
}
Биёед ба ӯ рӯйхати сагҳоро диҳем:
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
dogs.add(new Dog());
dogs.add(new Dog());
animalsVoice(dogs);
Дар консол мо баромади зеринро мебинем:
Вой воф!!! Вой воф!!! Вой воф!!!
Ин маънои онро дорад, ки ин равиш ба ковариатсия бомуваффақият кор мекунад. Биёед ман қайд кунам, ки ин умумӣ ба рӯйхат дохил карда шудааст ? extends Animal мо наметавонем маълумоти навро дар ягон намуд ворид кунем: на навъи Dog ва на ҳатто навъи Animal :
List<Dog> dogs = new ArrayList<>();
List<? extends Animal> animals = dogs;
animals.add(new Dog());
dogs.add(new Animal());
Дар асл, дар ду сатри охир компилятор воридкунии an objectҳоро бо ранги сурх таъкид мекунад. Ин аз он сабаб аст, ки мо сад фоиз мутмаин шуда наметавонем, ки кадом номгӯи an objectҳои кадом навъи ба рӯйхат бо маълумот аз ҷониби генералии <? васеъ намудани хайвонот> . Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 6Ман инчунин мехостам дар бораи контрварианс сухан гӯям , зеро одатан ин консепсия ҳамеша бо коварианс ҳамроҳ мешавад ва чун қоида, дар бораи онҳо якҷоя мепурсанд. Ин мафҳум то андозае муқобor коварианс аст, зеро ин конструксия навъи ворисро истифода мебарад. Фарз мекунем, ки мо мехоҳем рӯйхате дошта бошем, ки рӯйхати an objectҳои навъи, ки аҷдодони an objectи Dog нестанд, таъин карда шавад . Аммо, мо пешакӣ намедонем, ки инҳо кадом навъҳо хоҳанд буд. Дар ин маврид сохтмони шакли ? super Dog , ки барои он ҳама намудҳо мувофиқанд - наслҳои синфи саг :
List<Animal> animals = new ArrayList<>();
List<? super Dog> dogs = animals;
dogs.add(new Dog());
dogs.add(new Dog());
Мо метавонем an objectҳои навъи Dog-ро ба рӯйхат бо чунин генерикӣ бехатар илова кунем , зеро дар ҳар сурат он дорои тамоми усулҳои амалӣшудаи ягон аҷдодии худ мебошад. Аммо мо наметавонем an objectи навъи Animal илова кунем , зеро итминон нест, ки дар дохor ин навъи an objectҳо хоҳанд буд, на масалан Dog . Дар ниҳоят, мо метавонем аз як унсури ин рӯйхат усули синфи Dog дархост кунем, ки Animal онро надорад . Дар ин ҳолат, хатогии тартибдиҳӣ рух медиҳад. Инчунин, агар мо мехостем усули қаблиро амалӣ кунем, аммо бо ин умумӣ:
public static void animalsVoice(List<? super Dog> dogs) {
 for (Dog dog : dogs) {
   dog.voice();
 }
}
мо дар ҳалқаи for хатогиро ба даст меорем , зеро мо итминон ҳосил карда наметавонем, ки рӯйхати баргардонидашуда an objectҳои навъи Dog дорад ва аз усулҳои он озодона истифода мебаранд. Агар мо усули dogs.get(0) -ро дар ин рӯйхат даъват кунем. - мо an objectи навъи Object мегирем . Яъне, барои кор кардани усули AnimalVoice() ба мо лозим аст, ки ҳадди ақалл бо танг кардани намуди додаҳо манипуляцияҳои хурдро илова кунем:
public static void animalsVoice(List<? super Dog> dogs) {
 for (Object obj : dogs) {
   if (obj instanceof Dog) {
     Dog dog = (Dog) obj;
     dog.voice();
   }
 }
}
Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 7

16. Дар синфи Object методҳо чӣ гунаанд?

Дар ин қисми силсила, дар банди 11, ман ба ин савол аллакай ҷавоб додаам, бинобар ин ман ба шумо сахт маслиҳат медиҳам, ки онро хонед, агар шумо ин корро накарда бошед. Дар ин ҷо мо имрӯзро ба охир мерасонем. Дар қисми оянда вохӯрем! Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 15 — 8
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION