что такое класс в java простыми словами
Классы. Объектно-ориентированное программирование
Классы и объекты
Java является объектно-ориентированным языком, поэтому такие понятия как «класс» и «объект» играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.
Класс определяется с помощью ключевого слова сlass :
Для хранения состояния объекта в классе применяются поля или переменные класса. Для определения поведения объекта в классе применяются методы. Например, класс Person, который представляет человека, мог бы иметь следующее определение:
Теперь используем данный класс. Для этого определим следующую программу:
Как правило, классы определяются в разных файлах. В данном случае для простоты мы определяем два класса в одном файле. Стоит отметить, что в этом случае только один класс может иметь модификатор public (в данном случае это класс Program), а сам файл кода должен называться по имени этого класса, то есть в данном случае файл должен называться Program.java.
Конструкторы
Если в классе не определено ни одного конструктора, то для этого класса автоматически создается конструктор без параметров.
Выше определенный класс Person не имеет никаких конструкторов. Поэтому для него автоматически создается конструктор по умолчанию, который мы можем использовать для создания объекта Person. В частности, создадим один объект:
В итоге мы увидим на консоли:
Если необходимо, чтобы при создании объекта производилась какая-то логика, например, чтобы поля класса получали какие-то определенные значения, то можно определить в классе свои конструкторы. Например:
Теперь в классе определено три коструктора, каждый из которых принимает различное количество параметров и устанавливает значения полей класса.
Консольный вывод программы:
Ключевое слово this
Ключевое слово this представляет ссылку на текущий экземпляр класса. Через это ключевое слово мы можем обращаться к переменным, методам объекта, а также вызывать его конструкторы. Например:
В третьем конструкторе параметры называются так же, как и поля класса. И чтобы разграничить поля и параметры, применяется ключевое слово this:
Так, в данном случае указываем, что значение параметра name присваивается полю name.
Кроме того, у нас три конструктора, которые выполняют идентичные действия: устанавливают поля name и age. Чтобы избежать повторов, с помощью this можно вызвать один из конструкторов класса и передать для его параметров необходимые значения:
В итоге результат программы будет тот же, что и в предыдущем примере.
Инициализаторы
Кроме конструктора начальную инициализацию объекта вполне можно было проводить с помощью инициализатора объекта. Инициализатор выполняется до любого конструктора. То есть в инициализатор мы можем поместить код, общий для всех конструкторов:
Что такое класс в Java
ООП — это то, на чём держится вся разработка на Java. С помощью объектов и классов можно создать любой функционал быстрее.
Объектно-ориентированное программирование — это подход к разработке приложений с помощью классов и объектов. Он позволяет писать значительно меньше кода и при этом реализовывать больше возможностей, чем при функциональном проектировании программ.
В программе, написанной по принципам ООП, отдельные компоненты рассматриваются как предметы из реального мира, такие как дом, дерево, кот, человек и даже Java-разработчик. У каждого объекта есть свои атрибуты. Вот какими они будут у принтера: цвет, марка, скорость печати, объём оставшейся краски и так далее.
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Также принтеру свойственно определённое «поведение»: печать, сканирование, копирование, проверка наличия краски, подключение к Wi-Fi и так далее — всё это называется методами.
Каждый принтер уникален, поэтому обладает своим идентификатором, по которому к нему можно обратиться, чтобы узнать или изменить тот или иной атрибут, а также вызвать метод:
Однако прописывать все атрибуты и методы для каждого объекта было бы слишком сложно, поэтому используются классы — общий шаблон того, как должен вести себя объект.
Допустим, существует класс Бумага, которому прописываются свои параметры и методы: цвет, цена, размер, толщина и так далее. Каждый отдельный объект является экземпляром класса. Например, можно создать объект листБумаги1, листБумаги2, листБумаги3 — у всех них будут одинаковые атрибуты и поведение, но разные значения:
Эту бумагу можно, например, передать объекту класса Принтер, чтобы её распечатать:
Без объектов нам бы пришлось создавать отдельные функции и работать с ними. Сейчас мы можем написать такой код:
То есть мы создаём объект и даём ему параметры: адрес и размер. Потом отправляем ему текст и лист бумаги, а он печатает это так, как прописано в теле метода.
Без классов нам бы пришлось создавать множество негруппированных переменных, в которых хранилась бы вся эта информация:
Представьте, как раздуется код от количества переменных и функций, которые нужны, чтобы распечатать обычный лист. А ведь нужно написать ещё и функцию заправки, сканирования, копирования и так далее.
Пришлось бы несколько раз дублировать одинаковые фрагменты кода, чтобы написать что-то. А ООП позволяет сократить код, а значит, быстрее разрабатывать программы, а также читать и переписывать их.
Как работают классы в Java
Создавая программу, нужно объявить класс с её именем, а потом добавить метод main — из него начинается работа приложения:
В Java всё, что не является объектом, является классом. Даже System, с помощью которого выводится текст, — это объект.
Можно создать переменные для этого класса — атрибуты:
Эти переменные вызываются из основного метода и умножаются. Вот как выглядит результат таких вычислений:
Пока не обращайте внимания на слова public и static — про них мы расскажем позже. Так же можно создавать методы, похожие на main. Для них укажите модификаторы доступа (public и static), возвращаемый тип и название:
Запустив программу, мы увидим результат работы метода GetCube():
Пока всё работает в пределах основного класса, но можно создать и другие. Для наглядности мы будем делать это на примере кода мессенджера. Здесь будут использоваться классы Сообщение (Message) и Пользователь (User).
Чтобы начать работать с классами, создайте папку для своего проекта: например, 01. Добавьте в неё ещё два каталога — src и bin. В первом будут храниться исходники, а во втором — скомпилированные файлы.
Теперь скомпилировать файл можно так:
Все классы должны находиться в отдельных файлах. которые нужно объединить в пакет. Его название должно выглядеть так: com.sitename.packagename. Хотя вы можете обойтись и без домена packagename. Чтобы создать пакет, сначала в папке src создайте следующую структуру:
В нашем случае для основного файла путь будет таким:
В тот же каталог поместите User.java и Message.java. После этого в начало каждого файла добавьте такую строчку:
Она означает, что этот код относится к определённому пакету. И чтобы воспользоваться каким-то классом, нужно добавить в начало основной программы несколько команд:
Теперь можно компилировать программу с помощью команды:
Если вы всё сделали правильно, в папке bin появится такая же структура, как в src. Вот код корневого файла приложения:
Теперь этот код можно запустить, прописав такую команду:
Вот что выведет консоль:
Но если вы пока не уверены, что хотите продолжать работать на Java, можете поэкспериментировать в консоли.
Как создать класс в Java
Теперь можно приступить к созданию классов. Начнём с пользователя:
Слово public выступает модификатором доступа — он определяет, откуда будет доступен компонент. Для класса можно указать следующие модификаторы:
Теперь в основном файле можно создать объект класса User:
Мы указали для объекта user1 класс User, а после оператора присваивания указали ключевое слово new и запустили конструктор (об этом позже). Вот как будет выполнена программа:
Создание объекта называется объявлением экземпляра класса — тут же можно использовать конструктор, чтобы сразу задать значения атрибутам.
Для этого нужно в теле класса создать метод с таким же названием, что и класс. Ему можно передать аргументы, с которыми можно провести операции:
Обратите внимание, что внутри класса атрибуты вызываются с помощью ключевого слова this. Это нужно для того, чтобы компилятор не путался, с какой переменной работать — например, в случае, если у аргумента такое же имя, как и у атрибута:
Теперь, чтобы создать объект, нужно немного поменять код:
Дальше можно создать класс для работы с сообщениями:
Обратите внимание, что в этот раз для атрибутов from и to мы задали модификатор private, а в качестве типа стоит User. Private позволяет закрыть доступ к элементам извне — то есть их можно менять только внутри методов самого класса.
Это позволяет защитить атрибуты от незапланированного доступа. Если же вы хотите получать или менять атрибуты, можно воспользоваться getter и setter. Это специальные методы, которые позволяют обратиться к защищённой переменной:
Теперь можно написать код, который будет создавать сообщение:
Объекты, классы и типы в Java
Java – это объектно-ориентированный язык программирования. Java состоит из основополагающих компонентов:
Рассмотрим компоненты – классы и объекты Java.
Объекты в Java
Разберём детально, что представляет собой объект в Java. Если оглянуться вокруг, мы найдём много объектов вокруг нас: автомобили, собаки, люди. Все они имеют состояние и поведение.
Если мы рассмотрим автомобиль, то его состояние – марка, цвет, стоимость и поведение – передвигается по дорогам, требует ремонта.
Если вы сравниваете виртуальный объект с настоящим объектом, они имеют очень похожие характеристики.
Виртуальные объекты также имеют состояние и поведение. Состояние виртуального объекта сохраняется в полях, а поведение отображается с помощью методов.
Получается, при разработке программного обеспечения методы работают с внутренним состоянием объекта, а связь между объектами осуществляется с помощью методов.
Описание классов в Java
Класс – это компонент языка Java, из которого создаются отдельные объекты.
Ниже приведен образец класса.
Класс может содержать в себе типы переменных:
Класс может иметь бесконечно много методов для доступа к значению различных видов методов. В приведенном выше примере barking(), hungry() и sleep() являются методами.
Ниже приведены некоторые важные темы, которые необходимо знать при изучении классов.
Описание конструкторов
У каждого класса есть конструктор. Если мы явно не пишем конструктор для класса, компилятор Java создает конструктор по умолчанию для этого класса.
Каждый раз, когда создается новый объект, будет вызываться как минимум один конструктор. Основное правило конструкторов заключается в том, что они должны иметь то же имя, что и класс. Класс может иметь более одного конструктора.
Ниже приведен пример конструктора:
Java также поддерживает Singleton Classes(Одноэлементные), где вы сможете создать только один экземпляр класса.
Построение объекта
В основном, объект создается из класса.
Есть три шага при создании объекта из класса:
Ниже приведен пример создания объекта
Если мы скомпилируем и запустим вышеуказанную программу, то она даст следующий результат:
Введенное имя: Томми
Доступ к переменным и методам экземпляра
Переменные и методы экземпляра доступны через созданные объекты. Чтобы получить доступ к переменной экземпляра, следующий полный путь:
В этом примере объясняется, как получить доступ к переменным экземпляра и методам класса.
Если мы скомпилируем и запустим вышеуказанную программу, то она даст следующий результат:
Имя выбрано: Томми
Возраст щенка: 2
Значение переменной: 2
Правила объявления исходного файла
Теперь рассмотрим правила объявления исходного файла.
У классов есть несколько уровней доступа, и есть разные типы классов; абстрактные классы, финальные классы и т. д.
Помимо вышеупомянутых типов классов, в Java также есть некоторые специальные классы, называемые классами Inner и классами Anonymous(анонимные).
Проще говоря, это способ классификации классов и интерфейсов. При разработке приложений на Java будут написаны сотни классов и интерфейсов, поэтому классификация этих классов является обязательной, а также значительно облегчает жизнь.
Для нашего примера мы создадим два класса. Это Employee и EmployeeTest.
Сначала откройте блокнот и добавьте следующий код. Помните, что это класс Employee, а этот класс является публичным. Теперь сохраните этот исходный файл с именем Employee.java.
Класс Employee имеет четыре переменных экземпляра – имя, возраст, назначение и зарплата. У класса есть один явно определенный конструктор, который принимает параметр.
Чтобы запустить класс Employee, должен быть метод main и объекты должны быть созданы. Необходимо создавать отдельный класс для этих задач.
Ниже воспроизведён класс EmployeeTest, создающий два класса Employee и обращается к методам для каждого объекта, чтобы назначить значения для каждой переменной.
Сохраните следующий код в файле EmployeeTest.java.
Теперь скомпилируем оба класса и запустим EmployeeTest:
Классы в Java примеры для новичков
Классы Java являются одними из основных строительных блоков приложений Java, наборов инструментов, платформ, API и т. д. Небольшое приложение может состоять из одного класса с методом main(). По мере роста программы хранение всего кода в одном классе усложняет его обзор. Поэтому может быть полезно начать разбивать код на несколько классов.
Класс – это единая, согласованная единица кода, которая принадлежит друг другу. Может содержать смесь данных (переменных) и действий (методов). Группировка переменных и операций над этими переменными в классы упрощает структурирование вашей программы, когда она становится слишком большой для одного класса.
Должен храниться в своем собственном файле. Следовательно, с ростом класса файл, который вы редактируете, также увеличивается, и становится все труднее держать его в голове.
Ваше приложение обычно должно содержать хотя бы один класс, но оно может содержать их столько, на сколько считаете целесообразным разделить ваше приложение. Java также поставляется с большим количеством предопределенных классов, так что вам не нужно кодировать каждую маленькую функцию.
Класс может содержать следующие строительные блоки:
Вложенные виды обычно предназначены для внутреннего использования только в том классе, который их содержит, или для использования в сочетании с классом, который их содержит.
Не все классы имеют поля, конструкторы и методы. Иногда содержат только поля (данные), а иногда – методы (операции). Все зависит от того, что он должен делать.
Определение класса Java
Это определяет общедоступный класс под названием MyClass. Не имеет полей, конструкторов или методов.
Убедитесь, что вы сохраняете одинаковые прописные и строчные буквы из имени класса в имени файла.
Класс с полями
Класс может содержать данные в форме переменных, их обычно называют «полями».
В следующем примере показан класс, предназначенный для моделирования автомобиля. Поэтому назван Car и имеет три поля:
У класса Car нет методов. Только полевые объявления.
С конструктором
Класс может иметь конструктор – это специальный метод, который вызывается при создании объекта. Целью его является инициализация полей. Поля также называются «внутренним состоянием». Вот пример двумя конструкторами:
Конструкторы – это два метода, имя которых совпадает с именем класса, и для которых не указан тип возвращаемого значения. Первый не принимает параметров, а второй принимает 3 параметра. Второй сохраняет значения этих параметров в полях созданного объекта.
С методами
Класс также может содержать операции, обычно называемые методами. Метод содержит инструкции Java, которые обычно выполняют некоторые операции над полем в классе или над одним из значений параметров (также переменных), передаваемых методу при вызове метода.
Вот пример Car из предыдущего раздела с добавленным методом:
В приведенном выше определении класса добавлен метод setColor(). При вызове этот метод устанавливает внутреннюю переменную цвета (поле) в новое значение.
С вложенным классом
Как упоминалось ранее, вы можете определить вложенный класс внутри другого:
В приведенном выше примере внешний класс называется MyClass, а вложенный – MyNestedClass. Ни один из классов не имеет полей или методов, но как внешний, так и вложенный класс могут иметь столько полей и методов, сколько вы считаете нужным.
Объекты
Класс – это шаблон того, как выглядят объекты этого класса. Другими словами, класс Car в предыдущем разделе – это шаблон того, как выглядят объекты Car.
Для создания объектов определенного класса вы используете ключевое слово new. Вот пример:
В этом примере создаются 3 переменные Car, и каждой присваивается новый экземпляр класса Car. Каждая из них теперь ссылается на объект Car, но на отдельный объект, также называемый экземпляром. Если вы измените поля одного объекта, поля других объектов не изменятся. Таким образом, поля разных объектов (даже одного и того же класса) могут различаться независимо друг от друга.
После создания 3 объектов Car метод setColor() вызывается для каждого объекта. Теперь цвет (представленный в виде текста) устанавливается индивидуально для каждого объекта Car.
Создание объекта определенного класса также называется «создание экземпляра» объекта. Таким образом, объект также называется «экземпляром» данного класса. Например, каждый из вышеперечисленных объектов Car также называется экземпляром класса Car или просто «экземплярами Car».
Классы, объекты, методы
Java является объектно-ориентированным языком, поэтому такие понятия как «класс» и «объект» играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.
Определение класса
Таким образом, в классе Book определены три переменных и один метод Info, который выводит значения этих переменных.
Кроме обычных методов в классах используются также и специальные методы, которые называются конструкторами. Конструкторы нужны для создания нового объекта данного класса и, как правило, выполняют начальную инициализацию объекта. Название конструктора должно совпадать с названием класса :
Класс Book имеет два конструктора. Первый конструктор без параметров присваивает «неопределенные» начальные значения полям. Второй конструктор присваивает полям класса значения, которые передаются через его параметры.
Мы можем определить несколько конструкторов для установки разного количества параметров и затем вызывать один конструктор класса из другого :
Вызов конструктора класса с двумя параметрами производится с помощью ключевого слова this, после которого в скобках указывается список параметров.
Создание объекта
Чтобы непосредственно использовать класс в программе, надо создать его объект. Процесс создания объекта двухступенчатый: вначале объявляется переменная данного класса, а затем с помощью ключевого слова new и конструктора непосредственно создается объект, на который и будет указывать объявленная переменная :
После объявления переменной Book b; эта переменная еще не ссылается ни на какой объект и имеет значение null. Затем создаем непосредственно объект класса Book с помощью одного из конструкторов и ключевого слова new.
Инициализаторы
Кроме конструктора начальную инициализацию полей объекта можно проводить с помощью инициализатора объекта. Так можно заменить конструктор без параметров следующим блоком :
Методы класса
Метод класса в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-либо классу или объекту.
Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения определенного действия и может иметь набор входных параметров.
Различают простые методы и статические методы :
Методы предоставляют интерфейс, при помощи которого осуществляется доступ к данным объекта некоторого класса, тем самым, обеспечивая инкапсуляцию данных.
Кроме имени и тела (кода) у метода есть ряд других характеристик:
Модификаторы метода определяют уровень доступа. В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:
Такое разделение интерфейсов позволяет сохранять неизменным открытый интерфейс, но изменять внутреннюю реализацию.
Для того чтобы создать статический метод, перед его именем надо указать модификатор static. Если этого не сделать, то метод можно будет вызывать только в приложении к конкретному объекту данного класса (будет нестатическим).
Класс может включать метод main, который должен иметь уровень доступа public; к нему обращается виртуальная машина Java, не являющаяся частью какого-либо пакета.
Абстрактный класс, abstract class
Абстрактный класс в объектно-ориентированном программировании — базовый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП — полиморфизм. Абстрактный класс может содержать (и не содержать) абстрактные методы. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неабстрактных потомков. Пример абстрактного класса, включающего две абстрактные функции.
Переопределение метода, Override
В реализации ReleasePrice, наследующего свойства класса Price, «реализуем» абстрактные методы и «переопределяем» метод с использованием аннотации @Override :
Теперь, если в родительском класса Price метод bonusPrice будет удален или переименован, то среда разработки должна выдать соответствующее сообщение. Компилятор также выдаст сообщение об ошибке.
Перегрузка методов, overload
Совокупность имени метода и набора формальных параметров называется сигнатурой метода. Java позволяет создавать несколько методов с одинаковыми именами, но разными сигнатурами. Создание метода с тем же именем, но с другим набором параметров называется перегрузкой. Какой из перегруженных методов должен выполняться при вызове, Java определяет на основе фактических параметров, передаваемых методу.
Пример класса Test с тремя перегруженными методами test :
Пример использования класса Test:
Java рекурсия
Рекурсией называется метод (функция), которая внутри своего тела вызывает сама себя.
Рассмотрим пример рекурсивного метода вычисления факториала. Для того чтобы вычислить n!, достаточно знать и перемножить между собой (n-1)! и n. Создадим метод, реализующий описанный способ.
Указанный рекурсивный метод вычисляет факториал натурального числа.
Рассмотрим пример, вычисляющий через рекурсию n-ое число Фибоначчи. Напомним, как выглядят первые элементы этого ряда: 1 1 2 3 5 8 13 …
Суперкласс Object
В Java есть специальный суперкласс Object и все классы являются его подклассами. Поэтому ссылочная переменная класса Object может ссылаться на объект любого другого класса. Так как массивы являются тоже классами, то переменная класса Object может ссылаться и на любой массив.
У класса Object есть несколько важных методов:
Метод | Описание |
---|---|
Object clone() | Функция создания нового объекта, не отличающий от клонируемого |
boolean equals(Object object) | Функция определения равенства текущего объекта другому |
void finalize() | Процедура завершения работы объекта; вызывается перед удалением неиспользуемого объекта |
Class getClass() | Функция определения класса объекта во время выполнения |
int hashCode() | Функция получения хэш-кода объекта |
void notify() | Процедура возобновления выполнения потока, который ожидает вызывающего объекта |
void notifyAll() | Процедура возобновления выполнения всех потоков, которые ожидают вызывающего объекта |
String toString() | Функция возвращает строку описания объекта |
void wait() | Ожидание другого потока выполнения |
void wait(long ms) | Ожидание другого потока выполнения |
void wait(long ms, int nano) | Ожидание другого потока выполнения |
Методы getClass(), notify(), notifyAll(), wait() являются «финальными» (final) и их нельзя переопределять.
Проверка принадлежности класса instanceof
Для проверки принадлежности класса какому-либо объекту необходимо использовать ключевого слова instanceof. Иногда требуется проверить, к какому классу принадлежит объект. Это можно сделать при помощи ключевого слова instanceof. Это логический оператор, и выражение foo instanceof Foo истинно, если объект foo принадлежит классу Foo или его наследнику, или реализует интерфейс Foo (или, в общем виде, наследует класс, который реализует интерфейс, который наследует Foo).
Пример с рыбками. Допустим имеется родительский класс Fish и у него есть унаследованные подклассы SaltwaterFish и FreshwaterFish. Необходимо протестировать, относится ли заданный объект к классу или подклассу по имени
Данная проверка удобна во многих случаях. Иногда приходится проверять принадлежность класса при помощи instanceof, чтобы можно было бы разделить логику кода:
Импорт класса import
Оператор import сообщает компилятору Java, где найти классы, на которые ссылается код. Любой сложный объект использует другие объекты для выполнения тех или иных функций, и оператор импорта позволяет сообщить о них компилятору Java. Оператор импорта обычно выглядит так:
За ключевым словом следуют класс, который нужно импортировать. Имя класса должно быть полным, то есть включать свой пакет. Чтобы импортировать все классы из пакета, после имени пакета можно поместить ‘.*;’
IDE Eclipse упрощает импорт. При написании кода в редакторе Eclipse можно ввести имя класса, а затем нажать Ctrl+Shift+O. Eclipse определяет, какие классы нужно импортировать, и добавляет их автоматически. Если Eclipse находит два класса с одним и тем же именем, он выводит диалоговое окно с запросом, какой именно класс вы хотите добавить.
Статический импорт
Существует ещё статический импорт, применяемый для импорта статических членов класса или интерфейса. Например, есть статические методы Math.pow(), Math.sqrt(). Для вычислений сложных формул с использованием математических методов, код становится перегружен. К примеру, вычислим гипотенузу.
В данном случае без указания класса не обойтись, так как методы статические. Чтобы не набирать имена классов, их можно импортировать следующим образом:
После импорта уже нет необходимости указывать имя класса.
Второй допустимый вариант, позволяющий сделать видимыми все статические методы класса:
В этом случае не нужно импортировать отдельные методы. Но данный подход в Android не рекомендуется, так как требует больше памяти.