JavaRush /Java Blog /Random-TL /Pagsusuri ng mga tanong at sagot mula sa mga panayam para...

Pagsusuri ng mga tanong at sagot mula sa mga panayam para sa developer ng Java. Bahagi 5

Nai-publish sa grupo
Hello, hello! Ngayon, ang mga developer ng Java ay mataas ang demand. Siyempre, hindi kita mabibigyan ng bakante, ngunit susubukan kong tulungan kang makakuha ng bagong kaalaman at isara ang ilang mga puwang. Kaya patuloy kaming nagsusuri ng 250+ na tanong sa panayam para sa developer ng Java. Ang mga link sa mga nakaraang bahagi ng pagsusuri ay nasa dulo ng artikulo.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 1

39. Ano ang mga access modifier sa Java? Pangalanan sila. Ano ang ginagamit ng mga ito?

Inilarawan ko dati ang mga modifier ng pag-access sa tanong tungkol sa mga elemento ng Java encapsulation. Pero ipapaalala ko pa rin sa iyo. Ang mga modifier ng access sa Java ay mga keyword na naglalarawan sa antas ng access na ibinigay sa isang partikular na bahagi ng Java. Ang mga modifier ng access ay maaaring:
  • pampubliko — ang isang elemento na may ganitong modifier ay maa-access ng publiko. Yung. mga patlang at pamamaraan, ang mga klase na idineklara gamit ang pampublikong modifier ay makikita ng ibang mga klase kapwa mula sa kasalukuyang pakete at mula sa mga panlabas na pakete;
  • protektado - ang isang elemento na may ganitong modifier ay maa-access mula sa kahit saan sa kasalukuyang klase ng kasalukuyang package o sa mga descendant na klase, kahit na sila ay nasa ibang mga pakete;
  • default , o nawawalang modifier - ang modifier na ito ay implicitly na ginagamit kapag hindi tinukoy ang access modifier. Ito ay katulad ng nauna, maliban na ang visibility ay pinapayagan sa mga descendant na klase na nasa iba pang mga pakete;
  • pribado ay ang pinakapribado sa lahat ng mga modifier, na nagbibigay-daan sa pag-access sa elemento sa loob lamang ng kasalukuyang klase.
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 2

40. Pangalanan ang pangunahing katangian ng mga static at variable na pamamaraan

Isang napaka kakaibang pagbabalangkas - "mga variable na pamamaraan". Tiyak na ito ay tumutukoy sa mga ordinaryong, non-static na pamamaraan. Kaya, ang pangunahing pagkakaiba ay ang mga static na pamamaraan ay kabilang sa klase at, sa katunayan, para sa kanila hindi mo kailangang lumikha ng isang halimbawa ng klase na ito: maaari lamang itong tawagin gamit ang uri ng klase. Halimbawa, mayroon kaming static na paraan para maalagaan ang pusa:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Hindi namin kailangan ng isang instance ng klase ng CatService para tawagin itong :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Habang ang mga ordinaryong pamamaraan ay nakasalalay sa (pag-aari) ng isang bagay, at upang matawag ang mga ito, dapat kang magkaroon ng isang halimbawa (object) kung saan tatawagin ang pamamaraan. Halimbawa, ang isang pusa ay may non-static na pamamaraan - ngiyaw:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Upang tawagan ang paraang ito, kailangan namin ng isang partikular na halimbawa ng pusa:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Ano ang mga pangunahing paghihigpit sa mga static at "variable" na pamamaraan?

Tulad ng sinabi ko kanina, ang pangunahing limitasyon ng isang regular na pamamaraan ay dapat palaging mayroong ilang pagkakataon kung saan tatawagin ang pamamaraan. Ngunit ang isang static na pamamaraan ay hindi nangangailangan nito, ngunit hindi ito maaaring sumangguni sa sanggunian na ito - sa mga elemento ng kasalukuyang bagay - dahil ang kasalukuyang bagay ay hindi umiiral para dito.

42. Ano ang ibig sabihin ng static na keyword? Maaari bang ma-override o ma-overload ang isang static na paraan?

Элемент, обозначенный ключевым словом static, принадлежит не an objectу класса, а именно классу, и он загружается при загрузке самого класса. Статические элементы — единственные на всю программу, а обычные — единственные на конкретный an object. Статическими могут быть:
  • поля класса;
  • блок инициализации класса;
  • метод класса;
  • внутренние классы класса (однако, та ещё тавтология).
Статический метод нельзя переопределить: он принадлежит классу и не наследуется, но в то же время его можно перегрузить.

43. Может ли метод быть статическим и абстрактным одновременно?

В предыдущей статье я это уже упоминал: метод не может быть абстрактным и статическим одновременно. Абстрактность метода подразумевает, что он должен быть переопределен в наследнике. В то же время статический метод принадлежит классу, и его нельзя переопределить: это вызовет противоречие, которое увидит компилятор и начнет ругаться. Если у вас возникла такая ситуация, стоит всерьёз задуматься о правильности построения архитектуры вашего applications (ведь с ней явно что-то не так).Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 3

44. Можно ли использовать статические методы в середине обычных? Наоборот? Почему?

Статические методы можно использовать в обычных, так How этому ничего не препятствует. В то же время обратная ситуация невозможна: статический метод не может использовать обычный метод, не имея ссылки на конкретный экземпляр данного класса. А How мы помним, для статических членов класса link this недоступна: конкретных an objectов класса может быть сколько угодно, и у каждого из них внутри будет link на самого себя — this. И How тогда понять, Howую именно ссылку this нужно взять? А ниHow. Поэтому и статические элементы не могут ссылаться на нестатические, без ссылки на конкретный an object. Собственно, статический метод может использовать не статический, только если имеет ссылку на конкретный an object. Например ту, которая пришла в качестве аргумента:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Тут мы видим, что в статическом методе petTheCat вызывается обычный, нестатический метод an object CatgetName.

45. What такое interface? Может ли быть final interface?

Как мы помним, в Java нет множественного наследования. Интерфейсы — это что-то вроде его альтернативы. Интерфейс похож на очень урезанный класс. Они определяют функционал без конкретной реализации, который реализуют классы, имплементирующие (реализующие) эти интерфейсы. Пример интерфейса:
public interface Animal {
    void voice();
}
Пример реализации интерфейса классом:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Главное, что нужно знать об использовании интерфейсов:
  1. Методы интерфейса должны содержать только заголовок, без конкретного тела метода, т.е. должны быть абстрактными (но без применения ключевого слова abstract). Исключение из этого — статические и дефолтные методы, для которых необходимо иметь тело метода.
  2. Класс может реализовывать множество интерфейсов (How и говорил, это альтернатива множественному наследованию), которые прописываются через запятую: class Lion implements Animal, Wild.
  3. Интерфейсы создаются при помощи ключевого слова — interface.
  4. При реализации интерфейса классом используется ключевое слово — implements.
  5. Класс, который реализует определенный интерфейс, обязан реализовать все его абстрактные методы, либо должен объявить себя абстрактным.
  6. Основная цель использования интерфейсов — реализация полиморфизма (способность an objectов принимать множество форм).
  7. В интерфейсе, How правило, не пишут модификаторы доступа для методов: они по умолчанию public, и другие модификаторы, отличные от public, задавать нельзя. Начиная с Java 9 можно использовать private модификаторы для методов.
  8. Переменные интерфейсов по умолчанию static final, иначе говоря — константы: их всегда нужно проинициализировать непосредственно в интерфейсе.
  9. Нельзя создать an object интерфейса.
Ответ на вопрос, могут ли быть интерфейсы финальными — конечно же, нет. Ведь сама суть интерфейсов в том, чтобы их реализовывали. А How мы все прекрасно помним, final на уровне класса делает его не наследуемым, и в случае с интерфейсом — не реализуемым. А зачем нам интерфейс, который нельзя реализовать и использовать? Верно — незачем! И компилятор так считает))Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 4Смысл разве что появился с введением статических методов в интерфейсы с Java 8, но это не изменило того факта, что интерфейс не может быть финальным. Про интерфейсы я рассказал, очень поверхностно, т.к. это обширная тема. Подробнее об этом — в статьях об интерфейсах в Java и разнице между абстрактными классами и интерфейсами.

46. Где можно инициализировать статические поля?

Статические поля можно инициализировать:
  • непосредственно при объявлении, через знак equalsства =;
  • в статическом блоке инициализации;
  • в нестатическом блоке инициализации, но при этом вы должны понимать что при каждом создании an object данное поле будет перезаписываться этим блоком инициализации;
  • в конструкторе класса. При каждом вызове данного конструктора (т.е. при создании an object через этот конструктор) данное поле будет перезаписываться;
  • в статических методах;
  • в нестатических методах;
  • во внутренних статических и нестатических, локальных и анонимных классах.

47. What такое анонимные классы?

Анонимные классы — это классы, у которых нет собственного типа. О чем это я? Когда мы говорor об интерфейсах, я упомянул, что нельзя создать an object интерфейса: можно лишь создать an object класса, который реализует интерфейс. А что если вы не хотите реализовывать интерфейс в Howом-то классе, но при этом вам нужен an object типа интерфейса? И скорее всего, это будет единичный случай использования данного an object. И у вас нет нужды создавать полноценный класс реализацию. Как вы это сделаете? Правильно! Через анонимный класс!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 5Предположим, у нас есть некоторый интерфейс Animal:
public final interface Animal {
   public void voice();
}
Если мы хотим создать экземпляр данного интерфейса через анонимный класс:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
И далее вы можете спокойной использовать данный an object и его реализованный метод — voice. То есть анонимный класс реализует данный интерфейс и все его абстрактные методы прямо здесь и сейчас. Иначе нам не создать an object интерфейса/абстрактного класса, так How присутствуют не реализованные/абстрактные методы. Как я упомянул, анонимные классы используются не только для реализации абстрактных методов интерфейса, но и для реализации абстрактных методов абстрактного класса. Данный подход хорош для ситуаций, когда an object используется разово or данная реализация методов нужна только единожды, и нет нужды создавать отдельный класс, который будет реализовывать необходимый абстрактный класс/интерфейс. Но также отмечу, что использование анонимных классов — редкое явление в работе: How правило предпочтение все же отдается обычным классам. Подробнее об анонимных классах можно почитать вот в этой статье.

48. What такое примитивные классы?

Как по мне, это весьма странный вопрос и, возможно, это такой вопрос-ловушка, ведь в Java нет такого понятия How примитивные классы: разве что есть понятие примитивные типы, которое мы уже рассматривали ранее. Как мы помним, в Java есть 8 примитивных типов — byte, short, int, long, float, double, char, boolean.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 6

49. What такое класс «обертка» (wrapper)?

Главная проблема использования примитивных типов в Java — это то, что они все же не классы, а Java — всё же ООП язык. То есть программы, написанные на этом языке, сводятся к взаимодействию между an objectми. Ну а примитивы — это не an objectы. У них нет методов, даже стандартных от класса Object. Ну а если нам понадобилось использовать примитив How ключ в Map? Тогда у него нужно вызвать метод hashCode. Также там можно вызвать метод equals. What тогда? Моментов, где должен быть именно класс, а не примитив, может быть очень и очень много, что делает примитивы неиспользуемыми и нежелательными elementми в программе, ведь это рушит саму идею ООП. Но не всё так плохо, How кажется. Ведь в Java есть понятие обертки примитивов. У каждого примитивного типа есть класс-аналог:
  • byte -> Byte.class
  • short -> Short.class
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Character.class
  • boolean -> Boolean.class
Это представление простых типов, но в виде полноценных классов с кучей разнообразных и функциональных методов. Для удобного использования этих классов ввели понятия autoboxing и unboxing. Autoboxing — автоматическое преобразование примитивного типа в класс-аналог при надобности (например, int в Integer). Unboxing — процесс, обратный предыдущему: автоматическое преобразование класса-обертки примитива к примитивному типу (например, Integer к int). Благодаря введению классов-оберток примитивов и процессов autoboxing-а и unboxing-а, примитивные типы смогли стать полноценными членами ООП языка — Java.Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 7Whatбы ознакомиться с этой темой подробнее, настойчиво рекомендую почитать вот эту статью.

50. What такое Nested class? Когда он используется?

Nested class — внутренний класс, который является членом другого класса. В Java существует 4 вида таких внутренних классов: 1. Внутренний класс Данный вид классов объявляется непосредственно в теле другого класса. Вложенный внутренний класс может получить доступ к любому приватному полю or методу экземпляра внешнего класса. В качестве примера, создадим зоопарк, в котором у нас будет животное — зебра:
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 внутреннего класса. Также хотелось бы отметить, что вложенный внутренний класс не может иметь в себе статических методов or статических полей. Именно потому, что внутренний класс неявно связан с an objectом своего внешнего класса, и он не может объявлять ниHowих статических методов внутри себя. 2. Статические вложенные классы Данный класс схож с предыдущим, только у него модификатор доступа static возле объявления класса. Так How у этого вида классов нет доступа к не статическим полям внешнего класса, он больше похож на статическую часть внешнего класса, чем на внутренний класс. При этом у данных класса есть доступ ко всем статическим членам внешнего класса, даже к приватным. Пример статического вложенного класса:
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("зебра", "яблоко");
Не видя code метода toFeed, вы бы и не заподозрor о существовании локального класса, не так ли? Локальный класс не может быть static or transient, но его можно пометить How abstract or final (только ИЛИ, т.к. использование этих двух модификаторов приведет к конфликту). 4. Анонимные классы Про анонимные классы мы уже говорor выше, и How вы помните, их можно создать из двух источников — интерфейсы и классы. Причины использования Внутренние статические и не статические классы используют потому, что иногда лучше встроить небольшие классы в более общие и хранить их вместе: так у них будет более высокая связанность и общая цель. Собственно, использование вложенных классов увеличивает инкапсуляцию codeа. Причиной выбора локальных классов может послужить то, что данный класс используется исключительно в пределах одного метода. Нужно ли в таком случае размазывать code по приложению? Нет. Но при этом добавлю, что в своей практике я ни разу не видел использование локальных классов, т.к. потребность в них весьма спорная. Ну а причиной использования анонимных классов может быть то, что конкретная реализация интерфейса or абстрактного класса будет необходима лишь единожды, поэтому нет нужды создавать под это отдельный, полноценный класс с реализацией. Взамен — по-простому — реализовали нужный нам метод(ы) через анонимный класс, использовали этот an object и забыли о нем (ну а Garbage collector о нем вспомнил).Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 8Изучить внутренние классы подробнее вам помогут эта и эта статьи.

51. Какие модификаторы доступа могут быть у класса?

Как мы помним, существуют разные виды классов и для них применимы разные модификаторы доступа:
  • внешний класс может иметь модификатор доступа public or быть без модификатора (модификатор по умолчанию);
  • внутренний класс поддерживает все 4 модификатора доступа;
  • вложенный статический класс поддерживает все модификаторы доступа, кроме protected, т.к. данный модификатор подразумевает наследование, что противоречит статическому члену класса (статические элементы не наследуются);
  • локальный класс может быть только с модификатором по умолчанию (т.е. без модификатора вовсе);
  • анонимный класс: отсутствует объявление типа класса, то и модификаторы доступа отсутствуют вовсе.
На этом мы сегодня и сделаем остановочку. See you soon!Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 5 - 9
Другие материалы серии:
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION