Классы и создание объектов классов
На предыдущем занятии мы с вами познакомились с общей концепцией ООП. Но, чтобы вы могли все это использовать на практике, в частности, на языке Java, нужно знать как реализуются ее элементы. И, как всегда, начнем по порядку с самого начала – описания способа объявления классов и создания его объектов (экземпляров).
Во всех наших прежних программах у нас фигурировали строчки:
Смотрите, здесь вначале используется ключевое слово class, за которым следует его название – Main. Далее, открываются фигурные скобки и записывается функция main(), которая является точкой входа в программу. Это пример того, как можно объявлять класс. Начальный синтаксис здесь такой:
[модификаторы] class <
данные (переменные класса);
методы (функции класса);
другие классы и интерфейсы.
>
Как видите, внутри класса можно объявлять переменные, методы, вложенные классы и интерфейсы (что такое интерфейс мы будем говорить позже). Фактически, класс может содержать любые конструкции языка Java и иметь произвольный, самый изощренный функционал.
Конечно, сейчас мы изощряться не будем, а объявим в нашей программе простейший класс и, обычно, я выбираю класс для представления точек на плоскости:
Все, вот так просто можно добавить свой собственный класс в программу. Имя этого класса Point и он содержит два поля (две переменные) x и y.
Здесь сразу следует сделать два замечания:
1. В языке Java каждый новый класс принято записывать в отдельном файле проекта. Причем, имя файла должно совпадать с именем класса – это требование языка.
2. Объявление класса может находиться в любом месте программы. Это никак не влияет на возможность его использования, где бы то ни было в рамках проекта.
Например, мы можем создать ссылку типа Point в функции main(), несмотря на то, что сам класс объявлен после нее:
Я пока оставлю объявление класса в этом же файле для упрощения изложения материала. Итак, мы создали ссылку pt на класс Point. Посмотрим повнимательнее на эту запись. Что из нее следует? Да, имя класса можно воспринимать как новый тип данных. И этот тип данных формирует ссылки на соответствующие объекты. Обратите внимание, я произношу слово «ссылка», а не «переменная». В чем разница? Ссылка – это скрытый указатель, который хранит адрес объекта, на который ссылается, а переменная любого примитивного типа – это имя ячейки памяти, в которой непосредственно хранятся данные:
В этом принципиальная разница между ссылками и обычными переменными. Как же узнать, когда мы работаем со ссылками, а когда с переменными? Очень просто:
Если в качестве типа данных используется имя класса или интерфейса, то формируется ссылка. Если же используется примитивный тип данных (например, int, short, double, bool и т.п.), то объявляется обычная переменная.
Итак, мы создали ссылку на класс Point. Но самого объекта в памяти еще нет. Для его создания используется оператор new, за которым указывается имя класса создаваемого экземпляра:
Все, теперь у нас появился новый объект и на него ссылается переменная pt:
Что, если мы захотим создать еще один такой же объект. Давайте это сделаем вот так:
Мы здесь создаем еще один экземпляр класса Point в памяти устройства, и на него ссылается та же переменная pt. В итоге произойдет следующее:
Прежняя ссылка pt изменит свой адрес и будет ссылаться только на второй объект. Что произойдет с первым? Он так и останется в памяти «безымянным солдатом»? Без единой ссылки? Ссылок на него действительно не будет и пользоваться им мы уже не сможем. Но в памяти он не останется – он будет автоматически уничтожен сборщиком мусора. Это одно из ключевых отличий языка Java от языка C++ – наличие сборщика мусора. Благодаря ему, программист в Java может не беспокоиться об удалении ненужных объектов, то есть, объектов, на которые нет внешних ссылок. И это предотвращает неприятную историю, известную, как «утечка памяти», когда ненужные объекты остаются в памяти и постепенно накапливаются по мере работы программы. Это частая проблема языка C++ и, к счастью, в Java ничего подобного нет. Как мы потом увидим, это значительно упрощает программы и увеличивает гибкость программного кода.
Итак, мы научились объявлять классы и создавать его экземпляры. Как теперь обратиться к полям x, y созданного объекта и записать туда числовую информацию? Для этого используется следующий синтаксис:
Например, для доступа к полям через ссылку pt мы должны записать следующее:
В результате, в объект, на который ссылается переменная pt будут записаны числа 1 и 2:
Соответственно, их можно потом прочитать оттуда, например, так:
Вот так в самом простом варианте происходит запись и чтение данных из полей объекта. Причем, если создать еще один объект класса Point и записать туда другие числовые значения:
То это будут совершенно другие данные, никак не связанные с первыми. То есть, мы получим два независимых объекта класса Point.
Вот так в простейшем случае объявляются классы в Java и создаются их экземпляры. На следующем занятии мы продолжим эту тему и поговорим о конструкторах класса.
Подвиг 1. Объявить класс Point3D для хранения координат трехмерного пространства. Создать три таких объекта, записать в них различные координаты и вывести их поля в консоль.
Подвиг 2. Объявить класс Line, который бы хранил две координаты: начало и конец линии. Создать два таких объекта, записать и вывести по ним информацию в консоль.
Видео по теме
#11 Концепция объектно-ориентированного программирования (ООП)
#12 Классы и создание объектов классов
#13 Конструкторы, ключевое слово this, инициализаторы
#14 Методы класса, сеттеры и геттеры, public, private, protected
#15 Пакеты, модификаторы конструкторов и классов
#16 Ключевые слова static и final
#17 Внутренние и вложенные классы
#18 Как делается наследование классов
#19 Ключевое слово super, оператор instanceof
#20 Модификаторы private и protected, переопределение методов, полиморфизм
#21 Абстрактные классы и методы
#22 Интерфейсы — объявление и применение
#23 Интерфейсы — приватные, статические и дефолтные методы, наследование интерфейсов
#24 Анонимные внутренние классы
#25 Перечисления (enum)
#26 Обобщения классов (Generics)
#27 Ограничения типов, метасимвольные аргументы, обобщенные методы и конструкторы
#28 Обобщенные интерфейсы, наследование обобщенных классов
© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Источник
Создание класса в java
Создавать класс мы будем в программе Ecllipse, но также можно работать в любой другой IDE или в блокноте. В качестве примера мы будем создавать класс, который описывает характеристики и поведение кота.
Вспомним урок 3, и создадим в нашем проекте новый класс под именем Сat. Для этого в меню Ecllipse выберем File -> new -> class и, в открывшемся окне, введем имя класса – Сat ( обязательно с большой буквы! ). Обратите внимание, что галочка public static void main (String[] args) должна быть снята! Затем нажмем Finish (рис 5.1).
В итоге, у нас создался новый класс (рис 5.2).
Структура класса в java
Класс в java оформляется с помощью следующей конструкции:
Рассмотрим ее составляющие:
public – модификатор доступа к классу, в данном случае он нам говорит, что этот класс будет доступен не только данному классу, но и другим. В java существуют и другие модификаторы, но об этого поговорим позднее.
class – ключевое слово, говорящее о том, что это класс.
Cat – имя класса. Имена классов принято писать с заглавной буквы.
< >– фигурные скобки, между которыми разместится тело нашего класса.
В предыдущем уроке мы упоминали, что классы в java состоят из атрибутов и методов, присвоим некоторые и нашему коту.
Атрибуты класса Сat
Атрибутами кота могут быть: имя, вес, окраска. Атрибуты это переменные, которые объявляются следующим образом:
private – здесь опять же указывает на права доступа. К переменной, в данном случае, можно обращаться только из ее класса, чтобы классы извне не могли ее изменить (вспомним инкапсуляцию из урока 4).
int, String – это типы данных. В данном случае вес будет задан при помощи целого числа – int, a имя и цвет при помощи символьной строки String.
После объявления каждого атрибута должна ставиться точка с запятой ;
При помощи // в коде программы оформляются комментарии, которые являются правилом хорошего тона.
Методы класса Сat
Пусть наш кот умеет есть, спать и разговаривать. Опишем это поведение с помощью методов.
public void eat() – сигнатура метода, его определение. В данном случае она нам говорит о том, что:
- метод eat() доступен для других классов – public;
- метод eat() не возвращает никаких данных – void.
eat – имя метода. Имена методов, в отличие от имен классов, принято писать с маленькой буквы. На конце каждого метода после имени всегда идут круглые скобки ( ), пустые или содержащие параметры (об этом позднее).
После сигнатуры метода идут фигурные скобки < >. В них содержится тело метода. Тело нашего метода содержит просто вывод сообщения о том, что кот кушает — "Eating. \n". За вывод текстового сообщения отвечает метод System.out.print("Eating. \n").
\n — символ перевода строки, чтобы при выводе наших сообщений все они не писались в одну строку.
Аналогично предыдущему методу опишем спящего кота:
И немного иначе опишем метод – кот говорит:
В отличие от предыдущих методов этот метод возвращает значение и имеет входные параметры. Давайте подробнее рассмотрим сигнатуру метода public String speak(String words):
public — метод speak() доступен для других классов;
String — тип значения, которое возвращает метод. В предыдущих случаях ключевое слово void указывало на то, что метод ничего не возвращает. В данном случае String указывает на то, что метод возвращает значение типа строка.
Что же это значит? В процессе своей работы метод выполняет определенные действия над данными. Иногда необходимо, чтобы результат этих действий был передан для дальнейшей обработки другим классам, в этом случае метод передает (возвращает) этот результат. Эти возвращаемые данные относятся к какому-либо типу. В нашем примере это тип символьной строки, String.
Возвращающие методы должны содержать в своем теле ключевое слово return, которое указывает на то, что именно возвращает данный метод. В нашем случае это переменная phrase.
speak — имя метода.
(String words) — входные параметры. Входные параметры — это какие-либо данные, которые передаются из других классов и, которые метод должен обработать. Наш метод получает в качестве входных данных строку в виде переменной words, к этой строке дописывает «. mauu. » и возвращает то, что получилось.
В итоге класс Cat выглядит следующим образом:
Обращение к классу в Java
Далее рассмотрим обращение к классу Cat. И то, как его использовать в работе.
Перейдем в класс HelloWorld, который мы создавали в уроке 3 и немного его модифицируем. Удалим строку System.out.println("Hello World"); , чтобы у нас осталось только следующее (рис 5.3).:
Если вы не проходили урок 3 и не создавали класс HelloWorld, то вам его нужно создать: File -> new -> class, ввести в открывшемся окне имя класса и в этот раз обязательно установить галочку public static void main(String[] args).
public static void main(String[] args) – сигнатура метода main(). Программа состоит из нескольких классов, но только один из классов может содержать метод main(). Mетод main(), это так называемая точка входа в программу. Без этого метода мы не сможем стартовать программу. Теперь, вместо приветствия миру, этот метод будет содержать код для работы с классом Cat.
Пишем в тело метода main() (между его фигурными скобками) следующие строки:
Разберем подробнее, что это значит.
Прежде чем вызывать созданные нами методы в классе Cat и заставить нашего кота есть, спать и говорить, сперва нужно создать экземпляр класса (инстанцию).
Данная строчка нам говорит о том, что в памяти создан экземпляр объекта Cat, а переменная ourcat типа Cat (такого же, как и наш объект) указывает на то место в памяти, где был этот объект создан.
Переменную ourcat теперь можно использовать для вызова методов класса Cat, например:
При вызове этих методов в программе Eclipse удобно пользоваться комбинацией клавиш
Ctrl + пробел, после введения имени переменной и точки (рис 5.4). Программа подскажет, какие можно использовать методы для данной переменной.
Если метод возвращает какое-либо значение, например, как наш метод speak() возвращает значение типа String, то его можно вызывать следующим образом:
- объявить переменную такого же типа, что и возвращаемое значение (в нашем случае String)
- присвоить ей вызванный метод, например:
Вспомним, что при описании нашего метода он содержал параметры speak(String words). Теперь, при вызове в качестве параметра выступила фраза "Play with me", метод speak() ее обработал и вернул "Play with me. mauu. ". Именно это значение он присвоил переменной say.
Мы это можем проверить, выведя say на печать при помощи команды:
Итак, наш класс HelloWorld теперь выглядит следующим образом:
Теперь сохраним (Ctrl+Shift+S или ) и запустим (
) нашу программу. При запуске Eclipse может предложить выбрать Java Applet или Java Application. Нужно выбрать Java Application (рис 5.5).
В качестве результата внизу в консоли мы получаем следующие строки.
На этом закончим данный урок, итак, в этом уроке мы:
- Научились создавать класс в java.
- Научились объявлять атрибуты и методы класса.
- Узнали, что методы могут возвращать или не возвращать значения, иметь или не иметь входных параметров.
- Узнали что такое метод main().
- Научились создавать экземпляр класса и вызывать его методы, то есть работать с созданным объектом.
Для закрепления материала предлагаю самостоятельно создать класс Dog, где описать характеристики и поведение собаки, а потом вызвать этот класс из HelloWorld. Свои вопросы можете оставлять в комментариях.
Комментариев к записи: 115
При создании проекта выводится ошибка:
Build path specifies execution environment CDC-1.1/Foundation-1.1. There are no JREs installed in the workspace that are strictly compatible with this environment.
Чем это решить?
посмотрите тут https://www.eclipse.org/forums/index.php/t/685160/ или еще погуглите, я лично с таким не сталкивалась.
Здравствуйте!
Скажите пожалуйста, обязательно ли указывать права доступа конкретно для каждого атрибута в классе?
Если не указать, программа по умолчанию будет считать эти атрибуты доступными для любого класса в пакете, если вас такие права устраивают, то можете не указывать
Источник