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

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

Дар гурӯҳ нашр шудааст
Фейерверк! Дунё доимо ҳаракат мекунад ва мо пайваста ҳаракат мекунем. Пештар, барои таҳиягари Java шудан каме синтаксиси Java донистан кофӣ буд ва боқимондааш меомад. Бо гузашти вақт, сатҳи донише, ки барои таҳиягари Java шудан лозим аст, ба таври назаррас афзоиш ёфт, инчунин рақобат, ки сатри поёнии донишҳои заруриро ба боло боло мебарад. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 14-1Агар шумо дар ҳақиқат хоҳед, ки таҳиякунанда шавед, шумо бояд онро як чизи муқаррарӣ қабул кунед ва ҳаматарафа омода шавед, то дар байни навгониҳо мисли шумо фарқ кунад. Мо имрӯз чӣ кор хоҳем кард, яъне мо таҳлor 250+ саволҳоро идома медиҳем . Дар мақолаҳои қаблӣ мо ҳама саволҳои сатҳи наврасро баррасӣ кардем ва имрӯз мо саволҳои сатҳи миёнаро баррасӣ хоҳем кард. Гарчанде ки ман қайд мекунам, ки инҳо 100% саволҳои сатҳи миёна нестанд, шумо метавонед бо аксарияти онҳо дар як мусоҳибаи сатҳи навтар вохӯред, зеро маҳз дар чунин мусоҳибаҳо таҳқиқи муфассали заминаи назариявии шумо сурат мегирад, дар ҳоле ки барои донишҷӯи миёна Саволҳо бештар ба омӯхтани таҷрибаи ӯ нигаронида шудаанд. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 14-2Аммо, бидуни тафсири бештар, биёед оғоз кунем.

Миёна

умумӣ мебошанд

1. Афзалиятҳо ва нуқсонҳои OOP дар муқоиса бо барномасозии мурофиавӣ/функсионалӣ кадомҳоянд?

Дар таҳлor саволҳои Ҷуиниор ин савол вуҷуд дошт ва мувофиқан ман аллакай ба он ҷавоб додам. Ин савол ва ҷавоби онро дар ин қисми мақола, саволҳои 16 ва 17 ҷустуҷӯ кунед .

2. Агрегатсия аз таркиб чӣ фарқ дорад?

Дар OOP якчанд намуди таъсири мутақобила байни an objectҳо мавҷуданд, ки таҳти мафҳуми умумии "Муносибатҳои дорои муносибатҳо" муттаҳид шудаанд. Ин муносибат нишон медиҳад, ки як an object ҷузъи an objectи дигар аст. Дар айни замон, ду зергурӯҳи ин муносибат вуҷуд дорад: Таркиб - як an object an objectи дигарро эҷод мекунад ва умри an objectи дигар аз умри эҷодкор вобаста аст. Агрегатсия - an object дар ҷараёни сохтмон пайванд (нишондиҳанда)-ро ба an objectи дигар мегирад (дар ин ҳолат, умри an objectи дигар аз умри эҷодкор вобаста нест). Барои беҳтар фаҳмидани он, биёед як мисоли мушаххасро дида бароем. Мо як синфи муайяни мошин дорем - Car , ки дар навбати худ дорои майдонҳои дохorи навъи - Муҳаррик ва рӯйхати мусофирон - List<Passenger> , инчунин дорои усули оғози ҳаракат - startMoving() :
public class Car {

 private Engine engine;
 private List<Passenger> passengers;

 public Car(final List<Passenger> passengers) {
   this.engine = new Engine();
   this.passengers = passengers;
 }

 public void addPassenger(Passenger passenger) {
   passengers.add(passenger);
 }

 public void removePassengerByIndex(Long index) {
   passengers.remove(index);
 }

 public void startMoving() {
   engine.start();
   System.out.println("Машина начала своё движение");
   for (Passenger passenger : passengers) {
     System.out.println("В машине есть пассажир - " + passenger.getName());
   }
 }
}
Дар ин ҳолат, Композитсия робитаи байни Мошин ва Муҳаррик мебошад , зеро кори мошин мустақиман аз мавҷудияти an objectи муҳаррик вобаста аст, зеро агар муҳаррик = null бошад, мо NullPointerException мегирем . Дар навбати худ, муҳаррик бидуни мошин вуҷуд дошта наметавонад (чаро ба мо муҳаррик бе мошин лозим аст?) ва дар як вақт ба якчанд мошин тааллуқ дошта наметавонад. Ин маънои онро дорад, ки агар мо an objectи Мошинро нест кунем, дигар истинод ба an objectи Engine нахоҳад буд ва он ба зудӣ аз ҷониби Ҷамъоварии партовҳо нест карда мешавад . Тавре ки мебинед, ин муносибат хеле сахт (қавӣ) аст. Агрегатсия робитаи байни мошин ва мусофир аст , зеро кори мошин ба ҳеҷ ваҷҳ аз an objectҳои навъи Мусофир ва шумораи онҳо вобаста нест. Онҳо метавонанд ё мошинро тарк кунанд - removePassengerByIndex(Long index) ё нав ворид кунанд - addPassenger(Passenger мусофир) , сарфи назар аз ин, мошин кори дурустро идома медиҳад. Дар навбати худ, an objectҳои мусофирон метавонанд бидуни an objectи Car вуҷуд дошта бошанд . Тавре ки шумо мефаҳмед, ин пайвасти хеле заифтар аз он аст, ки мо дар таркиб мебинем. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 14-3Аммо ин ҳама нест, an objectе, ки бо ҷамъшавӣ ба дигаре пайваст аст, инчунин метавонад дар як лаҳза бо дигар an objectҳо робитаи додашуда дошта бошад. Масалан, шумо, ҳамчун донишҷӯи Java, дар як вақт дар курсҳои англисӣ, OOP ва логарифмҳо номнавис шудаед, аммо дар айни замон шумо як ҷузъи муҳими онҳо нестед, ки бе онҳо фаъолияти мӯътадил ғайриимкон аст (масалан, муаллим).

3. Кадом намунаҳои GoF-ро шумо дар амал истифода бурдед? Мисолҳо оваред.

Ман қаблан ба ин савол ҷавоб дода будам, бинобар ин ман танҳо истиноди таҳлилро мегузорам , ба саволи аввал нигаред. Ман инчунин мақолаи олиҷаноби варақаи фиребро дар бораи намунаҳои тарроҳӣ ёфтам, ки ман тавсия медиҳам, ки онро дар даст нигоҳ доред.

4. Объекти прокси чист? Мисолҳо оваред

Прокси як намунаи тарҳрезии сохторӣ мебошад, ки ба шумо имкон медиҳад ба ҷои an objectҳои воқеӣ an objectҳои махсуси ивазкунанда ё ба ибораи дигар, an objectҳои проксиро иваз кунед. Ин an objectҳои прокси зангҳоро ба an objectи аслӣ бозмедоранд ва имкон медиҳанд, ки баъзе мантиқ пеш аз ё баъд аз интиқоли занг ба аслӣ ворид карда шаванд. Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 14 — 4Намунаҳои истифодаи an objectи прокси:
  • Ҳамчун прокси дурдаст - вақте истифода мешавад, ки ба мо an objectи дурдаст (an object дар фазои суроғаи дигар), ки бояд ба таври маҳаллӣ муаррифӣ шавад, истифода мешавад. Дар ин ҳолат, прокси эҷоди пайвастшавӣ, рамзгузорӣ, рамзкушоӣ ва ғайраҳоро иҷро мекунад, дар ҳоле ки муштарӣ онро ҳамчун an objectи аслии дар фазои маҳаллӣ ҷойгиршуда истифода мебарад.

  • Ҳамчун прокси виртуалӣ - вақте истифода мешавад, ки an objectи захираҳои серталаб лозим аст. Дар ин ҳолат, an objectи прокси ҳамчун тасвири an objectи воқеӣ, ки воқеан ҳанӯз вуҷуд надорад, хидмат мекунад. Вақте ки дархости воқеӣ (занги методӣ) ба ин an object фиристода мешавад, танҳо он вақт an objectи аслӣ бор мекунад ва метод иҷро мешавад. Ин равишро ба таъхир андохтани инициализатсия низ меноманд; ин метавонад хеле қулай бошад, зеро дар баъзе ҳолатҳо an objectи аслӣ метавонад муфид набошад ва он гоҳ барои эҷоди он хароҷот лозим нест.

  • Ҳамчун прокси амният - вақте истифода мешавад, ки ба шумо лозим аст, ки дастрасӣ ба ягон an objectро дар асоси ҳуқуқҳои муштарӣ назорат кунед. Яъне, агар муштарӣ, ки ҳуқуқи дастрасӣ надорад, кӯшиш кунад, ки ба an objectи аслӣ дастрасӣ пайдо кунад, прокси онро боздошта, иҷозат намедиҳад.

Биёед мисоли прокси виртуалиро бубинем: Мо интерфейси коркардкунанда дорем:
public interface Processor {
 void process();
}
Татбиқи он захираҳои аз ҳад зиёдро истифода мебарад, аммо дар айни замон он метавонад ҳар дафъа оғоз шудани барнома истифода нашавад:
public class HiperDifficultProcessor implements Processor {
 @Override
 public void process() {
   // некоторый сверхсложная обработка данных
 }
}
Синфи прокси:
public class HiperDifficultProcessorProxy implements Processor {
private HiperDifficultProcessor processor;

 @Override
 public void process() {
   if (processor == null) {
     processor = new HiperDifficultProcessor();
   }
   processor.process();
 }
}
Биёед онро дар асосӣ иҷро кунем :
Processor processor = new HiperDifficultProcessorProxy();
// тут тяжеловсеного оригинального an object, ещё не сущетсвует
// но при этом есть an object, который его представляет и у которого можно вызывать его методы
processor.process(); // лишь теперь, an object оригинал был создан
Ман қайд мекунам, ки бисёр чаҳорчӯбаҳо проксиро истифода мебаранд ва барои баҳор ин як намунаи калидӣ аст (Баҳор бо он дар дохил ва берун дӯхта мешавад). Муфассалтар дар бораи ин намуна дар ин ҷо бихонед . Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 14 — 5

5. Кадом навовариҳо дар Java 8 эълон шудаанд?

Навовариҳои аз ҷониби Java 8 овардашуда инҳоянд:
  • Интерфейсҳои функсионалӣ илова карда шуданд, дар бораи он, ки ин чӣ гуна ҳайвони ваҳшӣ аст, дар ин ҷо хонед .

  • Ифодаҳои Lambda, ки бо интерфейсҳои функсионалӣ зич алоқаманданд, дар бораи истифодаи онҳо дар ин ҷо бештар хонед .

  • Иловаи Stream API барои коркарди қулайи маҷмӯаҳои маълумот, бештар дар ин ҷо хонед .

  • Истинодҳо ба усулҳо илова карда шуданд .

  • Усули forEach() ба интерфейси Iterable илова карда шудааст .

  • Дар бастаи java.time API-и нави сана ва вақт илова карда шуд , таҳлor муфассал дар ин ҷо .

  • API-и такмилёфтаи ҳамзамон .

  • Илова кардани синфи печони ихтиёрӣ , ки барои дуруст коркарди арзишҳои нул истифода мешавад, шумо метавонед мақолаи олиро дар ин мавзӯъ дар ин ҷо пайдо кунед .

  • Илова кардани қобorяти интерфейсҳо барои истифодаи усулҳои статикӣ ва пешфарз (ки аслан, Java-ро ба мероси сершумор наздиктар мекунад), тафсилоти бештар дар ин ҷо .

  • Ба синфи Collection(removeIf(), spliterator()) усулҳои нав илова карда шуданд .

  • Такмилҳои хурд дар Java Core.

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

6. Якҷояшавии баланд ва пайвастагии паст чист? Мисолҳо оваред.

Ҳамбастагии баланд ё ҳамбастагии баланд ин мафҳумест, ки синфи муайян унсурҳоеро дар бар мегирад, ки бо ҳамдигар зич алоқаманданд ва барои мақсадашон муттаҳид шудаанд. Масалан, ҳама усулҳо дар синфи User бояд рафтори корбарро намояндагӣ кунанд. Агар синф дорои унсурҳои ба ҳам алоқаманд набошад, ҳамоҳангии паст дорад. Масалан, синфи корбар дорои усули тасдиқи суроғаи почтаи электронӣ:
public class User {
private String name;
private String email;

 public String getName() {
   return this.name;
 }

 public void setName(final String name) {
   this.name = name;
 }

 public String getEmail() {
   return this.email;
 }

 public void setEmail(final String email) {
   this.email = email;
 }

 public boolean isValidEmail() {
   // некоторая логика валидации емейла
 }
}
Синфи корбар метавонад барои нигоҳ доштани суроғаи почтаи электронии корбар масъул бошад, аммо на барои тасдиқи он ё фиристодани почтаи электронӣ. Аз ин рӯ, барои ноил шудан ба ҳамоҳангии баланд, мо усули тасдиқро ба синфи алоҳидаи утorта интиқол медиҳем:
public class EmailUtil {
 public static boolean isValidEmail(String email) {
   // некоторая логика валидации емейла
 }
}
Ва мо онро дар ҳолати зарурӣ истифода мебарем (масалан, пеш аз захира кардани корбар). Пайвастшавии паст ё пайвасти паст консепсияест, ки вобастагии пасти байни модулҳои нармафзорро тавсиф мекунад. Аслан, вобастагии мутақобила ин аст, ки чӣ гуна тағир додани яке ивази дигареро талаб мекунад. Ду синф пайвасти қавӣ (ё пайвастагии зич) доранд, агар онҳо бо ҳам зич алоқаманд бошанд. Масалан, ду синфи мушаххас, ки истинодҳоро ба ҳамдигар нигоҳ медоранд ва усулҳои якдигарро даъват мекунанд. Синфҳои бо ҳам пайвастшуда инкишоф ва нигоҳдорӣ осонтаранд. Азбаски онҳо аз ҳамдигар мустақиланд, онҳо метавонанд дар баробари таҳия ва санҷида шаванд. Ғайр аз он, онҳо метавонанд бидуни таъсир ба ҳамдигар тағир ва нав карда шаванд. Биёед мисоли синфҳои сахт алоқамандро бубинем. Мо якчанд синфи донишҷӯ дорем:
public class Student {
 private Long id;
 private String name;
 private List<Lesson> lesson;
}
Он дорои рӯйхати дарсҳо:
public class Lesson {
 private Long id;
 private String name;
 private List<Student> students;
}
Ҳар як дарс дорои истинод ба донишҷӯён мебошад. Гирифтани бениҳоят қавӣ, фикр намекунед? Чӣ тавр шумо метавонед онро кам кунед? Аввалан, биёед боварӣ ҳосил кунем, ки донишҷӯён на рӯйхати фанҳо, балки рӯйхати идентификаторҳои онҳоро доранд:
public class Student {
 private Long id;
 private String name;
 private List<Long> lessonIds;
}
Дуюм, синфи дарс набояд дар бораи ҳамаи донишҷӯён донад, бинобар ин, биёед рӯйхати онҳоро тамоман нест кунем:
public class Lesson {
 private Long id;
 private String name;
}
Ҳамин тавр, он хеле осонтар шуд ва алоқа хеле заифтар шуд, ҳамин тавр не? Таҳлor саволҳо ва ҷавобҳо аз мусоҳибаҳо барои таҳиягари Java.  Кисми 14 — 7

ООП

7. Чӣ тавр шумо мероси сершуморро дар Java амалӣ карда метавонед?

Мероси сершумор хусусияти консепсияи ба an object нигаронидашуда мебошад, ки дар он синф метавонад хосиятҳоро аз зиёда аз як синфи волидайн мерос гирад. Мушкилот вақте ба миён меояд, ки усулҳо бо имзои якхела дар синфҳои супер ва зерсинфҳо мавҷуданд. Ҳангоми даъват кардани метод, компилятор наметавонад муайян кунад, ки кадом усули синф бояд даъват карда шавад ва ҳатто ҳангоми даъват кардани усули синфе, ки афзалият дорад. Аз ин рӯ, Java мероси сершуморро дастгирӣ намекунад! Аммо як навъ луқма вуҷуд дорад, ки мо дар бораи он дар оянда сӯҳбат хоҳем кард. Тавре ки ман қаблан зикр кардам, бо баровардани Java 8, қобorяти доштани усулҳои пешфарз ба интерфейсҳо илова карда шуд . Агар синфе, ки интерфейсро амалӣ мекунад, ин усулро бекор накунад, он гоҳ ин амалисозии пешфарз истифода мешавад (аз рӯи усули пешфарз, ба монанди татбиқи абстрактӣ зарур нест). Дар ин ҳолат мумкин аст, ки интерфейсҳои гуногунро дар як синф амалӣ намуда, усулҳои пешфарзии онҳоро истифода баранд. Биёед як мисолро дида бароем. Мо интерфейси флайер дорем, ки бо усули пешфарз fly() :
public interface Flyer {
 default void fly() {
   System.out.println("Я лечу!!!");
 }
}
Интерфейси Уокер бо усули пешфарз walk() :
public interface Walker {
 default void walk() {
   System.out.println("Я хожу!!!");
 }
}
Интерфейси шиновар бо усули swim() :
public interface Swimmer {
 default void swim() {
   System.out.println("Я плыву!!!");
 }
}
Хуб, ҳоло биёед ҳамаи инро дар як синфи мурғобӣ амалӣ кунем:
public class Duck implements Flyer, Swimmer, Walker {
}
Ва биёед ҳамаи усулҳои мурғонаи худро иҷро кунем:
Duck donald = new Duck();
donald.walk();
donald.fly();
donald.swim();
Дар консол мо мегирем:
Ман меравам!!! Ман парвоз мекунам!!! Ман шино мекунам!!!
Ин маънои онро дорад, ки мо мероси сершуморро дуруст тасвир кардем, гарчанде ки ин тавр нест. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 14 - 8Ман инчунин қайд мекунам, ки агар синф интерфейсҳоро бо усулҳои пешфарз амалӣ созад, ки дар ин усулҳо якхела номҳои метод ва як далел доранд, пас компилятор дар бораи номувофиқӣ шикоят мекунад, зеро намефаҳмад, ки кадом усулро воқеан истифода бурдан лозим аст. Якчанд роҳҳо вуҷуд доранд:
  • Усулҳоро дар интерфейсҳо тағир диҳед, то онҳо аз ҳамдигар фарқ кунанд.
  • Чунин усулҳои баҳсбарангезро дар синфи татбиқ бекор кунед.
  • Аз синфе, ки ин усулҳои баҳсбарангезро амалӣ мекунад, мерос гиред (пас синфи шумо маҳз татбиқи онро истифода мебарад).

8. Фарқи байни усулҳои ниҳоӣ, ниҳоӣ ва ниҳоӣ () чист?

ниҳоӣ як калимаи калидӣ аст, ки барои ҷойгир кардани маҳдудият дар синф, усул ё тағирёбанда, маънои маҳдудият истифода мешавад:
  • Барои тағирёбанда - пас аз оғозкунии ибтидоӣ, тағирёбанда аз нав муайян карда намешавад.
  • Барои усул, усулро дар зеркласс (синфи вориси) бекор кардан мумкин нест.
  • Барои синф - синфро мерос гирифтан мумкин нест.
ниҳоят калимаи калидӣ пеш аз блоки code аст, ки ҳангоми коркарди истисноҳо дар якҷоягӣ бо блоки try ва дар якҷоягӣ (ё ба ҷои иваз) бо блоки сайд истифода мешавад. Рамзи ин блок дар ҳар сурат, новобаста аз он ки истисно партофта шудааст ё не, иҷро карда мешавад. Дар ин қисми мақола, дар саволи 104, ҳолатҳои истисноӣ, ки дар ин блок иҷро карда намешаванд, муҳокима карда мешаванд. finalize() усули синфи Object мебошад , ки пеш аз нест кардани ҳар як an object аз ҷониби коллектори ахлот даъват карда мешавад, ин усул (охирин) номида мешавад ва барои тоза кардани захираҳои ишғолшуда истифода мешавад. Барои маълумоти бештар дар бораи усулҳои синфи Object , ки ҳар як an object мерос мегирад, ба саволи 11 дар ин қисми мақола нигаред. Хуб, дар ин ҷо мо имрӯз ба охир мерасем. Дар қисми оянда вохӯрем! Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 14 - 9
Дигар маводҳо дар силсила:
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION