среда, 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. Если в будущем нужно будет изменить значение этих переменных, то делается это в интерфейсе, в котором они объявлены.

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

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

День девятый

Пакеты - служат для организации классов. А также, распределение классов по пакетам позволяет избежать совпадения имён классов в разных проектах. Называют пакеты по обратной DNS нотации:

com.example.head

Если запускающий класс (тот, который содержит метод main) должен использовать классы, которые находятся в других пакетах, то их нужно импортировать:

import    com.example.head.class1

Уровни доступа к данным. Классы, методы и переменные могут иметь разные уровни доступа:
  • private - доступ только внутри заданного класса
  • protected - доступ внутри класса и всех сабклассов
  • public - доступ из любого места
  • package  - доступ по умолчанию, только внутри данного пакета
Если нет уверенности, какой уровень доступа давать классам и переменным, то лучше использовать private доступ. Впоследствии, его всегда можно изменить на более широкий.

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

 Когда программа идёт в продакшн - то нужно постараться как можно больше всего сделать final. Быстродействие будет лучше.

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

четверг, 29 июня 2017 г.

День восьмой

Цикл While (пока) - работает до тех пор, пока выполняется заданное условие.

В метод main можно передавать массив параметров через командную строку. При этом, все эти параметры имеют тип данных - строка. Потом эти строки можно преобразовать в другие типы данных через "обёрточный" класс (wrapper class).

Хардкодинг - когда в программе жёстко указываются значения данных, которые нельзя в  последствии изменить.

В общем и в целом, программа - это нечто такое, что считывает и обрабатывает данные из базы данных.

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

среда, 28 июня 2017 г.

День седьмой - циклы, циклы, циклы, циклы...

Сегодня подробнее разбирал циклы for и foreach. Вроде как всё элементарно просто и понятно. Пока не дошёл до вложенных циклов... Тут я завис.
Вот, например, табличка умножения:



Смотрю я на этот вложенный цикл и думаю - как же ты сука работаешь?  Погуглив на скорую руку - никакого внятного объяснения я не нашёл. Пришлось взять в зубы дебагер и ковырять самому...
Оказывается, вот оно как работает:
  • Джава берёт начальное значение переменной i, равное единице
  • проверяет условие i < 10 - условие выполнено
  • кидает  эту единицу во внутренний цикл for
  • во внутреннем цикле точно так же берёт начальное значение переменной j, тоже равное 1
  • проверяет условие j < 10 - условие выполнено
  • a = 1 * 1, следовательно a = 1
  • выводит на экран 1 |
  • затем переходит на итерацию вложенного цикла: j = j + 1, следовательно j = 2
  • снова проверяет условие j < 10 - условие выполнено
  • a = 1 * 2, следовательно a =2
  • выводит на экран 2 |
  • и т. д. до 9. А вот когда значение j доходит до 10 - происходит самое интересное 
  • когда j = 10, то условие j < 10 не выполняется и программа выходит из внутреннего цикла и выполняет следующий оператор внешнего цикла System.out.println() - перенос строки. А потом...
  • а потом выполняется итерация внешнего цикла: i = i + 1, следовательно i теперь равно 2
  • эта двойка попадает во внутренний цикл, в котором: a = 2 * 1 откуда  a = 2
  • выводит на экран с новой строки 2 |
  • ну и т. д. и т. п.
  • цикл будет работать до тех пор, пока переменная  i не станет равной 10.
 Только одно для меня загадка - зачем там вначале переменной а присваивается значение 0 ?

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

День шестой

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

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

Вопрос: Чем ограничена размерность массива?
Ответ: Исключительно здравым смыслом.

Обёртки, автобоксинг и анбоксинг.
В Java для каждого примитивного типа данных есть свой "обёрточный" класс.
int - Integer
Он позволяет добавлять примитивные классы, как объекты, а так же, у него есть куча своих полезных и не очень методов.
Ещё Java позволяет автоматом добавлять и вынимать примитивы в обёрточные классы.

Циклы
Java поддерживает несколько типов циклов. Используют их для повторения одних и тех же действий многократно.
Для выхода из цикла используем:
  • continue - прекращает выполнять цикл и возвращается к проверке условий цикла
  • break - программа выходит из цикла и начинает выполнять код, следующий за циклом.

Overriding

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

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

День пятый

Параметры метода - могут указываться в скобках после названия метода:

метод (тип_данных параметр1, тип_данных параметр2, тип_данных параметр3... )

int calcPriceTour (int numberOfNights, int value, String country)

Если таким образом объявляешь метод, то впоследствии его можно вызвать уже с указанием всех нужных параметров:

calcPriceTour ( 5, 300, "Egypt")

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




if switch


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

День четвёртый

Впервые написал программу. Ура!
























  1. Создаём общий класс, в котором:
  • указываем общие (глобальные) свойства класса
  • определяем метод вычисления и параметры возвращаемых значений
     2. Создаём класс, с которого будет запускаться программа. В нём:
  •  создаём новый экземпляр класса с атрибутами из общего класса и присваиваем значения этим атрибутам
  • выводим результат
Какова последовательность выполнения этой программы?
  • программка-выполнялка под названием TestAge создаёт экземпляр класса Age
  • потом присваивает значения атрибутам, указанным в классе Age
  • затем вызывает метод nameAge ( ) , который и использует указанные значения атрибутов
  • метод nameAge ( ) имплиментирует алгоритм определения возрастного статуса, а затем возвращает вычисленное значение.
Именно через этот новый экземпляр а - java runtime и обращается к свойству myAge класса Age. И через эту же переменную а вызывается метод nameAge ( ) , который уже выполняется с указанным значением. А уже результат этого выполнения передаётся в объявленную переменную yourAge.

суббота, 24 июня 2017 г.

День третий

В Java обнаруживается 8 примитивных типов данных:
  • byte
  • short
  • int
  • long
  • float
  • double
  • char
  • boolean
Виды комментариев:

/* Блок текста
в несколько строк */

// Одна короткая строка

/** Блок комментариев для утилиты javadoc **/

Ну ок, ток я не могу понять, зачем такие сложности? Почему нельзя было сделать универсальное обозначение для любых типов коментов?

Public - модификатор доступа.

Операторы if и switch. 

С какими типами данных работает оператор switch?
  • byte, short
  • char, int
  • String
 В каких случаях используется if-then-else, а в каких - switch?
  1. удобочитаемость
  2. вид значений
  3. if-then-else основан на диапазоне значений или состояний
  4. switch - тестирует выражения, основанные только на единичном целом значении, ненумерованном или объекте String.
При выполнении метода main - он сначала обращается к сабклассу, а если в сабклассе есть метод с таким же названием и атрибутами как в суперклассе, то тут же он и выполняется и в суперкласс уже не идёт. На этом свойстве основан принцип переопределения (Overriding).

Конструктор - нужен для автоматической инициализации переменных.

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

Overriding - два метода с одинаковой сигнатурой, но разной логикой
Overloading - два метода с одинаковым именем, но разными аргументами

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

День второй

Класс - представление типа данных.

class - method - properties

String - строка - текстовый тип переменной.
int - целое число (сокращение от integer).

Для переменных важно где именно мы их объявляем:
  •  на уровне класса
  • внутри метода (локально)
После названия класса - ставим фигурные скобки {}, после метода - обычные ( )
Можно сразу присвоить значение переменной, а можно просто объявить, но значение не присваивать.

Вопрос: Почему названия классов пишут с заглавной буквы? Есть ли в этом какой-то сакральный смысл?
Ответ: Это просто грамматика такая. Это ж язык. Никакого особого смысла в этом нет. Просто договорились делать именно так.

Переменные имеют срок жизни. Например, локальные "живут" только пока выполняется метод, к которому они относятся.

Экземпляр класса создаём внутри метода main с помощью оператора new .

Inheritance - наследование

class Name2 extends Name1

Name1 - считается superclass
Name2 - subclass

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

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

Instanses - экземпляры объектов создаются в Heap Memory.

&& - логическое и


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





четверг, 22 июня 2017 г.

День первый

Почему именно JAVA?
  • один из самых используемых языков 
  • есть "правильный" видеокурс и учебник
Сколько времени собираюсь учить?
  • примерно один месяц, а там посмотрим, как пойдёт. 










Имплементация - программная или аппаратная реализация алгоритма, протокола, технологии и т.д.
Форк (ветка) - использование кода одной программы в качестве старта для другой.

Любая программа, написанная на Java, живёт и работает внутри JVM.
В JAVA нет привязки программы к платформе, на которой та выполняется.


В JAVA -
исходный код - байткод - машинный

Walkthrough - пошаговое руководство

HelloWorld.java - исходный код
HelloWorld,class - байт-код

Volume - том
Runtime - время выполнения

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

3 шага для запуска java-программы:
    1. написание исходного кода
    2. компиляция исходного кода в компиляторе
    3. запуск программы.
    JAVA - это язык, чувствительный к регистру.
    Каждый класс начинается с открывающей фигурной скобки.
    Программы создаются компилируются и запускаются в IDE (интегрированная среда разработки).  В частности - Eclipse, (Workbench),


    Вопрос: какова структура языка? Сколько существует методов?

    Х - художник