Может ли статический метод быть переопределён или перегружен?
Перегружен - да. Всё работает точно так же, как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён - нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода - это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.Может ли статический метод быть переопределён или перегружен?
Перегружен - да. Всё работает точно так же, как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён - нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода - это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.
Перегружен - да. Всё работает точно так же, как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён - нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода - это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.Может ли статический метод быть переопределён или перегружен?
Перегружен - да. Всё работает точно так же, как и с обычными методами - 2 статических метода могут иметь одинаковое имя, если количество их параметров или типов различается.
Переопределён - нет. Выбор вызываемого статического метода происходит при раннем связывании (на этапе компиляции, а не выполнения) и выполняться всегда будет родительский метод, хотя синтаксически переопределение статического метода - это вполне корректная языковая конструкция.
В целом, к статическим полям и методам рекомендуется обращаться через имя класса, а не объект.
Forwarded from Академия Кода
Строки в Java
Это объекты, которые внутренне являются массивом символов. Поскольку массивы неизменяемы (не могут расти), строки также неизменны. Каждый раз, когда в
Подписывайтесь на канал 👉@coddy_academy
#java
Это объекты, которые внутренне являются массивом символов. Поскольку массивы неизменяемы (не могут расти), строки также неизменны. Каждый раз, когда в
String
вносятся изменения, создается совершенно новый объект String
. Подписывайтесь на канал 👉@coddy_academy
#java
👍11👎8
Можно ли переопределить статический метод?
Отвечая на этот вопрос, необходимо аккуратно обращаться с терминологией перегрузки и переопределения.
На перегрузку (overload) статического метода не накладывается никаких ограничений. С точки зрения компилятора, методы с разным списком аргументов – разные методы. Но это не переопределение.
Метод с модификатором static относится к классу, а не к его объектам. Для него работает статическое связывание, поэтому именно переопределение (override) в дочернем классе не работает.
Несмотря на это, в дочернем классе можно объявить static метод с такой же сигнатурой, как в родительском. В этом случае произойдет не перегрузка и не переопределение, а перекрытие (shadowing). К такому методу нельзя применить аннотацию @ Override, в нём нельзя использовать ключевое слово super.
Если вы вызываете статический метод от переменной, а не типа, перекрытие таит в себе опасность. Без динамического связывания компилятор знает только о типе переменной, но не о типе ее значения. Если объявленный тип переменной – базовый класс, то метод-перекрытие никогда не вызовется. Поэтому при попытке такого вызова в IDE мы видим предупреждение.
Отвечая на этот вопрос, необходимо аккуратно обращаться с терминологией перегрузки и переопределения.
На перегрузку (overload) статического метода не накладывается никаких ограничений. С точки зрения компилятора, методы с разным списком аргументов – разные методы. Но это не переопределение.
Метод с модификатором static относится к классу, а не к его объектам. Для него работает статическое связывание, поэтому именно переопределение (override) в дочернем классе не работает.
Несмотря на это, в дочернем классе можно объявить static метод с такой же сигнатурой, как в родительском. В этом случае произойдет не перегрузка и не переопределение, а перекрытие (shadowing). К такому методу нельзя применить аннотацию @ Override, в нём нельзя использовать ключевое слово super.
Если вы вызываете статический метод от переменной, а не типа, перекрытие таит в себе опасность. Без динамического связывания компилятор знает только о типе переменной, но не о типе ее значения. Если объявленный тип переменной – базовый класс, то метод-перекрытие никогда не вызовется. Поэтому при попытке такого вызова в IDE мы видим предупреждение.
👍5
Самоучитель Java Swing: Как создать приложение с графическим интерфейсом на Java
Swing в Java - это инструментарий графического интерфейса пользователя (GUI), включающий компоненты GUI. Swing предоставляет богатый выбор виджетов и пакетов для создания изысканных компонентов GUI для Java-приложений.
Подробнее
Swing в Java - это инструментарий графического интерфейса пользователя (GUI), включающий компоненты GUI. Swing предоставляет богатый выбор виджетов и пакетов для создания изысканных компонентов GUI для Java-приложений.
Подробнее
👍1
Forwarded from Академия Кода
Clone
По умолчанию
По контракту клон должен быть другим объектом (
Альтернативы (многие считают что более удобные) метода
Подписывайтесь на канал 👉@coddy_academy
#java
По умолчанию
protected
– потому что универсальной реализации нет, а вызов приведет к CloneNotSupportedException
. Нужно писать свою реализацию, делать при этом ее public
и добавлять классу интерфейс Cloneable. Подразумевается что этот метод делает «глубокое копирование», то есть поля-ссылки копи будут вести на копии полей оригинала. Это диктуется соглашением, по которому клон не должен зависеть от оригинала. По контракту клон должен быть другим объектом (
!=
оригиналу). Рекомендуется, чтобы все классы иерархии реализовывали Cloneable
, реализация метода начиналась с super.clone()
(если родитель не Object
), а результат был equals
и имел тот же класс что и оригинал.Альтернативы (многие считают что более удобные) метода
clone
- конструктор копирования и паттерн factory method. Всё, что нужно знать о копировании объектов в Java можно найти в Effective Java Item 11. Подписывайтесь на канал 👉@coddy_academy
#java
👍4
Могут ли нестатические методы перегрузить статические?
Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Да. В итоге получится два разных метода. Статический будет принадлежать классу и будет доступен через его имя, а нестатический будет принадлежать конкретному объекту и доступен через вызов метода этого объекта.
Как сериализация работает с наследованием?
Когда
При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию
Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
Когда
Serializable
класс имеет цепочку родителей, пока эти родители тоже Serializable
, десериализация объекта идет от родителя к наследнику, в обход конструктора. Вместо него вызываются методы readObject
(readObjectNoData
). Но как только встречается первый предок, не реализующий интерфейс Serializable
, инициализация для него возвращается в нормальное русло – вместо readObject
вызывается конструктор без аргументов. Если такого конструктора нет, или он объявлен private
, исполнение выбросит InvalidClassException
.При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию
writeObject()
, либо используя интерфейс Externalizable
.Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
👍1
toString
Строковое представление экземпляра. По умолчанию возвращает
Строковое представление экземпляра. По умолчанию возвращает
"ПолноеИмяКласса@хэшВ16тиричномВиде"
(например "java.lang.Object@1a23b4f"
). Часть после @
– не адрес в памяти, так что умолчательная реализация почти не несет практической пользы. Полезно добавлять нормальную реализацию даже если не необходимо в логике программы – поможет в отладке. Готовый вызов x.toString()
с проверкой на null
уже реализован в String.valueOf(x)
.👍6
Интеграция с Allure: структурировать, упростить, стабилизировать
Привет! Меня зовут Сергей Потанин, я QA Automation Team Lead в Wrike. В этой статье расскажу о том, как мы используем интеграцию с Allure в повседневной работе и как этот инструмент помог нам существенно упростить процесс автотестирования, стабилизировать тесты и даже автоматизировать процесс их анализа.
Изначально, Allure — это инструмент для создания отчетов о тестировании с множеством интересных функций: статистика и аналитика, временная шкала, группировка результатов тестирования по различным атрибутам и т. д.
Подробнее
Привет! Меня зовут Сергей Потанин, я QA Automation Team Lead в Wrike. В этой статье расскажу о том, как мы используем интеграцию с Allure в повседневной работе и как этот инструмент помог нам существенно упростить процесс автотестирования, стабилизировать тесты и даже автоматизировать процесс их анализа.
Изначально, Allure — это инструмент для создания отчетов о тестировании с множеством интересных функций: статистика и аналитика, временная шкала, группировка результатов тестирования по различным атрибутам и т. д.
Подробнее
👍1
finalize
Метод придуман для минимизации риска утечки внешних ресурсов. Может быть вызван виртуальной машиной при сборке мусора (добавляя при этом для нее избыточную нагрузку). Это не то же самое, что деструктор в C++.
Есть только гарантии, что метод не будет вызван пока есть ссылки на объект, и что не будет вызван больше одного раза. Даже то, что вызов будет вообще – не факт. Исполнять будет неизвестно какой, но не синхронизированный поток. Исключения проигнорируются.
С давних пор использовать финализаторы не рекомендуется (Effective Java Item 7), а с Java 9 этот метод помечен как deprecated. Вместо финализатора всегда стоит воспользоваться
Метод придуман для минимизации риска утечки внешних ресурсов. Может быть вызван виртуальной машиной при сборке мусора (добавляя при этом для нее избыточную нагрузку). Это не то же самое, что деструктор в C++.
Есть только гарантии, что метод не будет вызван пока есть ссылки на объект, и что не будет вызван больше одного раза. Даже то, что вызов будет вообще – не факт. Исполнять будет неизвестно какой, но не синхронизированный поток. Исключения проигнорируются.
С давних пор использовать финализаторы не рекомендуется (Effective Java Item 7), а с Java 9 этот метод помечен как deprecated. Вместо финализатора всегда стоит воспользоваться
try/finally
, try-with-resource
или более специализированными классами пакета java.lang.ref
.Stack Overflow
Why would you ever implement finalize()?
I've been reading through a lot of the rookie Java questions on finalize() and find it kind of bewildering that no one has really made it plain that finalize() is an unreliable way to clean up reso...
👍5
Lineate ищет Java-разработчиков и предлагает возможность для релокации в Грузию
Компания предоставляет:
— трудоустройство в грузинском филиале;
— зарплату в местном банке (в лари);
— билеты для сотрудников с багажом за счет компании;
— жилье на первые 2 недели, помощь с поиском жилья для дальнейшего проживания;
— релокационный бонус $1000.
От вас ждем:
— профессиональное владение инструментами Spring Boot, Spring Data, Spring Batch, Netty (Async IO);
— опыт работы с SQL / NoSQL базами данных;
— уровень английского языка не ниже Pre-intermediate.
Подробнее о вакансии можно прочитать по ссылке.
Компания предоставляет:
— трудоустройство в грузинском филиале;
— зарплату в местном банке (в лари);
— билеты для сотрудников с багажом за счет компании;
— жилье на первые 2 недели, помощь с поиском жилья для дальнейшего проживания;
— релокационный бонус $1000.
От вас ждем:
— профессиональное владение инструментами Spring Boot, Spring Data, Spring Batch, Netty (Async IO);
— опыт работы с SQL / NoSQL базами данных;
— уровень английского языка не ниже Pre-intermediate.
Подробнее о вакансии можно прочитать по ссылке.
👍3
wait, notify, notifyAll
Часто этот вопрос формулируется как задача Producer-сonsumer. Эту задачу и практические задачи на многопоточность вообще при возможности лучше реализовывать на высокоуровневых примитивах синхронизации. Другой подход – воспользоваться также низкоуровневой, но оптимистической блокировкой на compareAndSet. Но обычно использование
Эти методы вместе с
Чтобы вызывать эти методы у объекта, необходимо чтобы был захвачен его монитор (т.е. нужно быть внутри synchronized-блока на этом объекте). В противном случае будет выброшено
Вызов
В теории, ожидание
Еще два нештатных случая завершения
Различные проблемы реализации блокировок рассмотрены в Java Concurrency in Practice 14.1.3, 14.2. Для желающих разобраться, как блокировки работают в кишках JVM, написана статья на хабре.
Часто этот вопрос формулируется как задача Producer-сonsumer. Эту задачу и практические задачи на многопоточность вообще при возможности лучше реализовывать на высокоуровневых примитивах синхронизации. Другой подход – воспользоваться также низкоуровневой, но оптимистической блокировкой на compareAndSet. Но обычно использование
notify/wait
(пессимистическая блокировка) – условие этого задания, то есть требуется реализовать уже существую BlockingQueue.Эти методы вместе с
synchronized
– самый низкий уровень пессимистических блокировок в Java, использующийся внутри реализации примитивов синхронизации. Еще с Java 5 в непосредственном использовании этих методов нет необходимости, но теоретические знания всё еще часто спрашивают на интервью.Чтобы вызывать эти методы у объекта, необходимо чтобы был захвачен его монитор (т.е. нужно быть внутри synchronized-блока на этом объекте). В противном случае будет выброшено
IllegalMonitorStateException
. Так что для полного ответа нужно понимать, как работает monitor lock (блок synchronized
).Вызов
wait
тормозит текущий поток на ожидание на этом объекте и отпускает его монитор. Исполнение продолжится, когда другой поток вызовет notify
и отпустит блокировку монитора. Если на объекте ожидают несколько потоков, notify
разбудит один случайный, notifyAll
- все сразу.В теории, ожидание
wait
может быть прервано без вызова notify
, по желанию JVM (spurious wakeup). На практике это бывает крайне редко, но нужно страховаться и после вызова wait
добавлять дополнительную проверку условия завершения ожидания.Еще два нештатных случая завершения
wait
– прерывание потока извне и таймаут ожидания. В случае прерывания выбрасывается InterruptedException
. Для таймаута нужно указать время ожидания параметрами метода wait
. Значение 0 проигнорируется.Различные проблемы реализации блокировок рассмотрены в Java Concurrency in Practice 14.1.3, 14.2. Для желающих разобраться, как блокировки работают в кишках JVM, написана статья на хабре.
👍7
Forwarded from Академия Кода
Как сохранить json в файл на Java?
Используйте
Посмотреть пример в онлайн редакторе.
Подписывайтесь на канал 👉@coddy_academy
#java
Используйте
ObjectMapper()
чтобы сохранить json данные в файл на Java.Посмотреть пример в онлайн редакторе.
Подписывайтесь на канал 👉@coddy_academy
#java
👍2🎉1
Самое мучительное в поиске работы — ожидание ответа и бесконечные этапы отбора. В Почтатехе считают, что всё должно быть проще, и приглашают всех джавистов на One day offer 9 апреля.
Никаких географических ограничений: ждут участников со всех уголков страны и уже готовы предложить конкурентные условия и амбициозные задачи в продуктах Почты России. Если ты спец с опытом в Java-разработке от трёх лет, смело откликайся до 3 апреля включительно: https://clck.ru/dnhQ9
Никаких географических ограничений: ждут участников со всех уголков страны и уже готовы предложить конкурентные условия и амбициозные задачи в продуктах Почты России. Если ты спец с опытом в Java-разработке от трёх лет, смело откликайся до 3 апреля включительно: https://clck.ru/dnhQ9
Какие существуют литералы?
Литерал – последовательность символов, обозначающая значение примитивного типа (или строки).
🔘 Целочисленные (Integer). Возможные форматы:
🔘 С плавающей точкой (floating-point). Возможные форматы:
🔘 Символы и строки. Символ (char) – в одинарных кавычках:
🔘 Логические (boolean).
🔘 Специальный литерал
Все нюансы описаны в официальной документации.
Литерал – последовательность символов, обозначающая значение примитивного типа (или строки).
🔘 Целочисленные (Integer). Возможные форматы:
2019
, 1__000_000
(с Java 7), 10048L
(можно l, но будет путаться с 1), 0xfd12aa
, 0b1011101
, 07654321
.🔘 С плавающей точкой (floating-point). Возможные форматы:
123.4
, 56.7e8
, .07
, 42F
, 1.4D
(избыточно, по умолчанию и так double).🔘 Символы и строки. Символ (char) – в одинарных кавычках:
'R'
. Спецсимволы пишутся с бэкслешем: '\n'
. Любой символ можно представлять в виде escape-последовательности: '\u00F1'
. Строковый литерал – последовательность символов в двойных кавычках: "Blabla"
. Для символов строки действуют те же правила.🔘 Логические (boolean).
true
и false
.🔘 Специальный литерал
null
.Все нюансы описаны в официальной документации.
Какие бывают модификаторы?
🔘 Модификаторы доступа
🔘 Модификаторы для многопоточности
🔘
🔘
🔘
🔘
🔘
🔘
🔘 Модификаторы доступа
private
, protected
, public
(рассмотрим подробнее в разделе #Классы)🔘 Модификаторы для многопоточности
synchronized
и volatile
(подробнее чуть позже)🔘
static
(рассмотрим подробнее в разделе #Классы)🔘
final
🔘
abstract
(рассмотрим подробнее в разделе #Классы)🔘
native
– реализация метода скрыта внутри JVM, нельзя указывать в пользовательском коде🔘
transient
– поле будет пропущено при сериализации🔘
strictfp
– самый экзотический, ограничивает точность вычисления для переменной с плавающей точкой до стандарта IEEE. Нужно для переносимости между платформами.👍4❤1
Forwarded from Академия Кода
Дочерние классы в массивах
В Java полиморфизм позволяет нам помещать экземпляры разных классов, которые имеют общий родительский класс, вместе в массив или ArrayList. Например, если у нас есть родительский класс Animal с дочерними классами Cat, Dog и Pig, мы можем настроить массив с экземплярами каждого животного, а затем перебрать список животных, чтобы выполнить одно и то же действие над каждым.
Подписывайтесь на канал 👉@coddy_academy
#java
В Java полиморфизм позволяет нам помещать экземпляры разных классов, которые имеют общий родительский класс, вместе в массив или ArrayList. Например, если у нас есть родительский класс Animal с дочерними классами Cat, Dog и Pig, мы можем настроить массив с экземплярами каждого животного, а затем перебрать список животных, чтобы выполнить одно и то же действие над каждым.
Подписывайтесь на канал 👉@coddy_academy
#java
❤1
Чем отличаются checked и unchecked исключения?
Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации.
Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе
🔘
🔘
🔘
🔘
Вопрос формулируют по-разному, суть вопроса – объяснение иерархии классов исключений. Подробно описано в документации.
Исключения бывают checked и unchecked. Checked требуется указывать в сигнатуре метода в разделе
throws
; перехватывать или добавлять в throws
в вызывающем его методе. Unchecked можно добавить, но не обязательно, перехватывать не обязательно даже если указана в throws
. 🔘
Throwable
– базовый класс для всего что может быть использовано с оператором throw
и в конструкции try-catch
🔘
RuntimeException
– «нормальные» unchecked-исключения🔘
Error
– unchecked исключения, которые означают «серьезные проблемы» приложения. Не должны обрабатываться (хотя технически можно). Теоретически JVM может находиться в невалидном состоянии и не давать больше никаких гарантий🔘
Exception
(кроме RuntimeException
) – checked исключения👍4❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Освойте бэкенд-разработку на Java за 10 месяцев!
Профессия для тех, кто настроен серьезно: https://bit.ly/32zzMyP
Научим:
✔️Писать код на Java
✔️Использовать фреймворки Javalin, Spring
✔️Применять принципы ООП
✔️Работать с базами данным, SQL
✔️Настраивать окружение: IDEA, Gradle/Maven, JDK
✔️Пользоваться командной строкой и Git
Поможем:
✔️Наработать практику — вы сделаете 5 проектов на GitHub
✔️Грамотно оформить резюме
✔️Подготовиться к собеседованиям
А еще порекомендуем в хорошие компании и познакомим с сообществом из 26 тысяч айтишников. Присоединяйтесь!
Профессия для тех, кто настроен серьезно: https://bit.ly/32zzMyP
Научим:
✔️Писать код на Java
✔️Использовать фреймворки Javalin, Spring
✔️Применять принципы ООП
✔️Работать с базами данным, SQL
✔️Настраивать окружение: IDEA, Gradle/Maven, JDK
✔️Пользоваться командной строкой и Git
Поможем:
✔️Наработать практику — вы сделаете 5 проектов на GitHub
✔️Грамотно оформить резюме
✔️Подготовиться к собеседованиям
А еще порекомендуем в хорошие компании и познакомим с сообществом из 26 тысяч айтишников. Присоединяйтесь!
👍1
Что такое synchronized?
Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется
Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока
Блок
Можно применять как модификатор метода, и как самостоятельный оператор с блоком кода. Выполняет код при захваченном мониторе объекта. В виде оператора объект указывается явно. В виде модификатора нестатического метода используется
this
, статического – .class
текущего класса.Один из основных инструментов обеспечения потокобезопасности. Одновременно выполняется не более одного блока
synchronized
на одном и том же объекте. Такая блокировка называется intrinsic lock или monitor lock, подробно рассматривается в Java Concurrency in Practice 2.3.1.Блок
synchronized
также необходим для использования методов wait, notify, notifyAll.👍8