Контакти

 Telegram: Magnumv44

 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

 GitHub

 Instagram

 Глава №1. Основы Java

Описывать историю создания языка здесь я уж точно не стану, этой информации и так довольно много, да и при работе с языком программирования Java это вряд ли как-то поможет =)

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

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

Как работает язык.

Учитывая историю и время, когда создавался этот язык, а также зачем! То здесь стоит отметить, что язык является кроссплатформенным, то есть он может работать на любой платформе (как аппаратной, так и операционной), единственным требованием является наличие Java Virtual Machine.

Java Virtual Machine (сокращенно Java VM, JVM) — виртуальная машина Java — основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования. Например, исходный код на языке Ada может быть откомпилирован в байт-код Java, который затем может выполниться с помощью JVM.

Такое определение дает нам Wikipedia. Если же это перефразировать в более простую форму, то:

Java Virtual Machine – это некая среда или программа, которая выполняет откомпилированный в виде байт-кода исходный код программы, с последующим превращением его в нативный код.

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

Данный процесс можно представить примерно так:

Исходный код => Байт-код => JVM => Нативный код

Более подробно это звучит так! Вы пишите программу, затем ее компилируете, но здесь процесс компиляции не такой как принято считать к примеру, в C++, здесь программа и превращается в этот магический байт-код! Далее естественно идет ее запуск, именно здесь вступает в действие JVM которая превращает байт-код в нативный код, запускает и выводит результат на ваш экран!

Примечание: файл с исходным кодом будет иметь расширение ".java", а файл с байт-кодом будет ".class".

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

Java является объектно-ориентированным языком программирования!

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

То есть все программы без исключения имеют хотя бы один класс и метод! Например:


/*
 * Это пример простой программы на Java.
 * Присвойте файлу с исходным кодом имя Example.java
 */
class Example {
    public static void main(String[] args) {
        System.out.println("Java правит Интернетом!");
	}
}

Это первая программа в книге, обычно там пишут устоявшуюся фразу "Hello World", но здесь почему-то решили отойти от привычных канонов =). Немного позже я к ней еще вернусь!

Другие примеры из этой главы можно найти в моем репозитории на GitHub:

  1. Первый
  2. Второй
  3. Третий
  4. Четвертый
  5. Пятый
  6. Шестой
  7. Первое практическое задание
  8. Второе практическое задание

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

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

На первый взгляд эти понятия выглядят ужасающе и не понятно, но это только на первый взгляд!

Простыми словами:

Инкапсуляция – это объект, данные и код для работы с которыми, скрыт от тех, кто со всем этим будет работать. Взаимодействие пользователя с объектом ограничивается конкретным предопределенным набором действий и правил! Только так и никак иначе.
Полиморфизм – это по сути почти та же инкапсуляция, разница состоит в том, что, имея похожий интерфейс взаимодействия (действия и правила использования) с объектом, его внутренняя реализация (код) может быть абсолютно разной. Пример тому руль автомобиля, во всех автомобилях круглый, но как именно он работает внутри водитель не видит (на тягах или гидроусилителе).
Наследование – самый простой в понимании принцип! Все учили биологию в школе и помнят о видах и подвидах. Поэтому здесь проще привести пример. Есть растения, у них есть подвиды: деревья, кусты и тд. У них разный внешний вид, но при этом все они растения имеющие листья и корни!

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

Сказка про ООП.
Просто сначала (когда код писали еще на перфокартах, а чуть позже - на ассемблере) было линейное программирование. Когда программа была просто набором команд и выполнялась от начала и до конца. Естественно, были ветвления всякие, циклы и т.п.... Но программа начиналась с начала кода, а данные хранились в отдельной области памяти, которая иногда могла пересекаться с областью кода.
Потом, поняли, что одни и те же куски кода часто повторяются... И придумали выделять их в отдельные процедуры и функции... Так появилось процедурное программирование. Была одна главная процедура (например в С++ она так и называется main), которая запускалась при старте программы, а она уже вызывала все остальные процедуры. Данные при этом хранились в основном в глобальных переменных. Жить стало чуть легче. Но с ростом размеров программ, все чаще стали случаться ситуации, когда какая-то процедура изменяет способ взаимодействия с какими-нибудь глобальными данными таким образом, что это требовало изменения структуры глобальных данных. И такие изменения приводили к тому, что другие процедуры переставали работать. Приходилось лазить по всему коду, выискивая где еще могут использоваться эти глобальные переменные и исправлять их. Работа была рутинная. И баги плодились с немеряной скоростью.... Плюс была еще одна проблема, когда разные процедуры независимо друг от друга изменяли одни и те же глобальные переменные, и в самые неподходящие моменты, в этих переменных оказывались совсем неожиданные значения. Этого рода ошибки отлавливать было вообще трудно. Но труднее всего стало, когда приложения стали многопоточными и одни и те же переменные стали изменяться параллельными потоками (т.е. предсказать текущее значение переменной, глядя в код - стало в принципе не возможным)....
Вот тут-то те, кому это больше всех надоело, сели, и придумали ООП.
Они договорились. А давайте код группировать в "объекты"! И пусть данные объекта будут доступны ТОЛЬКО ему (так появилась Инкапсуляция)! Если кому нужно изменить данные объекта, то пусть он обратиться к объекту с просьбой что-то сделать (вызов метода объекта) и объект эту просьбу уже сам обрабатывает так, как считает нужным.
Ну а дальше, когда снова пришли к тому, что при написании похожих, незначительно отличающихся друг от друга объектов, приходится много кода повторять, придумали Наследование и Полиморфизм.
Сказка - ложь! Да в ней намек! Кто усвоил - тем урок! ;)

Синтаксис.

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

Зная алфавит, ты сможешь читать и писать слова, а понимая его грамматику, можно писать целые поэмы =)

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

На правах "капитана очевидности" скажу, что алфавитом служат латинские символы. Спасибо хоть не китайские иероглифы или еще чего, пресловутый язык программирования 1С, что не приведи господи =))

Далее, во-первых, где же происходит вся магия?! Это можно объяснить на примере первой программы в книге (ее код приведен был выше). Как я и обещал возвращаемся к нему =)


class ИмяВашегоКласса {  //Его вы придумываете сами

    //это главный метод программы, это строка не меняется, она как отправная точка в программе, именно с него начинается запуск программы
    public static void main(String[] args) { 
        ......
        //А вот здесь и происходит вся магия =)
	}
}

Это следует запомнить раз и на всегда как аксиому!

Во-вторых, список зарезервированных ключевых слов:

  1. abstract
  2. assert
  3. boolean
  4. break
  5. byte
  6. case
  7. catch
  8. char
  9. class
  10. const
  11. continue
  12. default
  13. do
  14. double
  15. else
  16. enum
  17. extends
  18. final
  19. finally
  20. float
  21. for
  22. goto
  23. if
  24. implements
  25. import
  26. instanceof
  27. int
  28. interface
  29. long
  30. native
  31. new
  32. package
  33. private
  34. protected
  35. public
  36. return
  37. short
  38. static
  39. strictfp
  40. super
  41. switch
  42. synchronized
  43. this
  44. throw
  45. throws
  46. transient
  47. try
  48. void
  49. volatile
  50. while

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


class Test {
    public static void main(String[] args) {
        int goto = 10;

        System.out.println(goto);
	}
}

Выдаст ошибку вида:


javac Test.java
Test.java:3: error: not a statement
                int goto = 10;
                ^
Test.java:3: error: ';' expected
                int goto = 10;
                   ^
Test.java:5: error: illegal start of expression
                System.out.println(goto);
                                   ^
Test.java:5: error: ';' expected
                System.out.println(goto);
                                       ^
4 errors

Ошибка компиляции

Так же стоит отметить, что ключевые слова такие как const и goto зарезервированы, но не используются, это так сказать для любителей бейсика и прочих очень старых языков программирования =)

Так же в качестве имен переменных нельзя использовать названия стандартных методов типа println и тд.

И в-третьих, правила именования переменных, методов и классов.

Общее представление о правильном именовании можно найти в "Соглашении по оформлению кода Java". Но если вкратце, то переменные:

  1. Имя переменной не может начинаться с цифр;
  2. Использование допускаемых символов знака доллара "$" или нижнего подчеркивания "_" является негласным правилом плохого тона;
  3. Учитывая, что Java язык не только строго типизированный, но и регистрозависимый, то имена переменных на первый взгляд одинаковые могут быть разными переменными, например: myvar и Myvar, будут разными переменными;

Имена методов всегда начинаются с маленькой буквы! Если имя метода состоит из двух слов, то их в отличии от констант их не разделяют символом нижнего подчеркивания "_", а всего лишь пишут второе слово с большой буквы, например myMethod.

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

Ну и напоследок то, что мне понравилось в этой книге! Это контрольные вопросы и домашнее задание!

Контрольные вопросы:

  1. Что такое байт-код и почему он так важен для интернет-программирования на языке Java?

Ответ: Байт-код - это специально подготовленный/оптимизированный код, предназначенный для выполнения в виртуальной машине Java. Байт-код не является исполняемым, он является аппаратно независимым и может выполнятся на любом устройстве где установлена виртуальная машина Java.

  1. Каковы три ключевых принципа объектно-ориентированного программирования?

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

  1. С чего начинается выполнение программы на Java?

Ответ: Выполнение программы начинается с метода main()

  1. Что такое переменная?

Ответ: Переменная - это именованная ячейка памяти, размер памяти, выделяемой под которую зависит от ее типа.

  1. Какое из перечисленных ниже имен переменных недопустимо:
    1. count +
    2. $count + (допускается, но является правилом плохого тона)
    3. count27 +
    4. 67count -
  1. Как создаются однострочные и многострочные комментарии?

Ответ:


// Однострочный комментарий
/*
 * Много строчный
 * комментарий
 */
  1. Как выглядит общая форма условного оператора if?

Ответ: if (условие) оператор;

  1. Как выглядит общая форма цикла for?

Ответ: for (инициализация; условие; итерация) оператор;

  1. Как создать блок кода?

Ответ: Блок кода создается путем заключения одного или более операторов в фигурные скобки "{ }", где первая фигурная скобка является началом блока кода, а вторая его окончанием.

  1. Если при вводе кода программы вы допустите опечатку, то какого рода сообщение об ошибке получите?

Ответ: Согласно формальным правилам, если была допущена опечатка при наборе программного кода, то при компиляции исходного кода в байт-код, компилятор выдаст сообщение об ошибке формального образца с примерным местоположением ошибки (при этом не всегда правильно укажет на саму ошибку, поэтому доверять на 100% ему не стоит). Например:


Example.java:8: ';' expected
	public static void main(String args[])
										  ^
Example.java: class, interface, or enum expected
}
^
  1. Имеет ли значение, с какой именно позиции в строке начнется инструкция?

Ответ: Нет ни имеет. Инструкции могут начинаться как с разных строк, так и находится в одной строке, единственным требованием является наличие ";" в конце каждой инструкции.

Домашние задания (листинг программ и описание алгоритмов без построчного объяснения строк кода):

Первая программа


/*
 * Задание:
 * Видоизмените программу, созданную в упражнении 1.2, таким образом, чтобы она выводила таблицу перевода дюймов в метры.
 * Выведите значение длины до 12 футов через каждый дюйм. После каждых 12 дюймов выведите пустую строку.
 * (Один метр приблизительно равен 39.37 дюйма, в одном футе 12 дюймов)
 *
 * Файлу с исходным кодом присвойте имя InchesInMeters.java
 */
class InchesInMeters {
    public static void main(String[] args) {
        double meter;
        int counter;
        int inch;
        int foot;

        counter = 0;    //Счетчик который инициализируется нулевым значением
        foot = 12 * 12; //Вычисляем сколько дюймов в 12 футах

        for (inch = 1; inch <= foot; inch++) {
            meter = inch / 39.37;

            System.out.println(inch + " дюйму соответствует " + meter + " метра.");

            counter++; //Увеличиваем счетчик строк на 1 на каждой итерации цикла

            if (counter == 12) {       //Если значение счетчика равно 10, вывести пустую строку
                System.out.println();
                counter = 0;           //Сбросить счетчик строк
            }
        }
    }
}

Как сказано в условии, программа будет переводить дюймы в метры, вплоть до 12 футов. А каждые 12 дюймов будет выводится пустая строка для визуального разделения!

Алгоритм данной программы довольно прост! Первым делом нужно узнать сколько дюймов в 12 футах, затем используя цикл for выводим на экран сколько метров в том или ином количестве дюймов. Как только значение выводимое на экран достигает 12 дюймов, выводится пустая строка, для этого используется вложенное в цикл логическое условие с помощью оператора if.

Вторая программа:


/*
 * Задание:
 * Сила тяжести на Луне составляет около 17% земной. Напишите программу, которая вычислила бы ваш вес на Луне.
 *
 * Файлу с исходным кодом присвойте имя WeightOnTheMoon.java
 */
class WeightOnTheMoon {
    public static void main(String[] args) {
        double my_weight = 82;      // Мой вес
        double moon_gravity = 17;   // Сила притяжения на Луне
        double earth_gravity = 100; // Сила притяжение на Земле
        double moon_weight;         // Переменная которая будет хранить в себе вес на Луне

        /* Производим расчет веса на Луне */
        moon_weight = (moon_gravity / earth_gravity) * my_weight;

        /* Выводим на экран результат */
        System.out.print("Мой вес на Луне равен: " + moon_weight + " кг.");
    }
}

Во втором домашнем задании нужно вычислить вес человека на Луне.

Алгоритм этой программы сводится к математическим формулам! Если гравитация на Луне равна 17% от земной, то нужно разделить 17 на 100, затем умножить на вес человека.

Далее остается только вывести на экран сообщение с весом человека на Луне.