среда, 19 июля 2017 г.

Пару слов обо мне

Зовут меня Игорь, живу в г. Одессе, работаю на работе, лет мне слегка за 30-ть. Программирование никогда раньше не изучал, и вообще, я гуманитарий.
На кой хрен мне сдалось это программирование, спросите вы? Этого я пока ещё и сам не знаю. Куда приведёт меня эта дорога? Посмотрим... Я ведь ещё только в начале пути.

Обучаюсь я вот по этому видеокурсу: https://www.youtube.com/playlist?list=PLkKunJj_bZefB1_hhS68092rbF4HFtKjW

Использую учебник: https://docs.oracle.com/javase/tutorial/java/TOC.html

Смотрю на блоги:
http://developer.alexanderklimov.ru/android/java/java.php
http://kostin.ws/java/

вторник, 11 июля 2017 г.

День двадцатый

Экстернализация - это выборочная сериализация, путём использования методов writeExternal () и readExternal (). Порядок чтения должен быть точно такой же как порядок записи.

java.net.URL

Чтение данных с помощью класса URL:
  1. создаётся экземпляр класса URL
  2. создаётся экземпляр класса URLConnection и открывается соединение с использованием URL
  3. берётся ссылка на входящий поток данных, путём вызова метода URLConnection.getInputStream ( ).
  4. считываются данные из потока

понедельник, 10 июля 2017 г.

День девятнадцатый. Ввод-вывод.

3 шага по работе с I/O потоками:
  1. открыть поток (файл, url и т.д.)
  2. считать либо записать данные в этом потоке
  3. закрыть поток
Буферизированные потоки
Класс FileInputStream заворачиваем в BufferedInputStream. Затем выносится некоторое количество байтов в память за один раз, а уже потом считывается из этой памяти (буфера).

Чтение потоков со знаками
FileReader - читать
FileWriter - писать
FileInputStream - InputStreamReader - BufferReader

Запись в поток со знаками
FileOutputStream - OutputStreamWriter - BufferedWriter

Файлы API
Класс Files - упрощает операции с файлами (создание, удаление, копирование и т.д.)
Класс Path - программно выдаёт путь к файлу в системе.

Сериализация
Перевод объекта в строку байтов, передача этой строки на другую JVM с последующей реконструкцией в исходный объект, называют сериализацией.
Чтобы сериализировать класс, нужно в него имплиментировать специальный интерфейс java.io.Serializable - это пример маркер-интерфейса (в нём нет методов, которые необходимо было бы имплиментировать).

Ключевое слово Transient
Этим словом помечаем поля, которые не хотим сериализовывать.

воскресенье, 9 июля 2017 г.

День восемьнадцатый. Wildcards.

В параметрах дженериков можно кроме конкретного типа данных также указывать:
  • <?> - пока ещё неизвестный тип данных
  • <? extends X> - все типы подкласса Х
  • <? super X> - все типы суперкласса Х.

суббота, 8 июля 2017 г.

День семьнадцатый

LinkedList - полезен, когда нужно заменять либо удалять элементы из коллекции. Каждый элемент содержит ссылку на следующий. Т.е. при замене либо удалении элемента - обновляются две ссылки на предыдущий и следующий элементы.

Generics (параметризированные классы)
Записываются примерно так: ArrayList < ... >
В таких угловых скобках указывается, какого конкретно типа данные будут храниться в данном классе. Т.е. класс уже параметризирован и в него нельзя будет запихнуть объект другого типа - компилятор выдаст ошибку.

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

PS.: Какие-то они уж слишком хитро-выдроченные эти генерики. Не сразу то и въедешь, что к чему.

пятница, 7 июля 2017 г.

День шестнадцатый. Обработка ошибок.

Stack Trace - позволяет отследить выполнение программы до совершения ошибки.
Try-catch блок - "попробуй сделать одно - если не получится - лови другое". В части catch - может быть несколько вариантов.
Это относится к области runtime ошибок (исключений), т.е. таких, которые возникают во время выполнения программы. Исключения можно кастомизировать.

Иерархия исключений
Отлавливание множественных исключений. В часть catch попадает объект, описывающий проблему.

try {
................ }
       catch (Excp1 | Excp2 | Excp3 e) {
................ }
}

Ключевые слова:
throws - метод может выдавать ошибку, но блок try-catch пишется снаружи - там, откуда метод будет вызываться.
finally - в блоке finally содержится код, который будет отработан в любом случае.
throw - бросает экземпляр ошибки, а не только указывает на её возможность.

Java Collections Framework - классы и интерфейсы из пакетов java.util и java.util.concurrent.
Коллекции хранят объекты и не хранят примитивы.

Set - не хранит дубликаты элементов
List - хранит элементы, в которых возможны повторения
Queue - поочередное использование элементов
Map - хранение по принципу "уникальный ключ - элемент"

четверг, 6 июля 2017 г.

День пятнадцатый. Сервера.

Виды серверов:
  • вэб-серверы - поставляют статический контент, т.е. на таком сервере ничего не выполняется - содержимое просто передаётся браузеру. Apache, nginx, IIS
  • Java Servlet Container - содержит JVM и выполняет java-программы (java-servlets). Содержит динамический контент. Apache Tomcat, Jetty, Resin
  • Java Application Servers - содержат JVM,  Java Servlet Container и ещё кучу других контейнеров. Может выполнять любые java-программы, написанные по спецификации Java EE. Web Sphere, WildFly, GlassFish
PS.: Установить Tomcat и подключить его к Эклипсу - вообще ничего сложного...  И пятилетний ребёнок бы справился.

среда, 5 июля 2017 г.

День четырнадцатый

FlowLayout - размещает все компоненты в одну строку
GridLayout - по сетке привязки
BorderLayout - делит UI - контейнер на 5 зон: север-юг-восток-запад-центр и распределяет компоненты по этим зонам
CardLayout - как колода карт, в которой видна только верхняя карта
BoxLayout - кидает как в ящик по вертикали либо по горизонтали
AbsoluteLayout - вручную
GridBagLayout - по сетке, но при этом указывает размеры/поведение для каждого компонента

Events and Listeners
Для обработки какого-либо события  (нажатие на кнопку, движение мышки, изменение размера и т.д.) необходимо создать для него специальный интерфейс - Listener. В таком интерфейсе объявляется специальный метод callback. 

Как это работает?
  • юзер нажимает на кнопку - т.е. происходит некоторое событие (event)
  • java runtime перехватывает это событие и ищет listener, назначенный на  это событие
  • java runtime вызывает callback из соответствующего событию listener-a
  • а уже после этого обрабатывается код, указанный для данного callback-a
Дизайн-паттерн - шаблон решения стандартной проблемы.
MVC (Модель-Вид-Контроллер) - разделение классов:
  • вид - те классы, которые отвечают за GUI
  • модель - содержит данные
  • контроллер - находится между видом и моделью. Реагирует на события и обрабатывает их.
 Внутренний класс -  находится внутри какого-либо класса и нигде больше не используется ( однако, при необходимости, к нему можно дать доступ извне). Компилируются в отдельный файл.

Java-апплеты - мелкие приложения, которые выполняются внутри браузера.

вторник, 4 июля 2017 г.

5 способов быстрее научиться программировать

Я просто оставлю это здесь:

https://tproger.ru/translations/5-ways-to-learn-programming-faster-2/

День тринадцатый

AWT - Swing - JavaFX

В Swing - после создания JFrame - добавляем UI контроллеры. Размещаем их с помощью менеджера шаблонов (layout manager).

Основные задачи при программировании GUI:
  • создать шаблон
  • написать код, который будет реагировать на системные события и события, которые вызываются действиями пользователя
  • заполнить компоненты  GUI данными
Виды шаблон-менеджеров:
  • FlowLayout
  • GridLayout
  • BoxLayout
  • BorderLayout
  • CardLayout
  • GridBagLayout

понедельник, 3 июля 2017 г.

День двенадцатый - абстрактные классы и полиморфизм

Из абстрактного класса нельзя сделать экземпляр этого класса. Из класса-наследника абстрактного класса нельзя сделать экземпляр, пока в нём не будут имплиментированы все методы абстрактного класса-предка.
Абстрактный класс или метод объявляется с помощью ключевого слова abstract.
Абстрактный класс всегда незаконченный.  Имплиментировать абсолютно все методы, указанные в абстрактном классе, вовсе не обязательно.

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

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

воскресенье, 2 июля 2017 г.

День одинадцатый

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

Upcasting - можно объявить переменную типа суперкласс и присвоить ей экземпляр объекта типа сабкласс.

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

суббота, 1 июля 2017 г.

День десятый - немного об интерфейсах

Интерфейс позволяет объявлять методы отдельно от класса.
Класс имплиментирует интерфейс со всеми содержащимися в нём методами.
Класс может имплиментировать несколько интерфейсов одновременно.
Каждый метод, объявленный в интерфейсе автоматически становится public.

Как работает интерфейс?
Допустим, есть два класса Product_1 и Product_2, для которых нужно посчитать скидку. Но для каждого продукта эту скидку нужно посчитать по разному. Вместо того, чтобы в каждом классе объявлять метод подсчёта скидки, например calcDiscount( ), мы создаём интерфейс с этим методом и имплиментируем его в каждый класс.

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

Кроме методов интерфейс также может содержать финальные переменные, которые автоматически становятся public static. Если в будущем нужно будет изменить значение этих переменных, то делается это в интерфейсе, в котором они объявлены.

Интерфейсы-маркеры - не объявляют никаких методов.