JavaRush /Java блогу /Random-KY /Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун...
Константин
Деңгээл

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи. 5-бөлүк

Группада жарыяланган
Салам салам! Бүгүнкү күндө Java иштеп чыгуучуларга суроо-талап жогору. Албетте, мен сизге вакансия бере албайм, бирок мен сизге жаңы бorм алууга жана айрым боштуктарды жабууга жардам берүүгө аракет кылам. Ошентип, биз Java иштеп чыгуучусу үчүн 250+ интервью суроолорун талдоону улантабыз . Анализдин мурунку бөлүктөрүнө шилтемелер макаланын аягында.Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-1-бөлүк

39. Java тorнде кирүү модификаторлору деген эмне? Аларды атаңыз. Алар эмне үчүн колдонулат?

Мен буга чейин Java инкапсуляциясынын элементтери тууралуу суроодо кирүү модификаторлорун сүрөттөгөн элем. Бирок мен баары бир эскертем. Java'дагы мүмкүндүк модификаторлору белгилүү бир Java компонентине берилген мүмкүнчүлүктүн деңгээлин сүрөттөгөн ачкыч сөздөр. Кирүү модификаторлору төмөнкүлөр болушу мүмкүн:
  • public - бул өзгөрткүчү бар элемент жалпыга жеткorктүү болот. Ошол. талаалар жана методдор, жалпы өзгөрткүч менен жарыяланган класстар башка класстарга учурдагы пакеттен да, тышкы пакеттерден да көрүнүп турат;
  • корголгон - бул модификатору бар элементке учурдагы пакеттин учурдагы классынын каалаган жеринен же урпак класстарында, алар башка пакеттерде болсо да жеткorктүү болот;
  • демейки , же жок өзгөрткүч - бул өзгөрткүч кирүү өзгөрткүчү такыр көрсөтүлбөгөндө кыйыр колдонулат. Бул мурункуга окшош, башка пакеттерде жайгашкан тукум класстарда көрүнүүгө уруксат берилгендигин эске албаганда;
  • private - бардык модификаторлордун эң купуясы, элементке учурдагы класстын ичинде гана кирүүгө мүмкүндүк берет.
Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-2-бөлүк

40. Статикалык жана өзгөрмөлүү методдордун негизги өзгөчөлүгүн атаңыз

Абдан кызык формула - "өзгөрмө ыкмалары". Албетте, бул кадимки, статикалык эмес ыкмаларга тиешелүү. Демек, негизги айырмачылык статикалык методдор класска таандык жана чындыгында алар үчүн бул класстын үлгүсүн түзүүнүн кереги жок: аны класстын түрүн колдонуу менен гана чакырса болот. Мисалы, мышыкты эркелетүүнүн статикалык ыкмасы бар:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Аны чакыруу үчүн бизге CatService классынын үлгүсү керек эмес :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Кадимки методдор an objectке (тиешелүү) байланыштуу жана аларды чакыруу үчүн сизде метод чакырыла турган инстанция (an object) болушу керек. Мисалы, мышыктын статикалык эмес ыкмасы бар - мияулоо:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Бул ыкманы чакыруу үчүн, бизге мышыктын белгилүү бир мисалы керек:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Статикалык жана “өзгөрмө” методдорго кандай негизги чектөөлөр кирет?

Мен жогоруда айткандай, регулярдуу методдун негизги чектөөсү - бул методду чакыра турган кандайдыр бир инстанция болушу керек. Бирок статикалык метод муну талап кылbyte, бирок ал бул шилтемеге - учурдагы an objectтин элементтерине - шилтеме кыла алbyte, анткени ал үчүн учурдагы an object жок.

42. Статикалык ачкыч сөз эмнени билдирет? Статикалык ыкманы жокко чыгаруу же ашыкча жүктөө мүмкүнбү?

Static ачкыч сөзү менен белгиленген элемент класстын an objectисине эмес, класска таандык жана класстын өзү жүктөлгөндө жүктөлөт. Статикалык элементтер бүткүл программа үчүн гана, ал эми кадимки элементтер белгилүү бир an object үчүн гана. Статикалык болушу мүмкүн:
  • класс талаалары;
  • классты инициализациялоо блогу;
  • класс методу;
  • класстын ички класстары (бирок, бул дагы эле тавтология).
Статикалык методду жокко чыгарууга болбойт: ал класска таандык жана тукум кууbyte, бирок ошол эле учурда ашыкча жүктөлүшү мүмкүн.

43. Метод бир эле учурда статикалык жана абстракттуу боло алабы?

Мен муну мурунку макалада айтканмын: метод бир эле учурда абстракттуу жана статикалык боло алbyte. Методдун абстракттуулугу анын мураскерде жокко чыгарылышын билдирет. Ошол эле учурда статикалык метод класска таандык жана аны жокко чыгарууга болбойт: бул карама-каршылыкты пайда кылат, аны компилятор көрүп, каргап баштайт. Эгер сизде ушундай жагдай болсо, анда сиз колдонмоңуздун архитектурасынын тууралыгы жөнүндө олуттуу ойлонушуңуз керек (анткени, анда бир нерсе туура эмес).Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-3-бөлүк

44. Статикалык ыкмаларды кадимки методдордун ортосунда колдонууга болобу? Тескерисинче? Неге?

Статикалык ыкмаларды кадимки ыкмаларда колдонсо болот, анткени буга эч нерсе тоскоол болбойт. Ошол эле учурда, тескери жагдай мүмкүн эмес: статикалык метод бул класстын белгилүү бир инстанциясына шилтемесиз кадимки ыкманы колдоно алbyte. Жана биз эсибизде тургандай, бул шилтеме статикалык класстын мүчөлөрү үчүн жеткorктүү эмес: класстын спецификалык an objectилери сиз каалагандай көп болушу мүмкүн жана алардын ар биринин ичинде өзүнө шилтеме болот - this . Анан кантип бул шилтемени алуу керек экенин кантип түшүнөсүз ? Бирок жол жок. Демек, статикалык элементтер конкреттүү an objectке шилтемесиз статикалык эмес элементтерге кайрыла алbyte. Чынында, статикалык ыкма статикалык эмес ыкманы, эгерде ал белгилүү бир an objectке шилтемеси бар болсо гана колдоно алат. Мисалы, аргумент катары келген:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Бул жерде биз petTheCat статикалык ыкмасы Cat an objectинин нормалдуу, статикалык эмес ыкмасын чакырарын көрөбүз - getName .

45. Интерфейс деген эмне? Акыркы интерфейс болушу мүмкүнбү?

Эсибизде тургандай, Javaда бир нече мурас жок. Интерфейстер ага альтернатива болуп саналат. Интерфейс абдан чечкиндүү класска окшош. Алар бул интерфейстерди ишке ашыруучу (ишке ашыруучу) класстар тарабынан ишке ашырылуучу конкреттүү ишке ашыруусуз функционалдуулукту аныкташат. Интерфейс мисалы:
public interface Animal {
    void voice();
}
Класс тарабынан интерфейсти ишке ашыруунун мисалы:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Интерфейстерди колдонуу боюнча сиз бorшиңиз керек болгон негизги нерсе:
  1. Интерфейс ыкмалары белгилүү бир методдун корпусу жок башты гана камтышы керек, б.а. абстракттуу болушу керек (бирок абстракттуу ачкыч сөздү колдонбостон ). Мунун өзгөчөлүгү статикалык жана демейки методдор болуп саналат, алар методдун корпусун талап кылат.
  2. Класс көптөгөн интерфейстерди ишке ашыра алат (мен айткандай, бул бир нече мураска альтернатива), алар үтүр менен бөлүнгөн: класс Lion Animal, Wild ишке ашырат .
  3. Интерфейстер - интерфейс ачкыч сөзүнүн жардамы менен түзүлөт .
  4. Класс интерфейсин ишке ашырууда, ачкыч сөз аткарылат .
  5. Белгилүү бир интерфейсти ишке ашырган класс анын бардык абстрактуу ыкмаларын ишке ашырышы керек же өзүн абстракттуу деп жарыялоосу керек.
  6. Интерфейстерди колдонуунун негизги максаты - полиморфизмди (an objectтердин көп формага ээ болуу жөндөмдүүлүгүн) ишке ашыруу.
  7. Эреже катары, методдорго кирүү модификаторлору интерфейсте жазылbyte: алар демейки боюнча коомдук болуп саналат жана жалпыга ачык эмес башка модификаторлорду көрсөтүү мүмкүн эмес. Java 9 бери, сиз ыкмалар үчүн жеке өзгөрткүчтөрдү колдоно аласыз .
  8. Интерфейс өзгөрмөлөрү демейки боюнча статикалык акыркы болуп саналат , башкача айтканда, туруктуулар: алар дайыма интерфейсте түз инициализацияланышы керек.
  9. Сиз интерфейс an objectин түзө албайсыз.
Интерфейстердин акыркы болушу мүмкүнбү деген суроого жооп, албетте, жок. Анткени, интерфейстердин маңызын ишке ашыруу керек. Жана баарыбыз жакшы эсибизде болгондой, класстык деңгээлдеги жыйынтык аны тукум куучулук эмес, ал эми интерфейс болгон учурда ишке ашыруу мүмкүн эмес кылат. Эмне үчүн бизге ишке ашырууга жана колдонууга мүмкүн болбогон интерфейс керек? Туура - кереги жок! Жана компилятор ушинтип ойлойт)) Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-4-бөлүкМааниси Java 8 менен интерфейстерде статикалык ыкмаларды киргизүү менен гана пайда болгон, бирок бул интерфейстин акыркы болушу мүмкүн эместигин өзгөрткөн жок. Мен интерфейстер жөнүндө үстүртөн сүйлөштүм, анткени... бул кенен тема. Бул тууралуу Javaдагы интерфейстер жана абстракттуу класстар менен интерфейстердин айырмасы жөнүндө макалалардан окуңуз .

46. ​​Мен статикалык талааларды кайдан баштасам болот?

Статикалык талааларды инициализациялоого болот:
  • түздөн-түз декларация боюнча, барабар белгиси аркылуу = ;
  • статикалык инициализация блогунда;
  • статикалык эмес инициализация блогунда, бирок сиз an object түзүлгөн сайын бул талаа ушул инициализация блогу менен кайра жазыларын түшүнүшүңүз керек;
  • класстын конструкторунда. Бул конструкторду чакырган сайын (б.а. an object ушул конструктор аркылуу түзүлгөндө) бул талаанын үстүнө жазылат;
  • статикалык методдордо;
  • статикалык эмес методдордо;
  • ички статикалык жана статикалык эмес, жергorктүү жана анонимдүү класстарда.

47. Анонимдүү класстар деген эмне?

Анонимдүү класстар – өз түрү жок класстар. Мен эмне жөнүндө айтып жатам? Биз интерфейстер жөнүндө сөз кылганда, мен сиз интерфейс an objectин түзө албайсыз деп айттым: интерфейсти ишке ашырган класстын an objectин гана түзө аласыз. Эгерде сиз класста интерфейсти ишке ашырууну каалабасаңыз, бирок сизге дагы эле интерфейс тибиндеги an object керек болсочу? Жана, кыязы, бул an objectти колдонуунун жалгыз учуру болот. Жана толук кандуу ишке ашыруу классын түзүүнүн кереги жок. Муну кантип кыласың? Туура! Анонимдүү класс аркылуу! Бизде AnimalJava иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-5-бөлүк интерфейси бар дейли :
public final interface Animal {
   public void voice();
}
Эгерде биз бул интерфейсти анонимдүү класс аркылуу түзгүбүз келсе:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Ошондо сиз бул an objectти жана анын ишке ашырылган ыкмасын коопсуз колдоно аласыз - добуш . Башкача айтканда, анонимдүү класс бул интерфейсти жана анын бардык абстрактуу ыкмаларын ушул жерде жана азыр ишке ашырат. Болбосо, интерфейс/абстрактуу класс an objectисин түзө албайбыз, анткени ишке ашырылбаган/абстрактуу методдор бар. Мен белгилегендей, анонимдүү класстар интерфейстин абстрактуу ыкмаларын ишке ашыруу үчүн гана эмес, абстракттуу класстын абстрактуу ыкмаларын ишке ашыруу үчүн да колдонулат. Бул ыкма an object бир жолку колдонулган же методдордун берилген ишке ашырылышы бир гана жолу талап кылынган жагдайлар үчүн жакшы жана талап кылынган абстракттуу классты/интерфейсти ишке ашыра турган өзүнчө классты түзүүнүн кереги жок. Бирок мен анонимдүү класстарды колдонуу жумушта сейрек кездешүүчү көрүнүш экенин белгилей кетейин: эреже катары, дагы эле жөнөкөй класстарга артыкчылык берилет. Анонимдүү класстар тууралуу кененирээк бул макаладан окуй аласыз .

48. Примитивдик класстар деген эмне?

Мага келсек, бул абдан кызык суроо жана, балким, бул капкан суроо, анткени Javaда примитивдик класстар деген нерсе жок: балким, биз мурда карап чыккан примитивдүү типтер түшүнүгүнөн башкасы. Эсибизде болгондой, Javaда 8 примитивдүү тип бар - byte , short , int , long , float , double , char , логикалык .Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-6-бөлүк

49. “Ороочу” класс деген эмне?

Java'да примитивдүү типтерди колдонуудагы негизги көйгөй - алар дагы эле класстар эмес жана Java дагы эле OOP тor болуп саналат. Башкача айтканда, бул тилде жазылган программалар an objectтердин ортосундагы өз ара аракеттенүүгө кыскарган. Ооба, примитивдер an object эмес. Алардын методдору жок, жада калса Object классынын стандарттуулары да жок . Картада ачкыч катары примитивди колдонуу керек болсочу ? Андан кийин hashCode ыкмасын чакырышыңыз керек . Сиз ошондой эле барабар ыкмасын чакыра аласыз . Анда эмне? Примитив эмес, класс болушу керек болгон учурлар абдан көп болушу мүмкүн, бул примитивдерди программада колдонулбаган жана керексиз элементтерге айлантат, анткени бул OOP идеясын жок кылат. Бирок баары көрүнгөндөй жаман эмес. Анткени, Java примитивдүү орогуч деген түшүнүккө ээ. Ар бир примитивдүү типтин аналогдук классы бар:
  • byte -> Байт.класс
  • short -> Short.class
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Character.class
  • boolean -> Boolean.class
Бул жөнөкөй түрлөрүнүн өкүлчүлүгү, бирок ар түрдүү жана функционалдык ыкмалардын бир тутам менен толук кандуу класстар түрүндө. Бул класстарды ыңгайлуу колдонуу үчүн автобокс жана кутудан чыгаруу түшүнүктөрү киргизилген. Autoboxing - зарыл болсо, примитивдик типти аналогдук класска автоматтык түрдө өзгөртүү (мисалы, int бүтүн санга ). Кутудан чыгаруу - бул мурункуга тескери процесс: примитив орогуч классын примитивдик түргө автоматтык түрдө которуу (мисалы, Integer to int ). Примитивдик орогуч класстарын жана автобокс жана кутудан чыгаруу процесстерин киргизүүнүн аркасында примитивдик типтер OOP тorнин - Java тorнин толук кандуу мүчөсү боло алышты. Бул тема тууралуу көбүрөөк билүү үчүн, мен бул макаланыJava иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-7-бөлүк окууну сунуштайм .

50. Nested класс деген эмне? Качан колдонулат?

Уюшкан класс - бул башка класстын мүчөсү болгон ички класс. Java тorнде мындай ички класстардын 4 түрү бар: 1. Ички класс Класстын бул түрү түздөн-түз башка класстын денесинде жарыяланган. Уюшкан ички класс сырткы класстын үлгүсүнүн каалаган жеке талаасына же ыкмасына кире алат. Мисал катары, зоопарк түзөлү, анда бизде жаныбар - зебра болот:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Эч нерсе татаал, туурабы? Ички класс an objectисин түзүүнүн мисалын карап көрөлү:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Көрүнүп тургандай, рамка классынын an objectисин түзүү зарыл, анын негизинде сиз ички класстын an objectисин түзө аласыз. Мен ошондой эле уяланган ички класста статикалык методдор же статикалык талаалар болушу мүмкүн эмес экенин белгилегим келет . Себеби, ички класс өзүнүн сырткы классынын an objectи менен кыйыр түрдө байланышкан жана ал өзүнүн ичинде эч кандай статикалык ыкмаларды жарыялай алbyte. 2. Статикалык уяланган класстар Бул класс мурунку класска окшош, болгону класс декларациясынын жанында статикалык мүмкүндүк модификатору бар. Мындай класстын тышкы класстын статикалык эмес талааларына кирүү мүмкүнчүлүгү болбогондуктан, ал ички класска караганда сырткы класстын статикалык бөлүгүнө көбүрөөк окшош. Бул учурда класстын маалыматтары сырткы класстын бардык статикалык мүчөлөрүнө, атүгүл купуяларга да кире алат. Статикалык уя класстын мисалы:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
түзүү ыкмасы мурунку бир аз айырмаланат:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Бул жерде уя статикалык класстын an objectисин түзүү үчүн бизге тышкы класстын an objectисинин кереги жок. Сырткы класстан бизге анын түрү гана керек, ошондо биз уяланган класстын ордун таба алабыз. 3. Локалдык класстар Локалдык класстар - бул методдун корпусунун ичинде жарыяланган класстар жана локалдык класстын an objectисин түзүү жана колдонуу ушул методдун алкагында гана мүмкүн. Мисал:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
Колдонуу мисалы:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
toFeed ыкмасынын codeун көрбөй туруп , сиз жергorктүү класстын бар экенине шек санабайсызбы? Жергorктүү класс статикалык же убактылуу болушу мүмкүн эмес, бирок аны абстракттуу же акыркы деп белгилесе болот (ЖЕ гана, анткени бул эки өзгөрткүчтү колдонуу чыр-чатакты жаратат). 4. Анонимдүү класстар Биз жогоруда анонимдүү класстар жөнүндө сөз кылганбыз жана эсиңизде болсо, алар эки булактан түзүлүшү мүмкүн - интерфейстер жана класстар. Ички статикалык жана статикалык эмес класстарды колдонуунун себептери колдонулат, анткени кээде кичине класстарды чоңураак класстардын ичине киргизип, аларды чогуу кармап туруу жакшы болот: ушундай жол менен алар жогорку биримдикке жана жалпы максатка ээ болот. Чынында, уя класстарды колдонуу codeдун инкапсуляциясын жогорулатат. Жергorктүү класстарды тандоонун себеби бул класстын бир гана методдун алкагында колдонулушу болушу мүмкүн. Мындай учурда codeду тиркеме боюнча жайылтуу керекпи? Жок. Бирок ошол эле учурда мен өзүмдүн практикамда жергorктүү класстарды колдонууну көргөн эмесмин, анткени аларга болгон муктаждык абдан талаштуу. Ооба, анонимдүү класстарды колдонуунун себеби, интерфейстин же абстракттуу класстын конкреттүү ишке ашырылышы бир гана жолу талап кылынышы мүмкүн, андыктан бул үчүн ишке ашыруу менен өзүнчө, толук кандуу классты түзүүнүн кереги жок. Тескерисинче, жөнөкөй жол менен, биз анонимдүү класс аркылуу бизге керектүү ыкма(ларды) ишке ашырдык, бул an objectти колдонуп, ал жөнүндө унутуп калдык (жакшы, таштанды жыйноочу бул жөнүндө эстеп калды). Бул жана булJava иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-8-бөлүк макала сизге ички класстарды тереңирээк изилдөөгө жардам берет .

51. Класс кандай кирүү модификаторлоруна ээ болушу мүмкүн?

Эсибизде тургандай, класстардын ар кандай түрлөрү бар жана аларга ар кандай мүмкүнчүлүк модфикаторлору колдонулат:
  • сырткы класс кирүү модификаторуна ээ болушу мүмкүн же модификаторсуз болушу мүмкүн (демейки модификатор);
  • ички класс бардык 4 мүмкүндүк модфикаторлорду колдойт;
  • уяланган статикалык класс корголгондон башка бардык кирүү модификаторлорун колдойт , анткени бул модификатор класстын статикалык мүчөсүнө карама-каршы келген мурасты билдирет (статикалык элементтер тукум кууbyte);
  • локалдык класстын демейки өзгөрткүчү гана болушу мүмкүн (б.а. эч кандай өзгөрткүч жок);
  • анонимдүү класс : эгерде класстын түрү декларациясы жок болсо, анда эч кандай мүмкүндүк модфикаторлору жок.
Бул жерде биз бүгүн токтойбуз. Жакында көрүшкөнчө!Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  5-9-бөлүк
Сериядагы башка материалдар:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION