JC: Чтение из файла, сортировка и вывод в консоль

Напишите консольное приложение, которое считывает пользователей из файла и делает из них список объектов класса Person. Затем приложение просит Вас ввести одну из следующих команд. ‘-f’ – сортировка по имени, ‘-s’ – сортировка по фамилии, ‘-a’ – сортировка по возрасту. В зависимости от введенной команды должен вывестись список пользователей отсортированных по имени, фамилии или возрасту. Если пользователь вводит “–stop”, то приложение должно завершаться.

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

Возможно для решения Вам понадобятся следующие статьи:

 

Файл с пользователями.

Должен получиться примерно такой вывод на консоль

Рекомендую использовать следующие классы.

Все.

Если Вы решили это задание, то посмотрите в сторону моего курса Трепещущий Падаван. Возможно он прекрасно Вам подойдет.

Подробнее

JC: Чтение с консоли и запись в файл

Напишите консольное приложение, которое просит Вас ввести произвольное количество слов и после нажатия на клавишу Enter записывает эти слова в текстовый файл. После записи, приложение, снова просить Вас ввести несколько слов и после нажатия на Enter добавляет их в конец этого же файла, но на новой строке и так до бесконечности.. Первые слова должны остаться. Если пользователь вводит “–stop”, то приложение должно завершаться.

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

Возможно Вам для решения этой задачи понадобятся следующие статьи:

Рекомендую использовать следующие классы.

Вот мой пример.

Файл после выполнения этой программы выглядит так.

Все.

Если Вы решили это задание, то посмотрите в сторону моего курса Трепещущий Падаван. Возможно он прекрасно Вам подойдет.

Подробнее

Что такое класс в java?

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

В общем смысле класс – это абстракция какого-нибудь предмета или явления. Например, если мы пишем приложение телефонный справочник, то со 100%-й вероятностью можно утверждать, что в нем будет как-то описываться человек. В этом описании, например, будет фигурировать ФИО этого человека, его адрес и его телефонный номер.

Это его описание есть абстракция. Абстракция – это упрощение какого-то понятия или предмета. В данном случае мы упростили человека до ФИО, адреса и телефона. Нам совсем нет необходимости учитывать такие понятия как его рост, возраст или трехмерную модель. От всего этого мы абстрагировались.

Еще можно сказать, что класс – это чертеж объекта или понятия. В этом чертеже мы учитываем только важные характеристики. Эти характеристики могут варьироваться в зависимости от поставленной задачи. Например, для приложения телефонный справочник достаточно ФИО, адреса и телефонного номера. А для приложения, которое высчитывает ваш индекс массы тела нужно знать только ваш рост, вес, пол и возраст. Оно полностью абстрагировалось от таких понятий как ФИО, адрес и телефон.

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

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

Грубо говоря в java класс – это некая структура для удобства объединяющая в себе несколько переменных (полей класса) и действий (методов). По ней будут создаваться объекты. Если кратко, то объекты – это, что-то конкретное, например, Вы, я, Ваша мама и т.д. Это что-то, что сделано по классу (как по чертежу). Этими объектами будет в дальнейшем манипулировать приложение.

Вот еще пример класса человек, но уже для приложения рассчитывающего индекс массы тела.

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

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

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

Подробнее

JС: Жизненный цикл создания java объектов

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

Для начинающего java разработчика очень важно понимание жизненного цикла класса. Это поможет быстро решать возникшие ошибки компиляции и предотвратит появление многочисленных багов.

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

Пример 1

Например, мы имеем следующий код в файле Main.java.

При выполнение метода main мы увидим следующий текст.

Как Вы видите java без надобности не подгружает классы, которые не используются. Я говорю о классах ObjectCircle и ParentObjectCircle. Загрузчик классов (класс ClassLoader) не начнет их загружать в память без надобности.

Пример 2

Теперь давайте этот файл немного изменим. И добавим в метод main создание объекта класса ObjectCircle. Остальной файл Main.java остался без изменений.

Данный код выведет следующий текст в консоль.

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

Теперь в консоль выведется следующий текст.

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

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

Последнее о чем стоит сказать это то, что метод finalize вообще не вызвался. Многие новички полагают, что это некоторый аналог деструктора из C++. Но в отличие от C++ java не гарантирует его выполнение. Поэтому его и не рекомендуют использовать.

Пример 3

В следующем примере разберем немного измененный файл Main.java. Сделаем так, чтобы класс ObjectCircle расширял класс ParentObjectCircle.

Выполним снова метод main и посмотрим, что из этого получилось.

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

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

После чего идет инициализация уже статических переменных нашего класса.

И выполняются статические блоки.

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

Затем все происходит как в примере без родительских классов. Выполняется инициализация не статических переменных, выполняются не статические блоки кода и на конец выполняется конструктор создаваемого класса.

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

Опять обратите внимание на то, что метод finalize не вызвался!

Пример 4

Рассмотрим еще один уже последний пример на сегодня. Создадим файл ObjectCircle.java.

В этом примере мы полностью избавились от класса Main и метод main перенесли в класс ObjectCircle. Посмотрим, что выведется на экран, если мы запустим метод main.

Получился очень интересны результат. Выходит, что из-за того, что мы метод main перенесли в сам класса ObjectCircle, ClassLoader намного раньше загрузил в память классы ObjectCircle и ParentObjectCircle. Это конечно же объясняется тем, что метод main находится в классе ObjectCircle и для выполнения метода main его нужно загрузить. Но для загрузки класса ObjectCircle  нужно предварительно загрузить в память еще и класс ParentObjectCircle. Поэтому произошла инициализация статических полей и статических блоков кода в этих классах еще до выполнения метода main.

Настало время подвести итог.

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

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

Переопределении метода finalize может приводить к проблемам связанным с некорректным освобождением ресурсов. Это связано с тем, что нет никакой гарантии, что метод finalize будет вызван. Используйте его только, если на все 100% знаете к чему это приведет.

Подробнее

Как стать программистом 4

Как стать программистом? Часть 4 – Топ 7 технологий для java junior разработчика.

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

 

Надеюсь Вы понимаете, что от junior не требуют глубоких знаний. Когда-то, кто-то мне сказал, что junior должен знать все, но чуть-чуть. Поэтому не кидайтесь учить все, вплоть до ассемблера. Короче, подробнее буду описывать по ходу.

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

Первое место! ООП

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

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

Раз Вы новичок, то Вас скорее всего, на собеседовании, попросят объяснить, как работает ООП на том языке, который Вы изучаете. Может дадут кусок кода, в котором иерархия классов и скажут определить, какой метод вызовется при тех или иных условиях.

Второе место! Java core

Вторым по важности идет java core. Это достаточно широкое понятие. На знание java core, Вас могут попросить решить тест. Этот тест будет из разряда, что будет если выполнится данный код. Вы заранее можете потренироваться решать такие тесты. В интернете полно ресурсов, которые позволят пройти такую проверку бесплатно. Поищите OCJP(SCJP) tests online.

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

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

Третье место. Java Collections

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

Первым делом выучите основные интерфейсы и поймите для чего они нужны и чем отличаются. Список не большой это Collection List, Set, Queue и Map. Не нужно заучивать все их методы, лучше научитесь пользоваться ими.

Затем выучите основные реализации. Также список не большой, это LinkedList, ArrayList, Vector, HashMap, Hashtable, TreeMap, HashSet, TreeSet. Их недостаточно просто уметь применять. Понимайте особенности реализации и то, когда их нужно использовать. Желательно знать временную сложность выполнения тех или иных операций.

Четвертое место. Servlets

Сервлеты – это тоже очень важная штука. Очень часто на собеседовании меня спрашивали о жизненном цикле сервлетов.

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

Пятое место. Synchronization

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

Научитесь пользоваться ключевым словом synchronized. Так получилось, что я устроился на свою первую работу не зная о существовании классов Semaphore и СountDownlatch. Поэтому я считаю, что это не сильно важно, но если будет свободное время, то поковыряйте их.

Шестое место. JDBC

Практически в любом тестовом проекте, который Вы получите, будет работа с базами данных. Тема, мягко говоря, важная. Знаете, что такое CRUD редактор? Если нет, то поищите в google.

Создайте несколько классов, которые связаны между собой связью одни ко многим, один ко одному или многие ко многим. Затем напишите свой CRUD редактор для этих классов используя JDBC, можно даже без клиентской части. Это и будет критерием того, знакомы ли Вы с JDBC достаточно, чтобы искать работу.

Седьмое место. SQL

Раз уж мы коснулись JDBC, то и SQL не обойдем стороной. Вы достаточно неплохо познакомитесь с SQL, когда будете писать CRUD редактор на JDBC. Но я подчеркну еще, что Вы должны понимать следующие операторы языка SQL: SELECT, WHERE, INSERT, DELETE, UPDATE, JOIN (все типы), GROUP BY, ORDER BY.

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

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

Итог

Как Вы могли заметить, самые крепкие знания Вам потребуются по Java core. По всему остальному можно создать видимость наличия у Вас опыта использования. Это объясняется тем, что обычно только по Java core могут дать решать тест. А тест, как Вы понимаете уже сложнее, обмануть. Хотя может попасться такой интервьюер, который так будет придираться, что пиши пропало.

Еще дополню, что в мое слово “обмануть” я вкладываю немного другой смысл. Я думаю, что почти у всех новичков есть некоторая своя оценка их знаний. И зачастую она очень низкая. То есть, ты думаешь, что ничего не знаешь, а на работу тебя взяли. Получается ты думаешь, что обманул интервьюера. Хотя он может просто закрыл глаза на некоторые твои пробелы и фирма готова их закрыть за свой счет. Получается, что  обман существует только в твоей голове.

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

Все!

 

Подробнее