Java — JAVA вопрос начинающего


Содержание

Junior Java Developer – вопросы на собеседовании

В этой статье мы рассмотрим 25 наиболее часто встречающихся вопросов на интервью для новичков в программировании на Java. Все это реальные вопросы на собеседовании Java Junior Developer.

Можно ли в Java переопределить статический метод?

Нет, статический метод в Java мы не можем переопределить. Мы можем только скрыть его.

В Java статические методы — это те методы, которые можно вызывать без создания экземпляра класса. С другой стороны, если подкласс имеет ту же сигнатуру метода, что и базовый класс — это будет переопределением метода.

Статический метод в Java не может быть переопределен по таким причинам:

  • Статические методы — это те, которые принадлежат непосредственно классу. Они не принадлежат объекту, и при переопределении объект решает, какой метод должен быть вызван.
  • Переопределение метода происходит динамически (во время выполнения), это означает, что определение того, какая версия метода будет использоваться происходит во время выполнения в соответствии с объектом, используемым для вызова, в то время как статические методы ищутся статически (во время компиляции).

Когда вы запустите программу выше, вы получите следующий результат:

Согласно правилам переопределения методов, вызов метода разрешается во время выполнения по типу object. Таким образом, в нашем примере выше d.hello (), во втором вызове, должен вызывать метод hello () класса DisplayMessage, поскольку ссылочная переменная класса Display ссылается на объект DisplayMessage, но вызывает hello () самого класса Display. Это происходит потому, что выполнение статического метода разрешается во время компиляции.

Таким образом, если статический метод у производного класса имеет ту же сигнатуру, что и статический метод базового класса, это будет называться сокрытием метода, а не переопределением метода.

Можно ли выполнить перегрузку метода main() в Java?

Достаточно распространенный по языку Java вопрос на интервью.

Да, вы можете перегрузить метод main() в Java.

В Java можно выполнить перегрузку метода main(), но когда мы запустим нашу программу, JVM будет искать общедоступный статический void main (String [] args) и выполнит этот метод.

Перегрузка метода main() в Java:

Когда вы запустите программу выше, вы получите такой результат:

Видно, что метод main() у нас перегружен, но все же JVM вызывает метод с подписью public static void main (String [] args).

Обратите внимание, что JVM считает var args public static void main (String. args) таким же, как public static void main (String [] args).

Если мы хотим вызвать именно перегруженный метод, то вам нужно вызвать его из метода main с сигнатурой public static void main (String [] args).

Когда вы запустите программу выше, вы получите такой результат:

Как видите, мы вызвали перегруженные методы из main() с помощью аргумента String [].

Можем ли мы в Java переопределить приватные методы?

В Java мы не можем переопределить private методы, так как они видны только классу-владельцу.

Каков базовый класс для всех классов в Java?

java.lang.Object — это базовый класс для всех объектов.

Можете ли вы перечислить некоторые важные методы из класса object?

Среди важных методов класса object выделяют:

  • hashcode — в качестве возвращаемого значения имеет хеш-значение объекта;
  • equals — сравнивает ссылки на объекты;
  • wait — текущий поток ожидает, пока не будет вызвано notify или notifyAll;
  • notify — пробуждает один поток, который ожидает блокировки;
  • notifyAll — пробуждает все потоки, ожидающие блокировки;
  • toString — обеспечивает представление объекта в виде строкового значения;
  • clone — этот метод применяется для клонирования объекта;
  • finalize — этот метод вызывается, когда объект подвергается обработке сборщиком мусора.

Какие два метода вам нужно переопределить при помещении пользовательского объекта в качестве ключа для HashMap?

Вам нужно будет переопределить методы hashcode() и equals() в пользовательском классе, помещая объекты пользовательского класса в HashMap.

В чем отличия в Java между HashMap и HashSet?

HashMap

В HashMap реализован интерфейс Map, который выполняет сопоставление некого ключа со значением. Он не синхронизирован и не является потокобезопасным. Не допускаются дублирующиеся ключи, а также null ключи и null значения.

HashSet

В HashSet реализован интерфейс Set, не допускающий дублирования значений. Он не синхронизирован и не является потокобезопасным.

Выше employeeSet будет иметь 2 элемента, так как Set не допускает повторяющихся значений.
Метод add применяется для добавления элементов в HashSet. Если этот метод возвращает true, тогда элемент добавляется успешно, но, если возвращается false – это значит, что вы пытаетесь вставить дублирующее значение.

Одна из главных особенностей HashSet — объекты, которые мы собираемся добавить в HashSet, должны реализовывать методы Hashcode() и equals(), чтобы мы могли проверять наличие дублирующихся значений. Если мы добавляем пользовательские объекты в HashSet, то мы должны переопределить методы Hashcode() и equals() в соответствии с нашими потребностями. Если HashMap и HashSet не будут переопределены, объект будет принимать реализацию по умолчанию, что может быть нежелательно.

HashMap vs HashSet:

Можем ли мы иметь абстрактный класс без какого-либо абстрактного метода в нем?

Да, вы можете иметь абстрактный класс без создания какого-либо абстрактного метода.

Что вы знаете о переменной с модификатором transient? Когда вы будете ее использовать?

Переменные с модификатором transient (нерезидент) применяются при сериализации.

Если вы не хотите делать сериализуемую переменную, вы можете сделать ее переменной с модификатором transient.

Transient переменная — это переменная, значение которой не будет сериализоваться во время сериализации объекта. А при десериализации — вы получите значение по умолчанию для этих переменных.

Допустим, у вас есть класс Country, и вы не хотите сериализовать атрибут населения, поскольку он будет меняться со временем, поэтому вы можете объявить атрибут населения как transient, и он больше не будет сериализован.

Можете ли вы вызвать метод start() дважды в Java?

Нет, вы не можете вызвать метод start() дважды. Это вызовет llegalStateException.

После того как поток был запущен, он не может быть запущен снова. Если вы попытаетесь снова запустить поток, он выдаст исключение IllegalThreadStateException

Давайте разберемся с помощью примера:

Когда вы запустите программу выше, вы получите такой результат:

Как вы можете видеть, когда мы пытались запустить поток во второй раз, он вызывал исключение IllegalThreadStateException.

Если вы попытаетесь снова запустить поток, он выдаст исключение IllegalThreadStateException

Почему String неизменяемый (immutable) в Java?

В Java класс String неизменяемый. Если вы возьмете словарное значение слова «immutable», это означает, что он не может быть изменен с течением времени, соответственно строка не может быть изменена в Java.

Давайте разберемся с примером.

Как видите, значение str1 не изменилось. Она создала другой объект String со значением «Hellojava2blog», но не изменил String str1.

Это объясняет, что String является неизменяемым по своей природе.
Теперь давайте разберемся, каковы потенциальные причины сделать String неизменной в Java.

Пул строк:

Если вы просто присваиваете значение String, используя двойные кавычки, это значение сохраняется в области, называемой строковым пулом, и на одну строку могут ссылаться многие ссылочные переменные. Если бы String оказался изменяемым, то это повлияло бы на все ссылающиеся на нее переменные.

Потокобезопасность:

Неизменяемые объекты по умолчанию являются потокобезопасными, поэтому вам не нужно устанавливать для них синхронизацию, и экземпляр String можно безопасно разделить между несколькими потоками.

Безопасность:

Если бы String был изменяемым, это могло бы привести к множественным проблемам безопасности.
Например, при подключении к базе данных вы предоставляете имя пользователя, пароль, порт и имя хоста и т. д. в виде строки. Если бы строка — была изменяемая, то любой хакер мог бы изменить ссылочное значение, что было бы угрозой безопасности для приложения.

Хэш-значение кэша:

Когда вы используете String в качестве ключа в HashMap или HashSet или любой другой коллекции, вы можете кэшировать ее хеш-значение. Поскольку String является неизменяемым по своей природе, вам не нужно пересчитывать хэш каждый раз, поскольку он будет постоянным. Это значительно повышает производительность для этой коллекции на основе хеша.

Загрузка классов:

Строка используется в механизме загрузки классов. Она передается в качестве параметра. Если бы строка оказалась изменяемой, это вызвало бы прямую угрозу безопасности, поскольку любой хакер мог бы ее изменить.

Знаете ли вы, как сделать класс неизменным (immutable)? Можете ли вы предоставить шаги для этого?

Неизменяемый класс — это класс, состояние которого нельзя изменить после создания.
Пример: String — лучший пример неизменяемого класса. Создав строку, вы не сможете ее изменить.

Неизменяемый класс очень прост для понимания, он имеет только одно состояние.

Неизменяемые классы являются потокобезопасными. Это самое большое преимущество неизменяемого класса, потому что, — вам не нужно применять синхронизацию для неизменяемых объектов. Также, неизменяемый класс может быть полезен при помещении объекта неизменяемого класса в HashMap или может использоваться для целей кэширования, поскольку его значение не изменится.

Неизменяемые объекты по умолчанию являются потокобезопасными.

Шаги для создания неизменяемого класса:

  • Финализируйте свой класс:

Если вы финализируете свой класс — ни один класс не сможет его расширить, следовательно, не сможет переопределить методы этого класса.

  • Пометьте все переменные класса модификаторами доступа private и final:

Если вы сделаете переменную экземпляра private — ни один внешний класс не сможет получить доступ к переменным экземпляра, и, если вы сделаете их final — вы не сможете их изменить.

  • Скажите «нет» методам-мутаторам:

Не создавайте метод set для некоторых переменных класса, тогда не будет возможности явно изменить состояние переменных экземпляра.

  • Выполните клонирование изменяемых объектов при возврате из метода получения:

Если вы вернете клон объекта из метода get, то вернется объект. При этом, ваш оригинальный объект останется без изменений.

Можем ли мы иметь статический метод в интерфейсе?

Да, у нас может быть статический метод в интерфейсе из Java 8.

Можете ли вы объявить конструктор финальным (final)?

Нет, вы не можете объявить конструктор финальным.

В чем разница между StringBuffer и StringBuilder?

Что такое Java ClassPath?

ClassPath — это переменная окружения, которую виртуальная машина Java (JVM) использует для определения местоположения всех классов, используемых программой.
Например: jre / lib / rt.jar имеет все классы Java, и вам также необходимо включить файлы jar или файл классов, которые используются программой.

У вас есть список пользовательских объектов? Как вы можете их отсортировать?

Вам необходимо использовать интерфейс Comparable или Comparator для сортировки списка пользовательских объектов.

Что такое модификатор volatile в Java?

Если вы пометите любую переменную как volatile, эта переменная будет считываться из основной памяти, а не из кэша центрального процессора, поэтому каждый поток будет иметь обновленное значение в переменной.

Назовите два разных способа вызвать сборщик мусора?

System.gc() или Runtime.getRuntime().gc().

Что такое маркерный интерфейс в Java? Можете ли вы привести несколько примеров маркерного интерфейса?

Маркерные интерфейсы — это те интерфейсы, которые не содержат в себе никаких методов и полей.
Примерами интерфейсов маркеров являются: Serializable, Cloneable, Remote.

Сколько объектов будет создано ниже:

Здесь будут созданы три объекта, два в динамической памяти и один в постоянном пуле String.

Можете ли вы провести различие между проверяемым исключением (Checked Exception) и непроверяемым исключением (Unchecked Exceptions)?

Что такое исключение?

Исключением является нежелательная ситуация или условие при выполнении программы. И если вы неправильно обрабатываете исключение, то это может привести к аварийному завершению программы.

Что такое проверяемое исключение?

Проверяемые исключения — это те исключения, которые проверяются при компиляции. Если вы не обработаете их, вы получите ошибку компиляции.

Используя блок try и catch вы можете поместить код ошибки в блок try и перехватить исключение в блоке catch.

Что такое непроверяемое исключение?

Непроверяемые исключения — это те исключения, которые не проверяются во время компиляции. Java VM не будет «ругаться», если вы не обработаете такие исключения.

Если вы выполните код выше вы получите:

В чем разница между ArrayList и LinkedList? Как вы решите, какой из них вам нужно использовать?

Один из распространенных вопросов интервью: «В чем разница между ArrayList и LinkedList». Прежде чем мы действительно увидим различия, давайте кратко рассмотрим оба.

ArrayList:

  • ArrayList – является реализацией интерфейса List.
  • ArrayList не синхронизирован (поэтому не является потокобезопасным).
  • ArrayList реализован с использованием массива в качестве внутренней структуры данных. Его можно динамически изменять.

LinkedList:

  • LinkedList является реализацией интерфейса List и интерфейса Deque.
  • LinkedList не синхронизируется.
  • LinkedList реализован с использованием двусвязного списка в качестве внутренней структуры данных.

Свойство

ArrayList

LinkedList

Внутренняя структура данных

Использует динамический массив для хранения элементов внутри.

Он использует дважды связанный список для внутреннего хранения элементов.

Если нам нужно вставить или удалить элемент в ArrayList, это может занять O(n), так как он использует массив, и нам может потребоваться сместить элементы в случае вставки или удаления.

Если нам нужно вставить или удалить элемент в связанном списке, это займет O(1), так как он внутренне использует двусвязный список.

В ArrayList поиск выполняется быстрее, т.к. он использует массив, основанный на индексах. Сложность — O(1).

Поиск в LinkedList идет медленнее, т.к. он использует двусвязанный список. Сложность равна O(n).

ArrayList реализует только интерфейс List, поэтому его можно использовать только как List.

LinkedList реализует интерфейсы List, Deque, поэтому его можно использовать как List, Stack или Queue.

Когда использовать ArrayList и LinkedList?

Это на самом деле зависит от нашей потребности.
Если нам требуется произвести большое количество вставок или удалений, то нам следует использовать LinkedList. Если у нас имеется мало вставок или удалений, но выполняется много поисковых операций, то тогда нам следует использовать ArrayList.

В чем разница между wait и sleep в Java?


Один из распространенных вопросов на интервью Java разработчика: «В чем разница между wait и sleep в Java?». Прежде чем мы действительно увидим различия, кратко ознакомимся с обоими.

sleep vs wait:

Вы запустили три потока из основного потока. Вы должны убедиться, что основной поток завершился последним. Как вы это сделаете?

Вы можете использовать Java Thread Join() для достижения этого сценария.

Без использования метода Join:

Когда вы запускаете программу выше, вы получите следующий результат:

С помощью метода Join:

Когда вы запустите программу выше, вы получите следующий результат:

Как видите, основной поток завершается последним в этом сценарии.

Итоги

Мы с вами рассмотрели 25 распространенных вопросов на собеседовании на должность Junior Java Developer.

Конечно же, полноценная подготовка к собеседованию Java разработчика должна включать и практическую и теоретическую подготовку. Готовясь к собеседованию, имеет смысл с одной стороны подготовиться, используя различные наборы вопросов и ответов Java собеседований, а с другой стороны — быть готовым к решению задач на собеседованиях Java.

Собеседование на java-программиста (java-developer interview). Часть 2: Вопросы

Это продолжение цикла статей о собеседовании на java-программиста:

Java-related технологии и фреймворки рождаются и умирают, а без знания java core далеко не уедешь. Как можно знать Hibernate, но не знать JDBC и SQL? Как можно разбираться в Spring MVC или Struts, но при это плавать в сервлетах? Как можно пользоваться блокирующими очередями, экзекьюторами и локами, но при этом не понимать, как работают wait/notify? Для меня это до сих пор остается загадкой.

С другой стороны, меня иногда удивляют вопросы сотрудников, которые они задают кандидатам. Зачем спрашивать о Vector и Hashtable — на дворе уже скоро 4-ое тысячелетие. Или «зачем нужен UNION»? Так и хочется ответить — для SQL-инъекций. На счет паттернов проектирования и UML я вообще молчу — неужели до сих пор не наигрались? Но это еще полбеды. Иногда интервьюеры сами допускают довольно грубые ошибки. Об этом чуть позже.

Ниже приведен список вопросов (точнее небольшая его часть), которые я задаю на собеседовании, с моими комментариями. Вся прелесть в том, что в зависимости от позиции (junior java developer, mid-level, senior developer) и специализации некоторые из вопросов превращаются в более короткие либо более продолжительные диалоги с кандидатом и проверяют не только технические знания, но и умение мыслить и делать логические умозаключения. После многих пунктов вы найдете ссылки на статьи по соответствующей тематике.

[Disclamer: В статье выражается до безобразия субъективное мнение. Резкие выражения используются исключительно для донесения своих мыслей до читателя: никого обижать я не собирался и не собираюсь. Людям с расшатанной психикой или зашкаливающим ЧСВ читать, и тем более комментировать, категорически воспрещается. К спамерам и троллям это не относится: каждый ваш комментарий как лучик света в этом царстве тьмы, и дай вам бог всем здоровьечка.]

Вопросы собеседования по Core Java

Для позиций типа Senior эти вопросы можно пропустить. Но иногда все же стоит перестраховаться.

1. Модификаторы в Java.

Особо глубоко спрашивать не нужно — вкратце о назначении и вариантах использования. Можно спросить о контекстах использования этих модификаторов (класс/поле/метод). Подробные вопросы о модификаторах доступа, расширении модификаторов при наследовании, переопределение и сокрытие методов, модификатор abstract и final для классов/методов лучше оставить для вопросов по ООП в Java. Подробное знание модификаторов synchronized и volatile можно проверить в вопросах по многопоточности.

Небольшая статья про модификаторы — здесь.

2. Иерархия коллекций в Java.

Рассматриваем Collection, Set, List, Queue, Map и их основные реализации. Можно в принципе спросить о методах, которые есть в интерфейсе Collection, но лучше не надо. Стоит поинтересоваться, какими коллекциями человек пользовался, но опять же без фанатизма. Напоминаю, Vector и Hashtable (и Stack кстати тоже) — прошлый век, тем более в случае работы с legacy кодом всегда можно посмотреть сорцы. Еще можно поговорить о массивах, а следующий код может привести к интересному диалогу:

Цукерберг рекомендует:  Выводим видео из YouTube через PHP

По поводу свойств и контракта equals/hashCode спросить стоит и о поломке коллекций тоже, но сильно не увлекайтесь, так как это может привести к любимому вопросу большинства интервьюеров об устройстве HashMap. В свою очередь это напрямую ведет нас к вопросам о структурах данных, алгоритмах и их сложности. Мое мнение по этому поводу — с алгоритмами хорошо знакомы олимпиадники и те, у кого в университете это преподавалось на должном уровне. Мне, например, в этом плане не повезло ни с тем, ни с другим. И разбирался в алгоритмах/АТД по ходу своей работы только тогда, когда возникали соответствующие задачи или просто было время и желание почитать и осознать. В результате — quick sort, merge sort, radix sort напишу; hash map, linked list, binary search tree напишу; semaphore, thread pool, blocking queue тоже напишу. Что-то еще нужно? Окей, напишу.

Что делать, если шило все же мешает и хочется хоть раз в жизни показать свои глубочайшие знания в области алгоритмов и структур данных и без того напуганному кандидату. Начнем с того, что такие вопросы стоит задавать только senior разработчику и только если задачи такого плана встречаются на проекте достаточно часто (что встречается достаточно редко). Так уж и быть, спрашивайте об устройстве HashMap и скорости поиска, об устройстве LinkedList и сложности операций над ним. Можно попросить, чтобы человек своими словами рассказал, откуда в quick/merge sort берется log2n. Можно еще какую-нибудь задачу алгоритмическую задать. Но помните, возможно с этим человеком вам еще придется работать в одной команде.

3. Иерархия исключений и ошибок.

Тут как бы все понятно, но бывает, что люди не знают элементарных вещей. Стоит спросить об иерархии, о checked и unchecked ошибках/исключениях, когда используются те или иные, как и когда их нужно обрабатывать. Можно даже начать небольшой диалог по поводу OutOfMemoryError. Если человек знаком с JDBC, можно поговорить об SQLException и поинтересоваться, оно chekced или unchecked и нормально ли это по мнению кандидата.

Ответ на этот вопрос можно найти здесь

4. Вложенные классы в Java.

Некоторые считают, что этот вопрос не нужен. Лично я так не думаю. Стоит спросить о классификации, вариантах использования, о нарушении инкапсуляции и самое интересное — зачем они нужны по мнению кандидата.

Моя статья о вложенных классах на Quizful — здесь.

И статья об анонимных классах — здесь.

Вопросы по ООП в Java

5. Основы ООП

Здесь уже подробно рассматриваем модификаторы доступа и прочие вещи, которые я упомянул в комментариях к первому вопросу. Можно спросить об интерфейсах и абстрактных классах. Пусть человек своими словами расскажет о полиморфизме и инкапсуляции. Если хотите послушать рассуждения человека, можно спросить о таком фрагменте кода:

Как продолжение, на этом же примере можно поговорить о расширении/сужении типов в аргументах переопределяемых методов в случае, если бы в Java список формальных параметров не входил бы в сигнатуру метода.

6. Паттерны проектирования

Напоминаю, не стоит глубоко спрашивать о паттернах проектирования. И ни в коем случае не поучайте кандидата рассказами о том, «насколько они полезные» и «как их правильно реализовывать». Кстати, по поводу красоты/понятности кода и быстроты его написания мой друг говорит следующее: «Чтобы уметь круто хачить на Java, нужно дохера хачить на Java».

Каталог паттернов проектирования можете найти здесь

Вопросы собеседования по многопоточности в Java

7. Многопоточность в Java.

Хочу посвятить этой теме цикл статей: одним абзацом не отделаешься. Если вкратце, спросите, зачем нужна многопоточность, что такое монитор объекта, спросите о модификаторах syhcnronized и volatile, методах wait/notify/notifyAll, а так же о пакете java.util.concurrent. А следующий фрагмент кода должен привести к достаточно интересному разговору:

Интересная статья про методы wait/notify доступна здесь.

Вопросы, связанные с базами данных

8. SQL

Для начала стоит задавать вопросы по ANSI SQL. Далее, в зависимости от СУБД, используемой на проекте, можно спрашивать о важных отличиях ее диалекта. Итак, пусть человек расскажет об основных элементах баз данных — таблицах, процедурах, функциях, констрейнтах и т.д. О констрейнтах можно поспрашивать чуть подробнее. Стоит поинтересоваться, как человек понимает null в базах данных. Переходите к агрегатным функциям и о том, как они работают с null, не забудьте о group by и having. Можно дать пару маленьких задачек на эту тему (см. задачи 1-2 ниже). Поспрашивайте о типах join и дайте пару задачек (см. задачи 3-4 ниже).

Задача 1. Дана таблица T с колонкой A целого типа, содержащая значения 10, 20, 30, null. Чему будут равны результаты выражений «AVG(A)» и «SUM(A) / COUNT(*)»?

Задача 2. Дана таблица T с колонкой A целого типа. Напишите запрос, который вернет все положительные значения встречающиеся в таблице более одного раза.

Задача 3. Даны таблицы T1 и T2. В каждой есть колонка A целого типа. Значения в первой таблице — 1, 2, а во второй — 2, 3. Что вернут запросы с inner join, left/right/full outer join и cross join вида «select T1.A, T2.A from T1 . join T2 on T1.A = T2.A».

Задча 4. Даны 2 таблицы с колонками A целого типа. Напишите запрос, который вернет все значения колонки А из первой таблицы, для которой нет соответствия в колонке A второй.

Статья о конструкции Join доступна здесь

9. JDBC API

Тут тоже без особых извращений. Спросите о Connection, Statement, PreparedStatement, CallableStatement, ResulSet, зачем каждая из этих сущностей нужна. Можно поинтересоваться о том, чем они являются: абстрактными классамм, конкретными классами или интерфейсами и почему.

Еще вопросы — как создать соединение в JDBC, каким образом лучше добавлять большое количество записей в таблицу, ну и обязательно о транзакциях и autocommit. Чуть не забыл — вопрос об уровнях изоляции транзакций считаю как минимум странным — в следующий раз, когда решите его задавать, вспомните, сколько раз с уровнями изоляции сталкивались лично вы.

Читайте на блоге подробный туториал по JDBC.

Вопросы собеседования по веб-программированию

10. Servlet API

Для начала надо спросить об HTTP в целом. Что такое хедеры запроса, какие вообще типы запросов бывают, что такое HTTP Status Code.

Далее нужно спросить про класс HttpServlet, в каком виде можно работать с запросом и ответом. Что такое сессия (HttpSession) и как ее получить. Не забудьте спросить про ServletFilter и варианты их использования.

Организм требует сна. Статью завершу через некоторое время. Удачи всем.

Java FAQ: для начинающих

Привет всем форумчанам,в этом Java FAQ,е постараюсь собрать все самое нужное о Java)
Для начала давайте разберемся,что такое Java?Как говорит нам вики:

Java — объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems
(в последующем приобретённой компанией Oracle). Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине (JVM) вне зависимости от компьютерной архитектуры. Дата официального выпуска — 23 мая 1995 года.(http://ru.wikipedia.org/wiki/Java)

Но Java это не только язык программирования,но и платформа,которая позволяет сделать нам все,что душа захочет,и вообще это классная весчь)

Пойдем дальше,многие видели,что есть какая-то Java SE,EE и.т.дНо какую Java,мне использовать?

Java SE — Java Standard Edition, основное издание Java, содержит компиляторы, API, Java Runtime Environment; подходит для создания пользовательских приложений, в первую очередь — для настольных систем.
Java EE — Java Enterprise Edition, представляет собой набор спецификаций для создания программного обеспечения уровня предприятия(сервлеты,jsp,и.тд).
Java ME — Java Micro Edition, создана для использования в устройствах, ограниченных по вычислительной мощности, например в мобильных телефонах, КПК, встроенных системах;
JavaFX — технология, являющаяся следующим шагом в эволюции Java как Rich Client Platform; предназначена для создания графических интерфейсов корпоративных приложений и бизнеса.
Java Card — технология предоставляет безопасную среду для приложений, работающих на смарт-картах и ​​других устройствах с очень ограниченным объемом памяти и возможностями обработки.

Видите,выбирай по вкусу,идем дальше,как мне начать пользоваться и писать на Java?Очень просто Нужно выпольнить несколько простых шагов:

  1. Нужно скачать JDK(скачать отсюда http://www.oracle.com/technetwork/ja. s-2133151.html)
  2. Установить JDK.Это просто щелкайте по установленному приложению,она загрузилась,дальше настройте системные переменные.Заходите Пуск\пр.щ.мыши по мой компьютер\свойства\слева меню дополнительные параметры системы\внизу переменные среды\системные переменные.Далее нажмите создать,и пропишите сначала
    JAVA_HOME(имя переменной) C:\Program Files\Java\jdk1.8.0_92(путь взял для примера)(значение переменной)
    PATH(имя переменной) C:\Program Files\Java\jdk1.8.0_92\bin(путь взял для примера)(значение переменной)
  3. Все!!)можно уже писать на Java,но вы скажете,что прямо в командной строке,я скажу -да)Но можно и в IDE(http://ru.wikipedia.org/wiki/%D0%98%. 82%D0%BA%D0%B8) .Их много,выбрал самые популярные):
    1. Eclipse
    2. Netbeans
    3. IntelliJ IDEA(версия Ultimate Edition — платная, Community Edition — бесплатная)
    4. Jdeveloper

Тут уж ваш выбор,где писать,почитайте,установите,какая вам понравится в ней и пишите)

Итак,мы все настроили ,установили,давайте что-нибудь напишем на Java,давайте,открываем понравившуюся IDE,и пишем в ней такое:

Смотрим в консоль ,и видим:
Тут не Hello Word,странно??
Можете порадоваться,но то,что вы сейчас написали,ради чего мучались,это капля в море,из всего моря..языка Java
Поэтому,мы же хотим стать крутыми программистами,нам нужно дольше изучать Java,и тут встает вопрос о литературе,долго о ней говорить я не буду,просто скажу:
Кей Хорстманн Гари Корнелл Java 2 Том 1.Основы
Кей Хорстманн Гари Корнелл Java 2 Том 2.Тонкости программирования
Я считаю(и не один я )лучшими книгами по Java для начинающих

На нашем форуме есть раздел Литература по Java Литература по Java .Там много интересного почитайте)

(предлагайте ссылки в сообщениях)

P.S Предлагаю в этой теме выложить простые программы для начинающих(я в их числе)
Если я где-то ошибся ,исправьте,следующий FAQ,создание простого сайтика,с картинками!))
Всем пока,удачи!!)
И главное не путайте Java и JavaScript,это разные вещи)

Как выучить Java с нуля: советы новичкам

Есть множество причин изучать Java (самостоятельно или записавшись на курсы Java) независимо от того, новичок вы в программировании или специалист по другому языку. Самые очевидные из них связаны с тем, что Java — язык универсальный и надёжный. Он работает почти на любом устройстве, от “умного” утюга и телефона до автомобиля Tesla и суперкомпьютера. У Java — отличная обратная совместимость: это значит, что поддерживать старый Java-код относительно легко, как и переходить на новые версии языка.

Поэтому Java так популярна. На Java пишут серверные приложения, системы для работы с большими данными, Android-программы, веб- и десктопные приложения. Исходя из этого, найти работу Java-программисту гораздо проще, чем специалисту в других языках.

В этой статье расскажем о том, как подойти к изучению Java с учетом особенностей этого языка и где учиться на практике.

А теперь — подробнее: почему Java?

Прежде, чем обсудить подходы к изучению Java, мы должны расставить все точки над i в вопросе, зачем учить Java в принципе.

Java — отличный выбор для новичков, ориентированных на карьеру. Он занимает первые места в рейтингах популярности (например, TIOBE) и является одним из самых востребованных языков программирования в мире. Только вдумайтесь в это число: три миллиарда устройств используют Java! Это значит, что найти работу или стажировку “джависту” достаточно легко.

Факты свидетельствуют о том, что 90% компаний из списка Fortune 500 используют Java для создания приложений и серверных систем.

Кроме того, этот язык — выгоден с финансовой точки зрения: скажем, в США типичный Java-программист зарабатывает 102 514 долларов в год. Для стран постсоветского пространства цифра будет несколько более скромной. И тем не менее, зарплатная планка Java-программистов очень высока даже в России или Украине, особенно по сравнению с оплатой труда других специалистов массовых профессий.

Вы можете использовать Java для создания различных платформ и приложений для любых устройств — ноутбуков, компьютеров, игровых консолей, автомобильных навигационных систем, проигрывателей Blu-ray, устройств медицинского мониторинга, лотерейных терминалов, парковочных счетчиков и так далее. Благодаря этой универсальности варианты специализации Java-разработчиков стремятся к бесконечности.

У Java есть библиотеки почти на все случаи программистской жизни. То есть этот язык — отличный инструмент для решения подавляющего большинства задач.

Особо выделим приложения для Android. Большинство из них также создаются на Java, что открывает возможности ещё и для мобильной разработки во всём её разнообразии. К слову, есть несколько очень удачных курсов Java для Android, и в этой статье мы их упомянём.

Наконец, не стоит сбрасывать со счетов мощнейшее сообщество Java, которое может оказать поддержку в процессе обучения:

  • 2-е по величине сообщество StackOverflow
  • 4-е по величине сообщество Meetup (насчитывается более 1400 групп Java Meetup, общее количество участников которых превышает 580 000)
  • 2-й язык с наибольшим количеством тегов на GitHub (более 1,5 миллионов Java-проектов живут на GitHub)

В конечном счете, Java может быть не самым простым языком для изучения, но есть много причин, по которым стоит остановиться на этой задаче.

Трудно ли изучать Java?

И да, и нет. Поначалу вы столкнетесь с простыми “азбучными” понятиями — переменными, методами (функциями), библиотеками. Однако не стоит обольщаться и думать, что и дальше всё будет так же просто. В Java есть и более сложные и абстрактные вещи. Например, новичку не так уж просто сразу осознать объектно-ориентированный стиль программирования, а многопоточность и вовсе способна произвести когнитивный диссонанс в неподготовленном мозгу. Но на самом деле, если правильно подойти к учёбе, освоение Java упрощается на порядок. Тем более, с какого-то момента всё станет проще уже хотя бы потому, что вы обретёте прочный фундамент.

В этой статье мы расскажем вам о правильных подходах к изучению языка, и о ресурсе, с помощью которого можно эти правильные подходы применить и постепенно обрести тот самый прочный фундамент.

5 главных советов, как изучать Java, чтобы не было мучительно больно

Если мы вас убедили в том, что изучать Java — отличная идея, постараемся рассказать, как подойти к обучению так, чтобы дорога к освоению языка была наиболее короткой.

1. Соблюдайте правильный баланс между теорией и практикой

Теоретические знания, разумеется, нужны. Они помогают понять внутренние процессы, объясняют, почему в программе всё происходит именно так, а не иначе. Однако потреблять теорию нужно умеренно, если речь идёт о столь практической сфере, как программирование. Особенно на первых порах.

Тем не менее, огромное множество новичков совершает одну и ту же ошибку: они пытаются с самых первых шагов поглубже погрузиться в теорию. Они читают книги и лекции по Java, смотрят видеоролики в надежде, что после этого программы писать будет намного проще. Но дело в том, что так не будет: практическая деятельность по-настоящему познаётся только на практике. Это всё равно, что надеяться научиться плавать или кататься на коньках, в основном читая книги по плаванью и конькам.

Поэтому совет номер один: создавайте базу знаний за счёт теории постепенно, а концентрируйтесь — на практических занятиях. Если всё время учёбы — это 100%, то практике нужно посвящать примерно 75-80% этого времени.

В начале обучения не пытайтесь понять всю подноготную создаваемых вами программ сразу: почитайте немного, чтобы знать синтаксис, а затем пишите код снова и снова! Вы будете учиться по ходу дела, и то, что вы отточили на практике, вы поймёте гораздо глубже и быстрее.

Тем, кто занимается без ментора, довольно сложно соблюдать этот баланс. Начинающему разработчику непонятно, откуда брать задания, какие задания ему подходят, а за какие следует браться позже. Кроме того, кто проверит корректность кода или поможет, если что-то не получается?

В сети можно найти хорошие видеокурсы или площадки с заданиями по Java. Один из лучших курсов — JavaRush, поскольку в нём соблюден указанный выше баланс: он на 80% ориентирован на практику и только на 20% — на теорию. В курсе Java Core рассматривается полностью (синтаксис Java, ООП, структуры, многопоточность и т. Д.), но при этом вы не увязнете в теории, а будете познавать её постепенно, прежде всего решая множество упражнений.

После того, как вы решите все 1200+ задач в JavaRush, у вас будет порядка 500 часов реального опыта программирования.

2. Создайте расписание учёбы и поставьте чёткие цели

Скачки от одного к другому крайне редко приносят хороший результат в учёбе. Гораздо эффективнее погрузиться в язык однажды и уже не отвлекаться на другие. Представьте, что вы будете изучать одновременно испанский и итальянский языки. Скорее всего, вы запутаетесь и в конечном итоге будете пользоваться неким гибридом.

Итак, вы хотите изучить Java. Это — ваша самая первая и общая цель. Теперь следует составить программу и разбить вашу цель на более конкретные “подцели”, чтобы сохранить импульс. Работать над избранной учебной программой лучше каждый день. Даже если вы потратите на учёбу всего полчаса в день, если вы будете каждый день писать код, это закрепит привычку и станет частью вашей жизни гораздо быстрее, чем если занятия будут нерегулярными. И постарайтесь себя убедить, что ваши занятия — это не блажь и не развлечения. Они для вас — обязательны.

Чтобы оставаться сосредоточенным при низкой мотивации, напоминайте себе, почему вы хотите изучать Java в принципе. Хотите стать профессиональным разработчиком и найти классную работу? Возможно, мечтаете создать собственное приложение? Определите свои цели и сделайте из них “маячки”, а затем — ориентируйтесь на них, как только почувствуете потерю мотивации (а это случается чаще, чем хотелось бы, особенно при самостоятельном обучении).

Если вам сложно организовать себя самостоятельно, возможно, следует воспользоваться приложением с функциями тайм-менеджмента, которое напоминало бы вам о начале занятия.

В курсе JavaRush часть этой работы уже проделана за вас. Там есть последовательная программа и уйма задач с автопроверкой правильности решений. А ещё он разбит на небольшие модули, и вы будете чётко видеть прогресс. Так что вам остаётся только задать самому себе темп и — вперёд!

3. Попробуйте игровой формат в обучении, чтобы успешно учиться, сохраняя мотивацию

Давайте посмотрим правде в глаза: успешных самоучек в любой отрасли — не очень много. Возможно, один на сотню найдётся. Низкий процент объясняется не чьей-то тупостью или безалаберностью. Чаще всего вполне разумные люди, споткнувшись о неудачи, теряют мотивацию, поскольку не в состоянии оценить свой реальный прогресс. А порой они попросту не понимают, что их усилий было недостаточно для преодоления той или иной трудности.

Вы наверняка играли в компьютерные игры и сталкивались с ситуацией, когда не могли пройти уровень с первого раза. Тем не менее, если в игре соблюдён разумный баланс сложности, у вас обычно не возникает мысли “я никогда не смогу этого сделать”. Вы просто пытаетесь снова и снова, и в конце-концов уровень поддаётся, вы набираете какое-то количество баллов или получаете нужный предмет для продолжения — чувствуете радость от преодоления и… отправлялись покорять новую вершину!

Так вот, идея в том, что тот же принцип можно применить в обучении программированию. Если вы вовлечены в игровой процесс, видите результат, получаете поощрение за продвижение от уровня к уровню, вы гораздо охотнее будете садиться за учёбу. Так работает наш мозг — ему нужно поощрение, то есть подтверждение того, что его усилия не тщетны!

Вот почему JavaRush идеально подходит тем, у кого нет опыта программирования: опыт в играх, хотя бы небольшой, есть практически у всех, а в этом курсе применена геймификация:

  • JavaRush проходится как видеоигра. Когда вы правильно решаете задачу, вы получаете «темную материю» (баллы, которые вам нужны, чтобы открыть следующую лекцию или следующий уровень).
  • Вы играете за антропоморфного робота по имени Амиго, и проходите курс от уровня к уровню, от квеста к квесту, собирая и тратя темную материю.
  • У курса есть сюжет, включающий космические путешествия, инопланетную жизнь и роботов.
  • JavaRush разделен на 40 уровней (4 квеста по 10 уровней), каждый из которых содержит около 15-30 заданий, связанных с написанием кода, 10-20 лекций по Java, а также мотивационные статьи — они помогут вам двигаться вперед, даже когда становится сложно.

Пройдя эту игру, вы научитесь программировать!…Видеоигры, кстати, написаны программистами, все до единой.

4. Общайтесь с другими студентами и Java-программистами. Не стесняйтесь задавать вопросы!

Для лучшего понимания того, как идёт учёба, люди осмысленно или подсознательно сравнивают себя с другими. Кроме того, общаться с теми, кто учит то же, что и вы — чрезвычайно полезно.

Общаясь с другими программистами вы получите не только ответы на вопросы: вы познакомитесь с людьми со схожими интересами, что ускорит ваше обучение и повысит уверенность, что вы всё делаете правильно.

Когда становится тяжело (а в любом адекватном учебном процессе бывают такие моменты, даже у гениев), заданные вовремя правильные вопросы — это уже половина успешного разрешения проблемы. Не бойтесь спрашивать, даже если вам кажется, что ваш вопрос глупый и вас засмеют. Начинающими были АБСОЛЮТНО все и чего-то не знать или не понимать — естественно. Так что если кто и будет смеяться над вами, это — проблема того, кто будет смеяться, а не ваша.

Цукерберг рекомендует:  5 распространенных ошибок начинающих программистов

Помимо Stack Overflow, задавать вопросы по Java можно в специальном разделе “Помощь” на JavaRush. В этом сообществе студенты просят подсказки, помогают преодолеть препятствия и делятся ответами и советами.

Кстати, вы тоже можете помогать другим студентам с их вопросами — это очень полезно. Такая взаимопомощь поможет учиться быстрее и запоминать больше информации.

5. Создайте собственное портфолио

Один из первых советов начинающему разработчику, который уже выучил азы языка — “создайте собственный проект и дайте возможность другим увидеть вашу работу”. Это отличный совет. Подумайте над своим проектом. Это не обязательно должно быть что-то масштабное, но нечто такое, что позволит оценить ваш уровень владения Java. Например, небольшая игра или приложение по тайм-менеджменту.

В таком случае, когда вы начнёте рассылать своё резюме на вакансию Java-разработчика или заняться внештатными проектами, у вас уже будет портфолио, которое вы сможете продемонстрировать потенциальным работодателям или заказчикам.

Сегодня это сделать очень просто. Создайте учетную запись GitHub, прочитайте, как с ним работать (это несложно) и публикуйте там свои проекты.

Заключение

Теперь вы вооружены стратегиями и техниками, которые помогут вам правильно изучить Java. Главные ключи к изучению Java — это практика, последовательность шагов, но самое позитивное — ничто вам не мешает сделать своё путешествие увлекательным!

Начните его с прохождения бесплатных уровней на JavaRush

Как поступить чтобы проще понять java?

Писать код, читать чужой, повторять за видео уроками — сначала будет нихрена непонятно, но «мышечную» память поможет развить. Параллельно читайте какую-нибудь хорошую книгу-справочник по Java. Со временем придёт понимание.

Поставьте себе цель сделать какое-то конкретное приложение, которое будет решать вашу конкретную проблему. И делайте. Смиритесь с мыслью, что первые три месяца будет полнейший ступор.

Для общего понимания программирования можно почитать «грокаем алгоритмы», и другие книги этого автора.

Смысл после изучения C# изучить java. Как по мне этого будет достаточно. Вы можете начать с любого языка. Я например, начал с Java, Правда, до этого у меня были базовые знания по php, html, css, js.
Если бы вам был интересен веб, то можно было бы начать с рнр, так как там низкий порог вхождения.
Что касается изучения java, то в первую очередь вам нужно иметь теоретические знания. Дальше научитесь применять эти знания на практике. Например, ставьте простые задачи перед собой и реализуйте их или например, найдите задачки по программированию и напишите свой код для их решения. Немалый результат показывает изучение чужого кода, так вы сможете понять логику программирования. На открытых источниках github.com || bitbucket.com найдите простые программки и проанализируйте их, привыкните к синтаксису.

Есть например, книга Java для начинающих. В книге вы пошагово научитесь создавать игру морской бой, драм машину и другие простые программы. И постепенно ставьте более сложные задачи. При возникновении вопросов или ошибок ищите решение на stackoverflow. При должном поиске вы найдете решение примерно в более 90% случаев.

Можете конечно взять курсы на stepik.org или на udemy.com, но я по своему опыту (я и сам в кой-то мере новичок), могу сказать, что вам нужно иметь базовые знания, чтобы потом пройти курсы и понять их смысл, потому как некоторые курсы хоть и нацелены на новичков, но усложнены отсутствием теории

Вот, неплохие курсы по java.
Правда, теории мало, так как человек делится своими мыслями, но довольно неплохо.
https://www.youtube.com/watch?v=uXMTq81jG7Y&list=P.
Тоже неплохой курс
https://www.youtube.com/watch?v=_jXDPfUKm58&list=P.

А теперь, самый главный вопрос — выбор языка и цель которую вы хотите достичь в программировании.
Вы говорите, что прочитали пару книг и поняли, что не хотите заниматься вебом, а хотите заниматься разработкой десктопных приложений на java. Поделюсь своим мнением. java не самое лучшее решение для десктопа и для игр. Да, технически вы можете создать какое-нибудь javafx, swing приложение на java. Но эти технологии со временем устаревают. Можно изучить фреймворк Spring и создавать десктопные приложения на нем. Другое дело, что вы будете декстопные приложения писать на C#. А для игр например.создан фрейм Unity3d, который поддерживает C# (java не поддерживается). Java используется в энтерпрайзе. Соответсвенно, знание Java EE желательно.
Можно конечно поизвращаться и написать десктопное приложение на java используя различные транспайлеры типа JSweet, который будет конвертировать ваш java код в javascript код и используя фреймворк ElectronJS написать десктопное приложение. Но как по мне легче изучить тогда Vanilla JS и писать сразу на нем, чем извращаться на java кодом)) Ну и java не подойдет для написания драйверов и т.д. Зато java & kotlin широко используются в мобильном программировании.

Вопросы и ответы к собеседованию на Java junior

Вопросы к собеседованию на должность Java Junior.


Подготовка к собеседованию на должность Java Junior является неотъемлемой частью пути начинающего разработчика. Перед тем как начать обход потенциальных работодателей необходимо основательно подготовиться к встрече с ними. Очень важно постараться предусмотреть вопросы, которые Вам будут заданы техническими специалистами. Очень часто так бывает, что юный соискатель прочёл несколько книг, прошёл какой-либо курс и даже, возможно, написал своё приложение для демонстрации возможностей, но волнение или отсутствие ясной картины об языке или технологии в целом не дают связать и пары слов на собеседовании. Он смотрит на потенциального работодателя, всё понимает, но не знает как правильно изложить свои мысли.

Я постарался собрать наиболее полный список вопросов к собеседованию на должность java junior, большинство из которых Вы точно услышите при поиске своего первого места работы в отрасли java разработчика.

94)Как в java можно разделить вывод сообщений в системную консоль, а ошибок в файл?
95)Какая разница между интерфейсом и абстрактным классом?
96)Когда лучше использовать синхронизированный блок вместо синхронизированного метода?
97)Какое назначение у ключевого слова transient?
98)Как можно запустить сборщик мусора?
99)В чём разница между конструкторами и другими методами?
100)Объясните в чём смысл использования пакетов в Java?
101)В чём разница между J2SDK 1.5 и J2SDK 5.0?
102)Имеет ли значение, в каком порядке отлавливаются исключения FileNotFoundException и IOException, и почему?
103)Что произойдёт, если заменить && на & в следующем коде:

104)В чём главная разница между Vector и ArrayList?
105)В чём разница между очередью и стеком?
106)Назовите все состояния объекта Thread?
107)В какие состояния может перейти нить, при входе в блок synchronized?
108)В какое состояние перейдет нить, при вызове метода wait()?
109)В какое состояние перейдет нить, при вызове метода wait(500)?
110)В какое состояние перейдет нить, при вызове метода notify()?
111)В какое состояние перейдет нить, при вызове метода notifyAll()?
112)Три нити в блоке synchronized вызвали wait() у объекта-мютекса.
113)В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()?
114)Чем отличается join(500) от wait(500)?
115)Чем отличается wait(500) от sleep(500)?
116)В какое состояние перейдет нить при вызове метода yield()?
117)Можно ли объявлять внутренние классы private?
118)Можно ли объявлять анонимные внутренние классы private?
119)Сколько у класса максимально может быть внутренних классов?
120)В чём смысл ключевого слова super в Java?

Переменные и методы суперкласса могут быть переопределены в классе-наследнике. В случае переопределения, подкласс определяет свои переменные и методы, используя имена переменных и методов суперкласса.
В результате переопределения подкласс больше не сможет обращаться к переменным и методам суперкласса напрямую, ведь они теперь оказываются скрытыми в пространстве имён подкласса. К счастью, в Java предусмотрен механизм доступа к переопределённым методам и переменным суперкласса — ключевое слово super. super может помочь при обращении к переменным, методам, конструкторам суперкласса.
Важный момент: при вызове конструктора суперкласса super должен быть первым выражением в конструкторе.

121)Какая разница между перегрузкой и переопределением методов в Java?
122)Благодаря чему приложения Java не зависят от платформы?
123)Что такое перегрузка(overloading) метода в Java?
124)Какие отличия между C++ и Java?
125)Что такое JIT компиляция?
126)Что такое байт-код?
127)Что такое класс(class)?
128)Что такое объект в Java?
129)Что такое метод в Java?
130)В чём смысл инкапсуляции?
131)Объясните почему у метода main() именно такая сигнатура (public, void, static)?
132)Что такое конструктор в Java?
133)В чём разница между length и length()?
134)Что такое ASCII?
135)Что такое Unicode?
136)Что такое и как используются константы в Java?
137)В чём разница между «>>» и «>>>» в Java?
138)Какие Вы знаете стандарты оформления кода?
139)Что такое «IS-A» отношение в Java?
140)Что такое «HAS-A» отношение в Java?
141)В чём разница между отношениями «HAS-A» и «IS-A»?
142)Объясните назначение оператора instanceof в java?
143)Что есть null в Java?
144)Можно ли иметь много классов одном файле?
145)Какие модификаторы доступа можно указывать для главного (top) класса?
146)Можно ли указывать более одного пакета в одном файле?
147)Можно ли объявлять пакет после объявления импорта файле?
148)Что такое ThreadGroup и зачем он нужен?
149)Что такое ThreadPool и зачем он нужен?
150)Что такое ThreadPoolExecutor и зачем он нужен?
151)Что такое Concurrency?
152)Что такое «атомарные типы» в Java?
153)Зачем нужен класс ThreadLocal?
154)Что такое модификатор volatile?
155)Что такое Executor?
156)Что такое ExecutorService?
157)Зачем нужен ScheduledExecutorService?
158)Назовите все состояния объекта Thread.
159)В какие состояния может перейти нить при входе в блок synchronized?
160)В какое состояние перейдёт нить при вызове метода wait()?
161)В какое состояние перейдёт нить при вызове метода wait(500)?
162)В какое состояние перейдёт нить при вызове метода notify()?
163)В какое состояние перейдёт нить при вызове метода notifyAll()?
164)Три нити в блоке synchronized вызвали метод wait() у объекта-мютекса. В какое состояние перейдут эти нити, если четвертая нить вызовет notifyAll()?
165)Чем отличается join(500) от wait(500)?
166)Чем отличается wait(500) от sleep(500)?
167)В какое состояние перейдёт нить при вызове метода yield()?
168)Какие модификаторы доступа могут использоваться с классами?
169)Перечислите модификаторы доступа у методов.
170)Расскажите об абстрактных классах в Java.
171)Можно ли описать конструктор в абстрактном классе?
171)Что такое абстрактный метод?
172)Что такое исключения в Java?
173)Назовите несколько вариантов применения механизма исключений.
174)Что такое перехват исключений в Java?
175)Сколько способ обработки исключений Вы знаете?
176)Назовите 5 ключевых слов, относящихся к механизму Java.
177)Можно ли использовать блок try без блока catch?
178)В чём важность блока finally?
179)Можно ли писать код между блоками try … catch?
180)Можно ли отлавливать более одного исключения в одном блоке catch?
181)Что такое проверяемое (checked exceptions) исключение?
182)Расскажите о непроверяемых (unchecked exceptions) исключениях.
183)Для чего служит ключевое слово throw?
184)Можно ли писать код после throw?
185)Для чего нужно ключевое слово throws?
186)Может ли быть так, что блок finally не будет выполнен? Если да, то когда?
187)Можно ли блоке catch перехватить проверяемое (checked) исключение?
188)Как можно создать собственное исключение?
189)Можно ли выбросить исключение из блока catch?
190)Можно ли использовать вложенность для блоков try?
191)В каком случае можно получить ClassNotFoundException?
192)Поток и процесс — это одно и тоже? Если нет, в чём разница?
193)Что такое многопоточность в Java?
194)Какие есть преимущества у многопоточного программирования?
195)Сколько способов создания потока (thread) Вы знаете?
196)Какой лучший подход создания потока(thread)?
197)Что Вы знаете о планировщике задач в JVM?
198)Можно ли стартовать мёртвую нить в Java?
199)Можно ли перезапустить нить после запуска?
200)Какие способы синхронизации Вы знаете?
201)Что такое синхронизированный метод?
202)Могут ли зайти в синхронизированный метод потоки, если в нём уже находится один поток?
203)Что такое синхронизированный блок в Java?
204)Могут ли статические методы быть синхронизированны?
205)Как в Java используются приоритеты потоков?
206)Как можно задать или изменить приоритет нити?
207)Если две нити имеют одинаковый приоритет, какая начнёт выполнение первой?
208)Получит ли шанс на повторное выполнение уступившая (yielded) нить?
209)Объясните важность метода join()
210)Что является демоном (daemon) в Java?
211)Объект или ссылку уничтожает сборщик мусора?
212)Когда и кто может вызывать finalize() метод в Java?
213)Приведите пример перечислений (enumeration) в Java.
214)Есть ли разница между коллекцией, Collection и Collections в Java?
215)Какие классы реализуют интерфейс List?

1) ArrayList
2) Vector
3) LinkedList

216)В чём разница между ArrayList и LinkedList?
217)Для чего нужен класс Iterator и какие у него есть методы?
218)Какая разница между Comparator и Comparable?
219)Какие есть альтернативы у сериализации в Java?
220)Как сделать объект сериализуемым?
221)Что такое serialVersionUID и обязательно ли его определять?
222)Какие 2 метода необходимы объекту для того, что бы он мог являться ключом в HashMap?

Перед тем как использовать объект как ключ в HashMap, необходимо убедиться в том что у него реализованы (правильно) методы equals и hashcode.

223)Что такое Java-апплет? Что вы о нём знаете?

Java-апплет — это программа на языке Java, которая может встраиваться в HTML разметку и выполняться прямо в браузере на стороне клиента. Апплеты используются для создания динамичных и интерактивных страниц.

224)Расскажите о жизненном цикле java-апплета.

Апплет может находиться в следующих состояниях:
Init: Апплет инициализируется каждый раз, когда запускается.
Start: Начинается выполнение апплета.
Stop: Останавливается выполнения апплета.
Destroy: Завершение и уборка за собой. Освобождение ресурсов, очистка.

225)Что происходит при загрузке апплета?
226)В чём разница между апплетом и Java-приложением?
227)Какие ограничения существуют у java-апплетов?
228)Что такое «ненадежный апплет»?
229)В чём разница между апплетом, загруженным через интернет и апплетом, загруженным из файловой системы?
230)Что из себя представляет загрузчик классов для апплетов?
231)Что такое и что обеспечивает менеджер безопасности апплетов?

SWING

232)В чём разница между Choice и List?
233)Для чего нужен layout manager?
234)В чём разница между Scrollbar и JScrollPane?
235)Какие есть потоко-защищённые метод в SWING?

Всего 3 потоко-защищённых метода: repaint, revalidate, и invalidate.

236)Назовите 3 подкласса Component, поддерживающих рисование.

Canvas, Frame, Panel

237)Что такое клиппинг (clipping)?
238)В чём разница между MenuItem и CheckboxMenuItem ?
239)По какому принципу выстраиваются элементы в BorderLayout?
240)По какому принципу выстраиваются элементы в GridBagLayout?
241)Какая разница между классами Window и Frame?
242)Может ли GUI компонент сам обрабатывать свои события?
243)Какой паттерн проектирования используется для всех Swing компонентов?

244)Что такое JDBC?
245)Для чего используется драйвер JDBC?
246)Какое назначение у метода Class.forName?
247)Какие преимущества PreparedStatement над Statement ?

Remote Method Invocation (RMI)

248)Что такое RMI?
249)Какие базовые принципы архитектуры RMI Вы знаете?
250)Какие уровни составляют архитектуру RMI?
251)Какова роль удалённого интерфейса в RMI?
252)Для чего служит java.rmi.Naming Class?
253)Как вы понимаете связывание в RMI?
254)Какая разница между использованием bind() и rebind() методов?
255)Какие шаги необходимо выполнить для запуска RMI программы?
256)Что такое «заглушка» (stub) в RMI?
257)Что такое DGC и как это работает?
258)Какая цель использования RMISecurityManager в RMI?
259)Приведите примеры Marshalling и demarshalling.
260)Приведите примеры Serialization и Deserialization.

Servlets

261)Что такое сервлет?
262)Приведите пример архитектуры сервлетов.
263)В чём разница между Applet и Servlet?
264)В чём разница между GenericServlet и HttpServlet?
265)Расскажите о жизненном цикле сервлета.
266)В чём разница между doGet() и doPost()?
267)Что означает «Веб-приложение»?
268)Что такое Server Side Include (SSI)?
269)Что такое цепочка сервлетов?
270)Как вы узнаете что клиентская машина послала запрос вашему сервлету?
271)Какая структура у HTTP заголовка?
272)Что такое cookie?
273)По какому протоколу взаимодействуют браузер и сервлет?
274)Что вы знаете о HTTP Tunneling?
275)Что такое URL Encoding и URL Decoding?

276)Что такое JSP страница?
277)Как происходит обработка JSP запроса?
278)Какие есть преимущества использования JSP?
279)Что такое директивы? Чем различаются типы директив, доступных в JSP?
280)Что такое JSP действия?
281)Что такое сценарии (скриптлеты, Scriptlets) ?

Общее

282)В чём разница между JDK и JRE?
283)Что такое JVM?
284)Почему Java называется «платформо-независимым» языком?
285)Какие есть типы данных в Java?
286)Что такое Autoboxing и unboxing?
287)Какая разница между String и StringBuffer?
288)Какая разница между байтовым и символьным потоками?
289)Что такое FileInputStream и FileOutputStream?
290)Что такое FileReader и FileWriter?
291)Как работать с классом SimpleDateFormat?
292)Как из объекта типа Date получить строку «21 Aug 1992»?
293)Что такое ClassLoader?
294)Напишите программу, проверяющую число на четность/нечетность.
295)Приведите пример двойной проверки блокировки в синглтонею
296)Как создать потоко-безопасный синглтон?
297)Когда используются volatile переменные?
298)Когда используются transient переменные?
299)В чём разница между volatile и transient переменными?
300)Можно ли переопределить приватный метод?
301)Какая разница между List и Set?
302)В чём разница между PATH и Classpath в Java?
303)Может ли абстрактный класс иметь конструктор?
304)Как сделать класс Immutable?
305)Какие типы данных используются для представления денег?
306)Какой последний паттерн проектирования Вы использовали?
307)Сколько в java зарезервированных ключевых слов? Сколько из них используются?
308)Какие символы нельзя использовать в имени переменной?
309)На какие группы делятся типы данных в Java?
310)Какие значения присваиваются разным типам по умолчанию?
311)Какие есть циклические конструкции в java? Когда и какуую использовать?
312)Как Вы понимаете слово «класс»? Опишите термин своими словами.
313)Какие вы знаете блоки инициализаций?
314)Как правильно реализовывать hashcode объекта?
315)Есть ли смысл в добавлении private методу модификатора final?
316)Какие есть коллекции типа Queue?
317)Можно ли сделать коллекцию только для чтения? Если да, то для чего? Если нет, то почему?
318)Какие главные отличия между стеком и очередью?
319)Что означает термин «конкатенация»?
320)Как можно разбить строку на подстроки встроенными средствами java?
321)К чему приведёт выполнение одного и того же участка кода разными потоками?
322)Как можно получить ссылку на текущий поток?
323)Какие условия должны выполниться перед вызовом методов wait/notify?
324)Что является мьютексом в случае синхронизированного метода?
325)Что вы знаете об агрегатных функциях? Как они работают со значением null?
326)Опишите структуру, используемую в веб-проекте.
327)Что вы знаете о ServletConfig?
328)Методы, необходимые к определению при создании сервлетов.
329)Что такое WWW?
330)Какие методы передачи данных по HTTP вы знаете?
331)Что Вы знаете об ORM?
332)Какие Вы знаете принципы ООП? Откуда Вы их знаете? Используете ли?
333)Что входит в сигнатуру метода? Что не входит?
334)В чём особенность инициализации final static переменных?
335)Какие отличия и в чём сходства между внутренними и вложенными классами?
336)Какого предназначение модификаторов abstract и final в отношении методов и классов.
337)Могут ли быть перехвачены исключения из разных веток наследования в одном блоке catch?
338)Что такое Error? Для чего используется?
339)Какие есть особенности у коллекций типа Set?
340)Возможно ли получение синхронизированной коллекции из несинхронизированной?
341)Приведите пример выброса ConcurrentModificationException.
342)Можно ли наследоваться от строкового типа?
343)Каким методом можно вырезать подстроку?
344)Какие основные классы есть в механизме ввода-вывода в Java?
345)Какой символ используется в качестве разделителя при указании пути к элементам файловой системы в Java?
346)Когда стоит рассматривать использование многопоточности в приложении? Всегда ли многопоточность — это хорошо?
347)Для чего нужны потоки-демоны? Есть ли потоки-ангелы?
348)Где используется метод join?
349)Какие есть неявные, внутренние объекты JSP EL? Чем они отличаются от объектов jsp?
350)Какой у сервлета жизненный цикл? Какие методы вызываются на его этапах?
351)Какая разница между encodeUrl() и encodeRedirectUrl()?
352)В чём заключаются отличия между web server и application server?
353)Что Вы знаете об AJAX? Какие принципы лежат в основе данной технологии?
354)Какие есть примитивные типы и сколько места они занимают в памяти?
355)Какие есть логические операции в Java?
356)Что такое побитовый сдвиг? Какая математическая операции ему соответствует?
357)С помощью какого оператора можно немедленно оборвать выполнение цикла?
358)Может ли меняться количество передаваемых в метод аргументов?
359)Как правильно выполнять инициализацию статических и нестатических полей?
360)Может ли метод являться абстрактным и статическим одновременно?
361)Может ли класс быть статическим?
362)Какие модификаторы есть по умолчанию у полей и методов интерфейсов?
363)Какой метод возвращает строковое описание объекта?
364)С помощью чего можно добраться до приватных полей класса? Возможно ли это?
365)Может ли потомок расширить видимость приватного метода класса-родителя?
366)Что Вы знаете о MVC? Каков принцип его работы?
367)Есть ли смысл в обработке ошибок jvm?
368)Бывают ли ситуации, когда блок finally не выполняется?
369)Метод может выбросить IOException и FileNotFoundException. Какая очередность должна быть у блоков catch?
370)Какие есть коллекции типа List?
371)Какие Вы знаете реализации SortedSet?
372)Какие коллекции являются синхронизированными?
373)Какова реализация метода foreach?
374)Что такое fail-safe и fail-fast свойства?
375)Что Вы знаете об алгоритмах сортировки?
376)Как развернуть строку задом-наперёд?
377)Что Вы знаете о пуле строк?
378)Как проще всего найти необходимый символ в строке?

Java — JAVA вопрос начинающего

Вопросы для собеседования на Java Developer

Потоки ввода/вывода в Java

Servlets, JSP, JSTL

  • © 2020 GitHub , Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Помогите начинающему программисту JAVA

Дорогие пикабушники. Если среди вас есть программист по java, подскажите новичку как набирать опыта. т.е. требуется практика, примеры работы или участие в каком не будь проекте как новичку.

Дубликаты не найдены

Я вижу несколько вариантов.

1. Классический. Как уже писали — ищешь вакансию джуна. На оплату смотришь сквозь пальцы, ты туда не за деньгами идешь, а за опытом. Правда, тут можно и прогадать, если попадёшь в падаваны к «недооцененному гуру», коих много среди джавистов. Лучше, если это будет энтерпрайз, вэб-строительство, еще какие-нибудь популярные и востребованные технологии.

Цукерберг рекомендует:  Красивая сцена с применением CSS анимации

2. Дебильно-хобийный. Я начинал именно так. В чем-то желаю, в чем-то нет. Не читал ни одной книги (кроме пару глав паттернов), до джавы сидел на паскале и дельфи, получалось так себе. Взял сервер lineage (потому как фанат оной, можно взять что угодно сложнее зубочистки, лишь бы на джаве было, можно, к примеру, майнкрафт — и сложно и интересно и наглядно) и ковырял его, что-то улучшал, что-то рефакторил, разбирался как и что устроено. Потом начал свои поделки писать, всякую мелочь. Потом уже мидлом ушел на энтерпрайз, где сейчас неофициально сеньором считаюсь (ведущий программист).

3. Самостоятельный путь. Возьми идею, заведомо сложную, например, написать CMS с форумом, полностью интегрированные. Узнай технологии, которые обычно при этом используют. Накачай книженций и читай, читай, читай. Читай книги, читай гугол, читай стековерлоу, еще кучу интернетов. Шаг за шагом пиши свою поделку. Сначала будут костыли и говнокод — не обращай внимания, не оглядывайся на рефакторинги ежеминутно. Вернулся с определенной целью — осмотри код класса целиком, отрефакторь чтобы глаза не ело. Не переинжениривай, и не гонись за преждевременной оптимизацией. Когда поймешь, что уже достаточно свободно плаваешь в используемых технологиях, а простая задачка не вводит в ступор — сразу ищи должность мида на аналогичную технологию, на собеседованиях не ври, говори реальный опыт и реальные возможности. Обычно компании, которые не воспринимают это в штыки — самые удобные для обучения.

Главное — помни. Люди, с пеной у рта утверждающие, что без профильного образования в программирование ни ногой, просто идут нахер. И очень часто они знают на много меньше твоего. Говорю это по собственному опыту, всё моё обучение — 9 классов школы.

Когда выберешь свой путь, и появятся вещественные вопросы — задавай, большинство программистов больше любят отвечать на конкретные вопросы.

Вопросы по Java на собеседовании (1)

1. Принципы объектно-ориентированного программирования (ООП)
2. Class и его свойства
3. Методы базового суперкласса Object
4. Отношения между классами : ассоциация, агрегация и композиция
5. Конструкторы класса
6. Абстрактный класс
7. Статический класс и его свойства
8. Модификаторы свойств класса
9. Использование this и super
10. Сигнатура метода
11. Переопределение и перегрузка методов
12. Инициализация статических полей
13. Использование оператора instanceof
14. Использование модификатора final
15. Порядок инициализации статических полей потомка и его предка
16. Определения понятия «интерфейса»
17. Вложенные и внутренние классы
18. Аннотации классов
19. Использование метода finalize
20. Отличие final, finally, finalize

1. Принципы объектно-ориентированного программирования (ООП)

Объе́ктно-ориенти́рованное программи́рование (ООП) — это методология программирования, основанная на представлении программного обеспечения в виде совокупности объектов, каждый из которых является экземпляром определенного класса. Базовой основой любого класса является Object, включающий определенный набор методов.

Основные принципы ООП : абстракция, инкапсуляция, наследование, полиморфизм.

Абстракция означает выделение значимой информации и исключение из рассмотрения незначимой. С помощью принципа абстракции программа разбивается на объекты. Информация в программе обрабатывается в виде цепочки действий между отдельными объектами. Главное достоинство абстракции связано с тем, что она позволяет отделить реализацию объектов от их описания.

Так, например, с точки зрения описания должности её наименование является значимой информацией, а описание обязанностей должности относится ко второстепенной информации. Наименования должностей определяют справочник должностей и используются для определения штатного состава компании, в то время как описания обязанностей носят только информационный характер.

Инкапсуляция (encapsulation) — это свойство объединения данных и методов в одном классе, позволяющее отделить внутреннее представление от внешнего (интерфейса). Инкапсуляция позволяет закрыть доступ к полям и методам класса другим объектам, либо предоставить доступ к полям класса через свои методы. Можно сказать, что, с точки зрения java, инкапсуляция – это «сокрытие реализации».

При использовании ООП желательно использовать непрямой доступ к свойствам (полям) какого-либо класса из методов других классов. Для этого в классе необходимо предусмотреть соответствующие методы.

Наследование — это свойство, позволяющее одному классу получить все или отдельные свойства другого класса. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс, наследующий свойства базового, является потомком, наследником, дочерним или производным классом.

Полиморфизм (polymorphism) — это свойство позволяет использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Полиморфные объекты наследуют один и тот же базовый класс; не обязательно, что базовый класс является родителем, он может «быть предком в третьем колене».

В качестве примера можно рассмотреть набор различных геометрических фигур (прямоугольник, квадрат, круг), которые используются в программе для рисования. Для всех этих объектов желательно создать базовый класс, в который включить поля описания параметров объекта и метод отображения в интерфейсе. Значения параметров и код методов будут определены (переопределены) в наследниках.

Подробное описание и примеры ООП представлены здесь.

2. Class и его свойства

Класс (Class) – это шаблон описания одного или нескольких объектов. Объект представляет экземпляр класса. Шаблон (класс) включает свойства, определяемые характеристиками объектов (полями объекта) и методами их управления. Поля класса определяют, например, такие характеристики объекта, как вес, размер, цвет, площадь и т.д. Методы класса позволяют «оперировать» его полями – определять значение (методы set), выдавать значение (методы get) и т.д.

Class может наследовать свойства другого класса. Первоосновой любого класса является суперкласс Object. Пример класса :

В примере представлен класс прямоугольника Rectangle, наследующий свойства класса (фигуры) Shape, и включающий переопределенные методы draw базового класса Shape и toString суперкласса Object. Метод toString возвращает описанные в Shape свойства класса width и height в текстовом виде. При описании свойств класса был использован модификатор public.

Более подробное описание класса с примерами представлено здесь.

3. Методы суперкласса Object

Object является базовым суперклассом для всех остальных объектов/классов Java, т.е. каждый класс наследует свойства Object. Соответственно все классы наследуют следующие методы суперкласса Object :

public final native Class getClass(); возвращает в run-time класс данного объекта;
public native int hashCode(); возвращает hash-код;
public boolean equals(Object obj); сравнивает текущий клас с объектом obj;
protected native Object clone() throws CloneNotSupportedException; клонирование объекта;
public String toString(); возвращает строковое представление объекта;
public final native void notify(); возобновление работа потока, находящегося в ожидании освобождения «монитора» данного объекта;
public final native void notifyAll(); возобновление работы всех потоков, находящихся в ожидании освобождения «монитора» данного объекта;
public final native void wait(long timeout) throws InterruptedException; поток переходит в режим ожидания в течение указанного времени timeout;
public final void wait(long timeout, int nanos) throws InterruptedException; переход потока в режим ожидания в течение указанного времени timeout;
public final void wait() throws InterruptedException; перевод потока в ожидание, пока другой поток не вызовет notify() или notifyAll() методы для этого объекта;
protected void finalize() throws Throwable; вызывается сборщиком мусора, когда garbage collector определил, что ссылок на объект больше нет.

Подробное описание с примерами использования методов hashCode и equals представлено в разделе безопасности. Примеры использования методов многопочного программирования wait, notify, notifyAll c описанием класса Thread (поток) и интерфейса Runnable можно увидеть здесь. Метод finalize описан ниже.

4. Отношения между классами : ассоциация, агрегация и композиция

Ассоциация — это отношение, при котором объекты одного типа определенным образом связаны с объектами другого типа. Так объект одного типа может содержать или использовать объект другого типа. Например, игрок Player играет в определенной команде Team. В этом случае класс Player будет связан отношением ассоциации с классом Team. Таким образом, идея ассоциации достаточно простая — два объекта могут быть между собой связаны и это надо как-либо образом описать.

Агрегация и композиция являются разновидностью ассоциации при отношении между целым и его частями.

Агрегация определяет отношение одного объекта к другому. Так, например, студент может посещать дополнительные факультативные занятия.

Композиция определяет более «жесткое отношение», при котором один объект может быть только частью другого объекта. Например Машина и Двигатель : двигатель может существовать отдельно без машины, но он не может быть в двух или трех машинах одновременно, в отличии от студента, который может посещать различные факультативные занятия.

5. Конструкторы класса

Конструктор класса — это специальный метод, вызываемый при создании нового объекта. Наименование конструктора совпадает с именем класса с учетом регистра. По синтаксису конструктор похож на метод без возвращаемого значения. Класс может включать несколько конструкторов, которые отличаются друг от друга параметрами. Конструктор с параметрами используется для инициализации полей класса.

Примечание : сериализованный класс обязательно должен включать конструктор без параметров.

6. Абстрактный класс

Класс может быть объявлен абстрактным при помощи ключевого словом ‘abstract’. Абстрактный класс не предполагает создания экземпляров, а может быть использован только как базовый класс. Таким образом, абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Абстрактный класс может как содержать, так и не содержать абстрактные методы. Абстрактный метод базового класса должен быть переопределен для его неабстрактных потомков; в базовом классе абстрактный метод только описывается.

Пример абстрактного класса представлен здесь.

7. Статический класс и его свойства

Класс или его свойства могут быть объявлены статическими при помощи ключевого словом ‘static’. При обращении к статическим свойствам класса необходимо в префиксе указывать наименование класса. Статический класс может обращаться к нестатическим членам класса только при помощи объекта реализации класса.

В java можно использовать статический импорт, применяемый для импорта статических членов класса или интерфейса. Так, например, для импорта статических методов Math.pow() и Math.sqrt() можно использовать в секции import следующий код :

Статический импорт позволяет использовать вызов методов без наименования класса в префиксе.

8. Модификаторы свойств класса

Модификаторы класса позволяют определить уровень доступа к свойству класса. В java существуют следующие модификаторы доступа :

public (открытый) : поле и метод доступны всем;
protected (защищённый) : поле и метод доступны всем классам пакета и наследникам;
private (закрытый) : поле и метод доступны только методам этого класса;
без модификатора : default, friendly, доступ по умолчанию только внутри своего собственного пакета.

Примечание : конструктор класса также может иметь модификатор. Если класс имеет единственный конструктор с модификатором private, то невозможно создать объект данного класса. От такого класса нельзя наследоваться. При попытке наследования будет выдаваться ошибка :
There is no default constructor available in nameClass
А при попытке создать объект этого класса:
nameClass() has private access in nameClass

Можно ли обойти отмеченное выше Примечание? Можно, если в этом классе создать метод, который возвращает экземляр данного класса. Пример :

А теперь, создаем объект класса, у которого единственный конструктор с модификатором private. Конечно, new TestPrivate() здесь не пройдет, но решить данную задачу с использованием внутреннего статического метода можно.

9. Использование this и super

Чтобы обратиться к свойству текущего класса используют this, а к свойству базового класса — super. Так, например, в следующем примере класс Dog наследует свойства класса Animal и переопределяет метод eat(). Для обращения к переопределенному методу eat() своего класса используется вызов this.eat() в методе thisEat. Но, чтобы обратиться из наследника Dog к методу eat() базового класса Animal используется вызов super.eat() в методе superEat.

Более подробное описание наследования и пример использования this и super представлено здесь.

10. Сигнатура метода

Сигнатура метода (method signature) включает наименование метода с параметрами. При этом порядок параметров методов имеет значение. В сигнатуру метода не входят модификаторы, возвращаемое значение и вызываемые методом исключения. Также в сигнатуры не включены операнды synchronized, native и аннотация метода.

11. Переопределение и перегрузка методов

Если в иерархии классов сигнатура метода класса-наследника совпадает с сигнатурой метода родительского класса, то метод подкласса переопределяет метод базового класса. Вызов переопределённого метода из своего подкласса всегда ссылается на версию, определённую подклассом, а версия метода родительского класса будет скрыта. Чтобы вызвать «переопределенный» метод родительского класса следует использовать super.

В одном java-классе можно создавать несколько методов с одинаковыми наименованиями, но разными сигнатурами. Создание метода с тем же именем, но с другим набором параметров называется перегрузкой. На основе фактических параметров JVM определяет какой из перегруженных методов класса должен выполняться при вызове.

Статические методы могут быть перегружены нестатическими. При вызове из другого класса статического метода используется наименование класса, при вызове нестатического метода – объект реализации.

12. Инициализация статических полей

Статические поля можно инициализировать в статическом или динамическом блоке инициализации, а также при объявлении. Следующий пример демонстрирует инициализацию статических полей при объявлении и в статическом блоке.

Динамический блок является дополнением к конструктору. В следующем коде роль динамического блока играет процедура init :

Статические блоки в java выполняются до выполнения конструктора. С их помощью инициализируются статические поля.

13. Использование оператора instanceof

Оператор instanceof позволяет проверить принадлежность объекта к определенному классу/родителю. Выражение возвращает true, если объект является экземпляром класса или его потомком. В следующем примере демонстрируется использование оператора instanceof в различных условиях :

14. Использование модификатора final

Модификатор final может быть применен к полям, методам или классам. Смысл в его применении зависит от сущности, к которой он применен :

  1. Класс с модификатором final не может иметь наследников.
  2. Метод с модификатором final не может быть переопределен в классах наследниках.
  3. Поле помеченное при помощи слова final не может изменить свое значение после инициализации. Инициализируется поле либо при описании, либо в конструкторе, либо в статическом или динамическом блоке.
  4. Значение локальных переменных, а также параметров метода помеченных при помощи слова final не могут быть изменены после присвоения.

15. Порядок инициализации статических полей потомка и его предка

Статические поля класса могут быть инициализированы как при объявлении, так и в статических и динамических блоках. Сначала по-порядку вызываются все статические блоки от первого предка до последнего наследника. После этого попарно от предка до последнего потомка вызываются динамические блоки инициализации и конструкторы.

16. Определения понятия «интерфейса»

Ключевое слово «интерфейс» (interface) используется для описания полностью абстрактного класса. В описании интерфейса определяются статические поля и методы без тела (кода). Описание методов интерфейса выполняется в классе, реализующим данный интерфейс.

Реализация интерфейса «определяет поведение» класса. Т.е. именно так должны выглядеть все классы, которые реализуют данный интерфейс : включать статические поля и методы. Таким образом, любой класс, реализующий конкретный интерфейс, «знает» только те статичесие поля и методы, которые представлены в интерфейсе, но не более этого (наследование и реализация в несколько поколений расширяет диапазон статических полей и методов наследника).

Пример описания интерфейса SomeInterface и его реализации в классе SomeClass :

По умолчанию все поля, описанные в интерфейсе автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public. Начиная с 8-ой версии Java в интерфейсе можно объявлять static методы, но они должны включать тело метода.

Методы в интерфейсе нельзя объявлять с модификатором final, т.к. данный модификатор предполагает, что метод нельзя переопределить. Но все методы интерфейса по умолчанию являются абстрактными и должны быть переопределены в классах-реализации.

Описание и пример использования интерфейса представлено здесь.

17. Вложенные и внутренние классы

Вложенный класс (nested classes) представляет собой класс, который объявлен внутри объявления другого класса. Вложенные классы могут быть статическими и нестатическими. Нестатические вложенные классы имеют и другое название — внутренние классы (inner classes).

Внутренние Java классы делятся на три вида :

  • внутренние классы-члены;
  • локальные классы;
  • анонимные классы.

Внутренние классы-члены (member inner classes) ассоциируются не с самим внешним классом, а с его экземпляром. Такие классы имеют доступ ко всем полям и методам внешнего класса.

Локальные классы (local classes) определяются в блоке java кода. На практике чаще всего объявление происходит в методе некоторого другого класса. Хотя объявлять локальный класс можно внутри статических и нестатических блоков инициализации.

Анонимный класс (anonymous class) — это локальный класс без имени.

Из внутреннего нестатического класса можно обратиться к нестатическому полю внешнего класса с использованием наименования внешнего класса и оператора this. Например, OuterClass.this.fieldName.

Примечание : использование вложенных классов приводит к некоторому нарушению инкапсуляции, поскольку вложенный класс может обращаться к закрытым членам внешнего класса, но не наоборот.

Описание и пример использования вложенных (внутренних) классов представлено здесь.

18. Аннотации классов

Аннотация («annotation») в языке Java – это специальная форма метаданных, которая может быть добавлена в исходный код. Аннотированы могут быть пакеты, классы, методы, переменные и параметры. Аннотации стали доступны в самом языке начиная с 5-ой версии Java. В 6-ой версии Java аннотации были интегрированы в компилятор javac.

Имеются встроенные широко используемые аннотации, которые отслеживаются средой разработки IDE и применяются к методу класса :

  • @Override — проверка переопределения метода. IDE вызывает предупреждение компиляции, если метод не найден в родительском классе;
  • @Deprecated — IDE отмечает, что метод устарел и вызывает предупреждение компиляции, если метод используется.
  • @SuppressWarnings — аннотация указывает IDE подавить предупреждения компиляции.

Аннотации, применяемые к другим аннотациям :

  • @Retention — определяет режим хранения аннотации (в исходном коде или в скомпилированном классе);
  • @Documented — отмечает аннотацию для включения в документацию;
  • @Target — отмечает аннотацию как ограничивающую (какие элементы java-аннотации могут быть к ней применены);
  • @Inherited — отмечает, что аннотация может быть расширена подклассами аннотируемого класса.

Подробнее об аннотациях можно прочитать здесь.

19. Использование метода finalize

Метод finalize предназначен для автоматического освобождения системных ресурсов, занимаемых объектом. Это может быть удобным, чтобы постоянно не помнить, что, например, необходимо закрыть соединение с каким-либо ресурсом.

Можно использовать finalize для чистки данных. Но, во-первых, нет гарантии, что он будет вызван, если где-то в коде осталась ссылка на объект. Ну, и во-вторых, нет гарантии на то, что метод будет вызван сразу. Это связано с тем, что если в объекте переопределен метод finalize, то он вызывается не сразу, а помещается в очередь, которая обрабатывается специально созданным для этого потоком. Следует отметить, что в очередь на «финализацию» попадают только те объекты, в которых переопределен метод finalize.

Порядок очистки объектов

Cборщик мусора Garbage Collector не вызывает методы finalize() напрямую (по крайней мере, в HotSpot 1.6), а только добавляет соответствующие объекты в специальный список, вызывая статический метод java.lang.ref.Finalizer.register(Object). Объект класса Finalizer формирует двусвязный список ссылок на объекты, для которых необходимо вызвать finalize(). Т.е. в списке хранятся ссылки на следующий и предыдущий finalize().

Непосредственный вызов методов finalize() происходит в отдельном потоке «Finalizer» (java.lang.ref.Finalizer.FinalizerThread), который создаётся при запуске виртуальной машины, а точнее в статической секции при загрузке класса Finalizer. Методы finalize() вызываются последовательно в том порядке, в котором были добавлены в список сборщиком мусора. Соответственно, если какой-то finalize() зависнет, то он подвесит поток «Finalizer», но не сборщик мусора. Таким образом, если объект не имеет метода finalize(), то он будут исправно удаляться, а вот объекты с методом finalize будут увеличивать очередь до тех пор, пока «не отвиснет» поток «Finalizer», не завершится приложение или не кончится память.

Есть вероятность того, что метод finalize() не будет вызван совсем. Это может произойти в том случае, когда сборщик мусора будет готов вызвать метод объекта, но программа завершила свою работу.

20. Отличие final, finally, finalize

У этих операторов общим является только корень final, и то, что они являются зарезервированными словами в Java.

final — модификатор, применяющийся к классам, методам, переменным.

finally является частью конструкции try-catch-finally, где играет роль блока, который выполняется независимо от событий происходящих в try-catch и выполняется в любом случае.

Уроки по основам языка программирования JAVA для начинающих

Уроки по основам языка java

Основы java для начинающих

Курс JAVA для начинающих рассчитан на новичков в программировании. Наши уроки по java с самого начала дадут вам представление о языке программирования java, его основных принципах и возможностях. После прохождения основ Java вы сможете уверенно осваивать уроки по разработке мобильных приложений на андроид. Уроки обновляются и дополняются. Желаем удачи на пути программиста!

Список уроков по Java

Справочник по языку программирования JAVA

Используйте это руководство по языку java как своего рода справочник. Данное руководство не претендует на полноту, оно призвано лишь познакомить новичков в программировании с основными принципами ООП и основами языка java. Не старайтесь сразу выучить всю информацию. Достаточно бегло пройтись по статьям справочника, чтобы понять основные принципы. А освоить язык программирования java вам поможет только практика. Создавайте свои приложения, изучайте код опытных программистов, пользуйтесь этим справочником, чтобы уточнить непонятные моменты.

Справочник по языку программирования java. Материал взят из открытых источников.

Уроки по андроид-программированию:

Продвинутые курсы разработки приложений для андроид:

Продвинутые курсы по созданию приложений и игр для андроид помогут вам за очень короткий срок создать реальное работающее android-приложение или игру, внедрить в него рекламные баннеры и загрузить в маркет Google Play.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих