Классы и объекты в Java 8
Обычно перед разделом с описанием классов в учебниках пишут целую главу, которая рассказывает об ООП в общих чертах, абстрагируясь от какого-либо конкретного языка программирования. Возможно, мне тоже нужно написать что-нибудь такое, но на данном этапе я делать этого не буду, хотя подобная глава пригодилась бы и для учебника Javascript. Подразумевается, что вы уже знаете об ООП из какого-либо другого языка программирования.
Объявление классов
Классы в Java объявляются с помощью ключевого слова class . Пример самого простого объявления класса:
Здесь мы объявляем новый класс с именем Goblin .
Внутри фигурных скобок объявляются все поля, конструкторы и методы класса.
Перед ключевым словом class может стоять модификатор public , который делает класс доступным из всех пакетов. Если модификатора public нет, как в нашем случае, то класс доступен только в том пакете, в котором он объявлен.
Объявление полей
В этом примере мы объявили четыре поля:
- поле money с типом int ;
- поле health с типом double ;
- поле diamonds с типом int ;
- поле name с типом String .
Каждый экземпляр класса Goblin будет иметь своё значение полей money , health , diamonds и name .
В самом начале объявления поля указывается модификатор доступа к полю ( private , protected или public ), либо не указывается, и тогда используется доступ по умолчанию package-private. Затем указывается, если нужно, ключевое слово static (будет объяснено позже), а также, если нужно, ключевое слово final (будет объяснено позже). Затем тип поля и имя. Затем поле может сразу инициализироваться начальным значением, например как поле diamonds инициализируется числом 10 в нашем примере.
Модификатор доступа, static и final могут располагаться в любом порядке, но согласно соглашению о кодировании принят именно такой порядок, который описан в статье.
Поле money объявлено с модификатором доступа private , и оно будет доступно только внутри этого класса.
Поле health объявлено без модификаторов доступа, и для него будет использоваться уровень доступа package-private (поле будет доступно только внутри своего пакета).
Поле diamonds объявлено с модификатором доступа protected , и оно будет доступно в этом пакете, этом классе и классах наследниках от этого класса (как объявлять наследников будет объяснено позже).
Поле name объявлено с модификатором доступа public , и оно будет доступно во всех классах всех пакетов.
Модификатор | Класс | Пакет | Дочерний класс | Все классы |
---|---|---|---|---|
public | Есть | Есть | Есть | Есть |
protected | Есть | Есть | Есть | Нет |
без модификатора | Есть | Есть | Нет | Нет |
private | Есть | Нет | Нет | Нет |
Имя поля следует давать в соответствии с соглашениями.
Обращаться к полю внутри класса, которому оно принадлежит можно просто по имени поля:
Язык JAVA просто
Весь исполняемый код, написанный на языке Java, хранится внутри классов или интерфейсов. Вне классов и интерфейсов могут располагаться лишь инструкции import и package, а также комментарии.
Скомпилированные файлы должны быть размещены в каталогах с иерархической структурой, повторяющей структуру пакетов, в которые вложены данные классы и интерфейсы.
В простейшем случае программа состоит из файла, в котором содержится исходный код единственного класса и один метод main.
(Минимальная программа состоит из одного класса)
(Если планируется, что программу не будут запускать на выполнение, а описанный класс будет лишь использоваться в других программах, то наличие в тексте метода main не обязательно)
Обязательным условием корректности такой программы является совпадение имени файла (без расширения) с именем единственного класса размещённого в этом файле.
Например, класс Tea должен храниться в файле с именем Tea.java.
В одном файле может содержаться несколько классов. В этом случае имя файла (без расширения) должно совпадать с именем любого из этих классов.
Программа может состоять из нескольких файлов, в каждом из которых содержатся один или более классов.
В этом случае имя каждого класса (без расширения) должно совпадать с именем одного из классов, в нём содержащихся.
Пример простейшей программы:
Когда файлов с классами много, то их, как правило, группируют (помещают) в специальные контейнеры — пакеты, создавая тем самым иерархическую систему (как аналог папок (директорий) в файловой системе (на компьютере)).
На диске пакет является каталогом (папкой) и все исходные файлы и файлы классов, принадлежащих одному и тому же пакету, находятся в одном каталоге.
Имена пакетов и подпакетов нужно указывать в коде класса, и они должны совпадать с именами папок и подпапок на диске. Т.е. имя класса обязано совпадать с именем файла, в котором этот класс описан, а имя пакета должно совпадать с именем папки, в которой хранится класс.
Обычно в пакеты объединяют классы одной и той же категории, либо предоставляющие сходную функциональность.
— Существует специальный уровень доступа, позволяющий типам из одного пакета более тесно взаимодействовать друг с другом, чем с классами из других пакетов
— Организация классов в виде пакетов позволяет избежать конфликта имен между классами (когда разработчики называют свои классы одинаковыми именами).
Каждый пакет имеет свое пространство имен, что позволяет создавать одноименные классы в различных пакетах.
Класс представляет собой контейнер, содержащий программный код.
Код внутри класса представляет собой набор элементов — описание полей, констант, методов, интерфейсов и других классов.
Класс — по сути является шаблоном (описанием) для объекта: он определяет, как объект будет выглядеть и какими функциями обладать.
Класс представляется в исходном коде так:
(Объект — сущность в адресном пространстве вычислительной систем, появляющаяся при создании экземпляра класса.)
Класс — по сути является шаблоном (описанием) для объекта: он определяет, как объект будет выглядеть и какими функциями обладать.
Рецепт (шаблон) выпечки пирожков можно назвать классом. Реально же существующий экземпляр данного класса (шаблона) — пирожок является объектом этого класса.
Любой объект может обладать двумя основными характеристиками:
— состояние (некоторые данные, которые хранит объект)
Для хранения состояния объекта в классе применяются поля или переменные класса.
— поведение (действия, которые может совершать объект)
Для определения поведения объекта в классе применяются методы.
Метод (функция) — это набор инструкций (команд), выполняемых программой, которому присвоили имя (имя метода).
Код (тело) метода – это набор выражений (команд) (инструкций). Инструкции для метода должны быть размещены между его фигурными скобками — в «теле метода».
Каждая команда описывает какое-то определённое действие.
В конце каждой команды ставится точка с запятой.
В круглых скобках после имени команды передаются её параметры.
Примеры команд:
System.out.print — команда, отвечающая за вывод сообщения на экран. Следующая команда после этой выведет сообщение на эту же строку.
System.out.println — команда, отвечающая за вывод сообщения на экран с новой строки. Т.е. сначала выводит заданный текст, а потом делает перевод на новую строку. Следующая команда после этой выведет сообщение на новую строку.
Пример записи команды в коде:
System.out.println(10); Результат: выводит на экран число 10
System.out.println(«строка»); Результат: выводит на экран слово строка
Интерфейс – это скелет (заготовка) класса с перечислением необходимых методов, но без их кода.
Интерфейс, подобно классу, можно рассматривать как контейнер, содержащий некоторые программные элементы, а именно, заголовки методов и константы.
Интерфейсы невозможно запустить на выполнение: они, в отличие от классов, не могут содержать тел никаких методов, в том числе и метода main.
Класс можно наследовать и использовать, а для интерфейса же нужно, чтобы кто-то создал класс, написав в нем тексты заявленных методов — только после этого он будет пригоден к использованию
В остальном всё, что относится к классам, распространяется и на интерфейсы.
К примеру, программный код интерфейсов также располагается в текстовых файлах с расширением .java, а сами интерфейсы могут быть помещены в пакеты.
Также в результате компиляции для каждого интерфейса создаётся файл с расширением class, содержащий его байтовый код, а имя этого файла (без расширения) совпадает с именем интерфейса.
В тексте класса, который реализует (имплементирует) интерфейс, должны быть написаны тексты всех методов, декларированных в этом интерфейсе.
Класс может реализовывать сразу несколько интерфейсов. В этом случае они указываются через запятую после слова implements.
Интерфейсы используют при разработке объемных программ большими коллективами: один программист может прописать несколько интерфейсов, а другие по его заданию подробно расписать классы, реализующие эти интерфейсы. Таким образом облегчается планирование работы и экономится время.