Вопрос про анонимные классы. Какие из этих утверждений верны?
A. Анонимный класс может указывать абстрактный класс в качестве своего базового типа.
B. Анонимный класс может указывать интерфейс в качестве своего базового типа.
С. Анонимный класс может указывать одновременно абстрактный класс и интерфейс в качестве своих базовых типов.
D. Анонимный класс всегда может быть заменен лямбда-выражением.
E. Анонимному классу нужен конструктор без аргументов для своего родительского класса.
A. Анонимный класс может указывать абстрактный класс в качестве своего базового типа.
B. Анонимный класс может указывать интерфейс в качестве своего базового типа.
С. Анонимный класс может указывать одновременно абстрактный класс и интерфейс в качестве своих базовых типов.
D. Анонимный класс всегда может быть заменен лямбда-выражением.
E. Анонимному классу нужен конструктор без аргументов для своего родительского класса.
Статистика языков программирования
Сотрудники HeadHunter провели исследование и вычислили самые востребованные языки программирования в России. Они посчитали упоминания в вакансиях и резюме, вычислили средние зарплаты и разложили всё по табличкам. Короч получилась интересная статья
https://habr.com/company/hh/blog/418079/
Коротко: Джава в топах, в Москве и Питере сосредоточились больше половины вакансий для программистов
Сотрудники HeadHunter провели исследование и вычислили самые востребованные языки программирования в России. Они посчитали упоминания в вакансиях и резюме, вычислили средние зарплаты и разложили всё по табличкам. Короч получилась интересная статья
https://habr.com/company/hh/blog/418079/
Коротко: Джава в топах, в Москве и Питере сосредоточились больше половины вакансий для программистов
Почему
Самый главный вопрос, который должен задавать разработчик - «почему?» Почему технология так устроена? Почему в проекте используется именно эта либа? Почему метод так работает?
Умение задавать себе и окружающим вопрос «почему?» помогает докапываться до первопричины и расти, как специалисту. И наоборот, если не искать причин и полагаться на магию, то крутым спецом не стать.
Самый главный вопрос, который должен задавать разработчик - «почему?» Почему технология так устроена? Почему в проекте используется именно эта либа? Почему метод так работает?
Умение задавать себе и окружающим вопрос «почему?» помогает докапываться до первопричины и расти, как специалисту. И наоборот, если не искать причин и полагаться на магию, то крутым спецом не стать.
Final
• От final классов нельзя наследоваться. Соответственно методы такого класса не будут переопределены. Пример: класс
• Final методы нельзя переопределять в подклассах. Методы нужно делать final, когда мы хотим, чтобы их реализация не изменялась.
• Final переменные не могут быть изменены: примитивам нельзя присвоить другое значение, ссылочным - ссылку на другой объект.
• Если final переменная содержит ссылку на объект, то объект можно изменять, но переменная всегда будет ссылаться на тот же самый объект.
• Final аргументы метода предназначены только для чтения. Если попытаться изменить их, то произойдет ошибка компиляции.
• Конструктор не может быть static, abstract или final
• От final классов нельзя наследоваться. Соответственно методы такого класса не будут переопределены. Пример: класс
String
.• Final методы нельзя переопределять в подклассах. Методы нужно делать final, когда мы хотим, чтобы их реализация не изменялась.
• Final переменные не могут быть изменены: примитивам нельзя присвоить другое значение, ссылочным - ссылку на другой объект.
• Если final переменная содержит ссылку на объект, то объект можно изменять, но переменная всегда будет ссылаться на тот же самый объект.
• Final аргументы метода предназначены только для чтения. Если попытаться изменить их, то произойдет ошибка компиляции.
• Конструктор не может быть static, abstract или final
Super
В Джаве ключевое слово
В Джаве ключевое слово
super
обозначает суперкласс. Его нужно использовать, когда хотите вызвать конструктор суперкласса или обратиться к члену суперкласса, который скрыт членом подкласса. Вызов super()
должен быть первым оператором в конструкторе, если мы его используем.Static nested class
Определение класса можно размещать внутри другого класса. Существует два типа таких классов - статические и нестатические. Область видимости внутренних классов ограничена областью видимости внешнего класса.
Если нам не нужна связь между объектом внутреннего класса и объектом внешнего класса, то делаем внутренний класс статическим. Он называется
• вложенный класс имеет доступ к статическим свойствам и методам внешнего класса, включая private.
• из объекта вложенного класса нельзя обращаться к нестатическим членам внешнего
• чтобы создать объект вложенного класса, не нужен объект внешнего
Пример вложенного класса в jdk -
Определение класса можно размещать внутри другого класса. Существует два типа таких классов - статические и нестатические. Область видимости внутренних классов ограничена областью видимости внешнего класса.
Если нам не нужна связь между объектом внутреннего класса и объектом внешнего класса, то делаем внутренний класс статическим. Он называется
static nested class
, в русском переводе - вложенный
.• вложенный класс имеет доступ к статическим свойствам и методам внешнего класса, включая private.
• из объекта вложенного класса нельзя обращаться к нестатическим членам внешнего
• чтобы создать объект вложенного класса, не нужен объект внешнего
Пример вложенного класса в jdk -
HashMap.Node
Inner class
Нестатические внутренние класса называются
• Внутренний класс имеет доступ ко всем переменным и методам своего внешнего класса
• Может содержать только нестатические методы и поля
• Если хотим получить ссылку на объект внешнего класса, то нужно написать
• Пример внутреннего класса в jdk -
Для более глубокого понимания внутренних классов прочитайте в Effective Java главу "Предпочитайте статические классы-члены нестатическим".
Нестатические внутренние класса называются
inner classes
, в русском переводе - просто внутренние
.• Внутренний класс имеет доступ ко всем переменным и методам своего внешнего класса
• Может содержать только нестатические методы и поля
• Если хотим получить ссылку на объект внешнего класса, то нужно написать
OuterClass.this
• Пример внутреннего класса в jdk -
HashMap.KeySet
Для более глубокого понимания внутренних классов прочитайте в Effective Java главу "Предпочитайте статические классы-члены нестатическим".
Anonymous class
• Анонимный класс не имеет имени
• Не является членом внешнего класса
• Объявляется и сразу создает экземпляр
• Можно поместить в любом месте программы, где разрешается применять выражения
• Обычно реализует только методы и своего интерфейса или суперкласса
• Должны быть короткими, так как объявляются среди других выражений
• Анонимный класс не имеет имени
• Не является членом внешнего класса
• Объявляется и сразу создает экземпляр
• Можно поместить в любом месте программы, где разрешается применять выражения
• Обычно реализует только методы и своего интерфейса или суперкласса
• Должны быть короткими, так как объявляются среди других выражений
Local class
Локальный класс определяется в блоке кода. Часто объявление происходит в методе другого класса. Но его можно объявить в статических или нестатических блоках инициализации.
• Локальный класс виден в пределах блока, где он объявлен
• Не может быть объявлен как private, public, protected или static
• Не может содержать статические объявления, только константы
• Имеет окружающий их экземпляр только в нестатическом контексте
• Видны все поля и методы внешнего класса обычные и статические (в зависимости от контекста)
Локальный класс определяется в блоке кода. Часто объявление происходит в методе другого класса. Но его можно объявить в статических или нестатических блоках инициализации.
• Локальный класс виден в пределах блока, где он объявлен
• Не может быть объявлен как private, public, protected или static
• Не может содержать статические объявления, только константы
• Имеет окружающий их экземпляр только в нестатическом контексте
• Видны все поля и методы внешнего класса обычные и статические (в зависимости от контекста)
Собеседование Android-разработчиков
Составил вместе с моим другом, разработчиком мобильных приложений и админом канала Android Live, пост, который поможет подготовиться к собеседованиям на Андроид-разработчика.
Теоретические вопросы – первое, на что стоит обратить внимание при подготовке к собеседованиям. На работе мы большую часть времени пишем код. А чтобы писать качественный код, разработчик должен как минимум хорошо знать свой язык программирования и разбираться в алгоритмах. Поэтому часто на собеседованиях сначала спрашивают теорию, потом дают решать алгоритмические задачи и в конце вопросы по архитектуре приложений.
Вопросы по Андроид зависят от позиции, на которую собеседуешься. Если претендуешь на junior, то важно хорошо ответить на вопросы по основным компонентам: Service, Activity, Fragment. На middle и seniour – готовься к вопросам, которые связаны с архитектурой и применением специфических для проекта библиотек.
77 вопросов и ответов с собеседований
https://android.jlelse.eu/android-interview-questions-cheat-sheet-96ea01c88def
Репозиторий с ресурсами по алгоритмам: линки, книги, курсы, реализации на многих языках программирования
https://github.com/tayllan/awesome-algorithms
Сайт для прокачки себя в алгоритмах
https://www.hackerrank.com
Канал моего друга Саши об Андроид-разработке
https://yangx.top/android_live
Составил вместе с моим другом, разработчиком мобильных приложений и админом канала Android Live, пост, который поможет подготовиться к собеседованиям на Андроид-разработчика.
Теоретические вопросы – первое, на что стоит обратить внимание при подготовке к собеседованиям. На работе мы большую часть времени пишем код. А чтобы писать качественный код, разработчик должен как минимум хорошо знать свой язык программирования и разбираться в алгоритмах. Поэтому часто на собеседованиях сначала спрашивают теорию, потом дают решать алгоритмические задачи и в конце вопросы по архитектуре приложений.
Вопросы по Андроид зависят от позиции, на которую собеседуешься. Если претендуешь на junior, то важно хорошо ответить на вопросы по основным компонентам: Service, Activity, Fragment. На middle и seniour – готовься к вопросам, которые связаны с архитектурой и применением специфических для проекта библиотек.
77 вопросов и ответов с собеседований
https://android.jlelse.eu/android-interview-questions-cheat-sheet-96ea01c88def
Репозиторий с ресурсами по алгоритмам: линки, книги, курсы, реализации на многих языках программирования
https://github.com/tayllan/awesome-algorithms
Сайт для прокачки себя в алгоритмах
https://www.hackerrank.com
Канал моего друга Саши об Андроид-разработке
https://yangx.top/android_live
Вопросы с собеседований по Spring
— что такое Spring
— как понимаете Dependency Injection
— как понимаете Inversion of Control
— примеры DI и IoC
— что такое бин Spring’е
— какие есть scope у бина
— можно ли задать свой scope
— жизненный цикл бина
— что такое жизненный цикл бина
— можно ли добавить бин, если приложение уже стартануло
— как получить объекты ServletContext и ServletConfig
— виды внедрения зависимостей
— для чего нужна аннотация
— разница между аннотациями
— как работает транзакция в Spring
— что знаете о DispatcherServlet и ContextLoaderListener
— рассказать как устроен Spring MVC
— для чего нужны аннотации
— что лежит в основе Spring Security
— преимущества и недостатки Spring Data
— что такое Spring
— как понимаете Dependency Injection
— как понимаете Inversion of Control
— примеры DI и IoC
— что такое бин Spring’е
— какие есть scope у бина
— можно ли задать свой scope
— жизненный цикл бина
— что такое жизненный цикл бина
— можно ли добавить бин, если приложение уже стартануло
— как получить объекты ServletContext и ServletConfig
— виды внедрения зависимостей
— для чего нужна аннотация
@Qualifier
— разница между аннотациями
@Component
, @Repository
, @Service
— как работает транзакция в Spring
— что знаете о DispatcherServlet и ContextLoaderListener
— рассказать как устроен Spring MVC
— для чего нужны аннотации
@RequestBody
, @PathVariable
, @RequestParam
— что лежит в основе Spring Security
— преимущества и недостатки Spring Data
Что посмотреть на выходных
Крутое мок интервью от Стаса Лозенко
https://youtu.be/E6_IVAbBIug
Красно-черные деревья
https://youtu.be/-gKLTH0KTF4
Мотивация для программирования
https://youtu.be/J1usv2Hn-pU
#чтопосмотреть
Крутое мок интервью от Стаса Лозенко
https://youtu.be/E6_IVAbBIug
Красно-черные деревья
https://youtu.be/-gKLTH0KTF4
Мотивация для программирования
https://youtu.be/J1usv2Hn-pU
#чтопосмотреть
Как воспитать привычку
У Аркадия Морейниса прочитал о воспитании привычек и решил написать пост о своих, которые два года назад помогли мне начать учить Джаву.
Воспитание привычки – когда вы решили делать что-то каждый рабочий день определенное количество раз.
1. Перестаньте думать нужно ли это делать и есть ли на это время.
Решите один раз и двигайтесь в этом направлении. Когда я решил стать разрабом, начал каждый день кодить, смотреть лекции и читать книги.
2. Привяжите каждый подход ко времени или событию.
Сразу после завтрака я повторял вчерашний материал, после решал задачи, а за час до сна читал книги.
3. Подход – это выполнение определенных действий нужное количество раз.
Мои подходы: решить 10 задач, сделать конспекты по 2-м лекциям, прочитать 30 страниц, разобрать 10 вопросов с собеседований. Главное установить количество – не «почитать книгу», а именно «прочитать 30 страниц».
4. Не переборщите с количеством действий внутри подхода.
Каждый подход не должен вызывать дикого отвращения. Когда я понимал, что задача занимает овер дохрена времени, переключался на следующую. Нерешенная задача становилась первой в списке на следущий подход. Если все задачи в списке были сложными, то снижал ежедневную планку.
5. Не пропускайте ни одного подхода.Никогда.
Для этого правильно выбирайте привязку по времени и количество действий в подходе. Я понимал, что если перестану решать задачи хотя бы один день, то есть вероятность надолго отбросить мечту стать программистом.
6. Придумайте вознаграждение.
Это сильно ускорит привыкание. Когда я учил Джаву, у меня не было вознаграждения. А вот писать посты каждый день меня подстёгивают просмотры, лайки и сообщения в личку.
7. Привычка воспитывается не быстро.
Некоторые говорят, что достаточно 21 дня, но это не всегда так. Не расстраивайтесь, если были пропуски, у меня тоже получилось не с первого подхода.
У Аркадия Морейниса прочитал о воспитании привычек и решил написать пост о своих, которые два года назад помогли мне начать учить Джаву.
Воспитание привычки – когда вы решили делать что-то каждый рабочий день определенное количество раз.
1. Перестаньте думать нужно ли это делать и есть ли на это время.
Решите один раз и двигайтесь в этом направлении. Когда я решил стать разрабом, начал каждый день кодить, смотреть лекции и читать книги.
2. Привяжите каждый подход ко времени или событию.
Сразу после завтрака я повторял вчерашний материал, после решал задачи, а за час до сна читал книги.
3. Подход – это выполнение определенных действий нужное количество раз.
Мои подходы: решить 10 задач, сделать конспекты по 2-м лекциям, прочитать 30 страниц, разобрать 10 вопросов с собеседований. Главное установить количество – не «почитать книгу», а именно «прочитать 30 страниц».
4. Не переборщите с количеством действий внутри подхода.
Каждый подход не должен вызывать дикого отвращения. Когда я понимал, что задача занимает овер дохрена времени, переключался на следующую. Нерешенная задача становилась первой в списке на следущий подход. Если все задачи в списке были сложными, то снижал ежедневную планку.
5. Не пропускайте ни одного подхода.Никогда.
Для этого правильно выбирайте привязку по времени и количество действий в подходе. Я понимал, что если перестану решать задачи хотя бы один день, то есть вероятность надолго отбросить мечту стать программистом.
6. Придумайте вознаграждение.
Это сильно ускорит привыкание. Когда я учил Джаву, у меня не было вознаграждения. А вот писать посты каждый день меня подстёгивают просмотры, лайки и сообщения в личку.
7. Привычка воспитывается не быстро.
Некоторые говорят, что достаточно 21 дня, но это не всегда так. Не расстраивайтесь, если были пропуски, у меня тоже получилось не с первого подхода.
Книги для Джава-разработчика
Я выкладывал книги, которые сам прочитал в начале пути, и которые мне советовали опытные разрабы. Подборка моих обзоров:
Head First Java
https://yangx.top/java_developer/10
Грокаем алгоритмы
https://yangx.top/java_developer/28
Complete Reference Java
https://yangx.top/java_developer/48
Clean code
https://yangx.top/java_developer/71
Concurrency in practice
https://yangx.top/java_developer/77
Effective Java
https://yangx.top/java_developer/127
Я выкладывал книги, которые сам прочитал в начале пути, и которые мне советовали опытные разрабы. Подборка моих обзоров:
Head First Java
https://yangx.top/java_developer/10
Грокаем алгоритмы
https://yangx.top/java_developer/28
Complete Reference Java
https://yangx.top/java_developer/48
Clean code
https://yangx.top/java_developer/71
Concurrency in practice
https://yangx.top/java_developer/77
Effective Java
https://yangx.top/java_developer/127
Плохо – хорошо
Плохо
Хорошо
Пример взял с одного из докладов JPoint 2018
Плохо
List<T> list = new ArrayList<>();
for (T item : set) list.add(item);
Хорошо
List<T> list = new ArrayList<>(set);
Пример взял с одного из докладов JPoint 2018
Плохо – хорошо
Плохо
Хорошо
Плохо
Iterator<T> itr = list.stream().iterator();
while (itr.hasNext())
consumer.consume(itr.next());
Хорошо
list.stream().forEach(consumer);