что такое объект класса в java
Классы, объекты, методы
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 не рекомендуется, так как требует больше памяти.
BestProg
Классы. Применение классов в программах на Java. Определение класса и объекта класса. Примеры
Содержание
Поиск на других ресурсах:
1. Для чего в программах используются классы?
В языке программирования Java разработка всех программ базируется на объектно-ориентированном подходе. Можно сказать, что Java – этот строго объектно-ориентированный язык программирования. В основе объектно-ориентированного программирования лежат понятия «класс» и «объект». Программист, который разрабатывает программу на основе объектно-ориентированного подхода, должен уметь выделять в проблемной области (задаче) логически-завершенные единицы. Каждая логически завершенная единица должна быть реализована как некоторый класс. В целом, при программировании задач с использованием объектно-ориентированной парадигмы, программист должен уметь:
⇑
2. Определение класса. Общая форма объявления класса. Ключевое слово class
С точки зрения программирования, класс – это набор данных и методов класса. Методы оперируют этими данными класса (выполняют работу над данными класса). С помощью множества методов класса формируется логически-завершенный программный код, который оперирует данными класса.
При использовании классов, в программах выделяются две составляющих:
Объявление класса – это объявление нового составного типа данных. Этот тип данных содержит методы обработки этих данных.
⇑
3. Что такое объект класса? Общая форма объявления объекта класса. Оператор new
Объект класса – это объявление переменной. Тип переменной – это есть тип с именем класса. При объявлении объекта класса создается экземпляр класса. Понятие «объект класса» и «экземпляр класса» можно считать синонимами.
Общий вид объявления объекта класса в языке Java:
Возможен и другой вариант объявления объекта класса:
В языке Java создание объекта класса происходит в 2 этапа:
⇑
4. Какое отличие между понятиями «класс» и «объект класса»?
Класс – это только информация о новом составном (сложном) типе данных. Фактически, класс описывает формат данных. Объявление класса носит декларативный характер. Имя класса есть уникальным во всей программе.
Объект класса – это конкретный экземпляр класса, в котором данные класса имеют некоторые заполненные значения. В отличие от объявления (декларирования) класса, для объекта класса выделяется память. Объектов одного и того же класса может быть несколько.
⇑
5. Простейшие примеры объявления и использования классов, которые содержат данные и методы их обработки
Использование класса в другом методе
В классе объявляется:
Использование класса MyName в другом методе или программном коде
⇑
⇑
7. Что такое классы-«обертки» или классы «упаковки»? Какое назначение классов-«оберток»? Пример
Классы-обертки предназначены для представления примитивных типов в виде объектов. То есть, они осуществляют преобразование примитивного типа в тип-ссылку. Для каждого примитивного типа существует свой собственный класс (тип) упаковки или обертки.
Далее приводится перечень соответствий примитивного типа и типа (класса) упаковки:
Например. Ниже приведены примеры преобразования разных примитивных типов в типы-упаковки и наоборот
Объекты в Java
1. Объекты
Все в Java является объектом.
Вернее, очень мало чего в Java объектом не является. Например, примитивные типы. Но это скорее редкое исключение, чем правило.
Что же такое объект?
Объект — это сгруппированные вместе данные и методы для того, чтобы эти данные обрабатывать. Когда мы говорим о данных, имеем в виду переменные, конечно.
Про переменные объекта говорят, что это «данные объекта» или «состояние объекта».
Про методы объекта говорят: это «поведение объекта». Состояние объекта (переменные объекта) принято менять только с помощью методов того же объекта. Менять переменные объекта напрямую (не через методы объекта) считается дурным тоном.
У каждого объекта, как и у каждой переменной, есть тип. Этот тип определяется один раз при создании объекта и поменять его в дальнейшем нельзя. Типом объекта считается его класс.
У каждого объекта есть собственная копия переменных класса (полей класса). Если в классе была объявлена нестатическая переменная int a, и ваша программа во время работы создала 10 объектов этого класса, теперь в каждом объекте есть собственная переменная int a.
Взаимодействие с объектом
Самый удобный способ работы с объектом — сохранить ссылку на объект в переменную, и потом вызывать методы у этой переменной. Выглядит это для вас знакомо:
Где переменная — это переменная, которая хранит в себе ссылку на объект, а метод — это метод класса объекта.
Если вы хотите обратиться к полю (переменной) объекта, то тоже нужно использовать оператор точка :
Где переменная — это переменная, которая хранит в себе ссылку на объект, а поле — это переменная класса (поле объекта).
2. Оператор new
Где Класс — это имя класса для объявления переменной и имя класса создаваемого объекта. Переменная — это переменная, в которую сохраняется ссылка на созданный объект. А параметры — это параметры метода создания объекта.
Какие именно могут быть параметры у объекта, решают программисты, которые пишут класс объекта.
Вы уже создавали объекты ранее, и даже пользовались именно этой конструкцией. Надеюсь, вы не забыли?
Примеры создания объектов:
Код | Описание |
---|---|
Создает объект типа String | |
Создает объект типа Scanner | |
Создает объект типа int[] : контейнер на 10 элементов типа int |
Устройство Java-программы
1. Объекты и классы
Сегодня вы узнаете немного о том, как устроена типичная программа на Java. И главная новость: каждая программа на Java состоит из классов и объектов.
Что такое классы, вы уже знаете, а что такое объекты?
Начну с аналогии. Представьте, что вы хотите сделать небольшой корабль. Сначала нужно сделать чертёж, затем отдать его на завод, где по этому чертежу соберут корабль. Или десяток. Да вообще, сколько угодно кораблей. По одному чертежу строятся десятки идентичных кораблей, вот что важно.
В программировании на Java все точно так же.
Чертежи
Программист — он как проектировщик. Только проектировщик рисует чертежи, а Java-программист пишет классы. Затем на основе чертежей создаются детали, а на основе классов — объекты.
Сначала мы пишем классы (делаем чертежи), а потом, во время исполнения программы, на основе этих классов Java-машина создает объекты. Точно так же, как корабли создаются на основе чертежей.
Чертёж один, но кораблей может быть много. Корабли разные, у них разные имена, они возят разные грузы. Но они очень похожие: они все — корабли с идентичной конструкцией, и могут выполнять аналогичные задачи.
Или вот еще аналогия.
Муравейник
Муравейник — это хороший пример взаимодействия объектов. В простейшем муравейнике есть три класса муравьёв: королева, воины и рабочие муравьи.
Количество муравьёв каждого класса — разное. Королева — одна на весь муравейник, воинов — десятки, а рабочих муравьёв — сотни. Три класса и сотни объектов. Муравьи взаимодействуют друг с другом, с такими же муравьями и муравьями других классов по жёстко заданным правилам.
Это просто идеальный пример. В типичной программе все точно так же. Есть главный объект, который создаёт объекты всех остальных классов. Объекты начинают взаимодействовать друг с другом и «внешним миром» программы. Внутри этих объектов жёстко запрограммировано их поведение.
Два этих пояснения — это две стороны одной медали. Истина посередине. Первый пример (про чертеж и корабли) показывает связь между классом и объектами этого класса. Аналогия очень сильная. Второй пример (про муравейник) показывает связь между объектами, которые существуют во время работы программы, и написанными классами.
Сначала вы должны написать классы для всех существующих в программе объектов, а потом ещё и описать их взаимодействие. Да, это так, но это легче, чем кажется.
В Java все сущности во время работы программы являются объектами, а написание программы сводится к описанию различных способов взаимодействия объектов. Объекты просто вызывают методы друг друга и передают в них нужные данные.
Документация
А как узнать, какие данные передавать в методы? Тут все уже придумано до вас.
Обычно у каждого класса есть описание, в котором говорится, для чего он создан. Также обычно и у каждого публичного метода есть описание: что он делает, и какие данные нужно в него передавать.
Чтобы использовать класс, нужно в общих чертах знать, что он делает. А также нужно точно знать, что делает каждый его метод. И совсем не обязательно знать, как он это делает. Такая себе волшебная палочка.
Давайте посмотрим на код — копирование файла:
Копирование файла c:\data.txt в файл c:\result.txt |
---|
Если прочитать это код построчно, можно догадаться, что он делает в общих чертах. Хотя тут нужен опыт и практика. Так что спустя некоторое время этот код вам покажется знакомым и понятным.
2. Проектирование программы
Проектирование программы — это целое искусство. Это и просто, и сложно одновременно. Просто, потому что никаких жестких законов нет: все, что не запрещено — разрешено. Ну а сложно тоже по этой причине: очень много способов что-то сделать и непросто найти самый лучший.
Проектировать программу — это как писать книгу. С одной стороны, вы просто пишете буквы, слова, предложения. А с другой – важен сюжет, характеры героев, внутренние противоречия, конфликты, стиль повествования, интрига и т.п.
Главное — понимать, для кого вы пишете код. А код вы пишете для других программистов.
Разработка любого продукта — это внесение изменений: добавили здесь, удалили там, переделали тут. И так маленькими итерациями рождаются большие, огромные и гигантские проекты.
Главное требование к коду — он должен быть понятен другим программистам. Неправильный, но понятный код можно исправить. Правильный и непонятный код улучшать не получится. Его останется только выбросить.
Так как же писать хороший и понятный код?
Для этого нужно делать три вещи:
Что же стоит за этими понятиями?
Писать хороший код внутри методов
Если у вас хотя бы начальный уровень английского, возможно, вы обратили внимание, как легко иногда читается код: как предложения на английском языке:
Так сделано специально. Java — один из нескольких языков, в которых легко писать самодокументированный код: код, который понятен без комментариев. В хорошем коде в Java многие методы читаются просто как предложения на английском языке.
Ваша задача при написании кода — тоже делать его максимально простым и лаконичным. Просто думайте, а насколько ваш код будет легко читать, и вы начнете двигаться в правильном направлении.
В Java принято писать легко читаемый код. Желательно, чтобы каждый метод целиком помещался на экран (длина метода — 20-30 строк). Это норма для всего Java-комьюнити. Если код можно улучшить, его нужно улучшить.
Лучший способ научиться писать хороший код — постоянная практика. Пишите много кода, изучайте чужой код, просите более опытных коллег сделать ревью вашего кода.
И помните, что в тот момент, когда вы себе скажете «и так сойдет», ваше развитие остановится.
Решать, какие сущности должны быть в программе
Вам нужно писать код, понятный для других программистов. Если 9 из 10 программистов при проектировании программы сделают в ней классы A, B и С, то и вам тоже нужно сделать в вашей программе классы A, B, и C. Вы должны писать код, понятный для других.
Отличный, работающий, быстрый, нестандартный код — это плохой код.
Вам нужно изучать чужие проекты: это самый лучший, самый быстрый и самый легкий способ перенять всю мудрость, которая десятилетиями копилась в ИТ-индустрии.
И, кстати, у вас уже есть под рукой отличный, популярный, хорошо документированный проект — Java SDK. Начните с него.
Разбирайте классы и структуры классов. Думайте, почему одни методы сделаны статическими, а другие — нет. Почему у методов именно такие параметры, а не другие. Почему именно такие методы, почему классы называются именно так и находятся именно в таких пакетах.
Когда вы начнете понимать ответы на все эти вопросы, вы сможете писать код, понятный другим.
Однако хочу предостеречь вас от разбора кода в методах Java SDK. Код многих методов был переписан с целью максимизации скорости работы — его читабельность под большим вопросом.
Правильно разбивать программу на логические части
Любую программу обычно разбивают на части или модули. Каждая часть отвечает за свой аспект программы.
Вот у компьютера есть системный блок, монитор, клавиатуры, и это все отдельные, малозависимые части. Более того, их взаимодействие стандартизировано: USB, HDMI и т.п. Зато если вы прольете кофе на клавиатуру, вы можете просто помыть ее под краном, просушить и пользоваться дальше.
А вот ноутбук — это пример монолитной архитектуры: логические части вроде и есть, но интегрированы гораздо сильнее. У MacBookPro, чтобы почистить клавиатуру, нужно разобрать половину ноутбука. А пролитый на ноутбук кофе — повод заказать новый. Только не кофе.
3. Создание своих классов
Но т.к. вы только учитесь программировать, вам нужно начинать с малого — учиться создавать собственные классы.
Вы их, конечно же, уже создавали, но вам нужно учиться понимать, какие классы должны быть в программе, как они должны называться, какие у них должны быть методы. И как они должны друг с другом взаимодействовать.
Список сущностей
Если вы не знаете, с чего начать, начните с начала.
В самом начале проектирования программы вы можете просто выписать на листик список сущностей (объектов), которые должны быть в программе. А потом запрограммировать их по такому принципу: каждая сущность — отдельный класс.
Пример
Допустим, вы хотите написать игру в шахматы. Вам понадобятся такие сущности: шахматная доска и 6 типов фигур. Фигуры ходят по-разному, имеют разную ценность — логично, что это отдельные классы. И вообще, в самом начале, чем больше классов — тем лучше.
Встретить программиста-новичка, который вместо двух классов написал бы десять — большая редкость. Вот вместо десяти написать два, а то и один — это новички любят. Так что больше классов, господа программисты. И ваш код станет понятнее всем, кроме, возможно вас 😛
Шахматы
Допустим, мы решили писать классы для шахмат: как бы эти классы выглядели?
Шахматная доска — это просто массив 8 на 8? Лучше сделайте для нее отдельный класс, который внутри хранит ссылку на массив. Тогда в класс «шахматная доска» вы сможете добавить много полезных методов, которые, например, проверяют, что клетка пустая или занята
В общем, в начале всегда можно руководствоваться принципом: Программа имеет разные Сущности, а у Сущности есть тип. Вот этот тип — это и есть класс.
4. Статические переменные и методы
Также не забывайте пользоваться статическими переменными и методами. Если у вас одна шахматная фигура взаимодействует с другой на шахматной доске, значит, в коде у вас должен быть метод, в который передаются ссылки на первую фигуру, на вторую и на шахматную доску.
Чтобы постоянно не передавать ссылки на объекты, которые «существуют всегда», их обычно делают статическими переменными, и к ним можно обратиться из любого места программы.
Добавляем фигуры на доску.
Ну или вместо статической переменной можно сделать метод, который возвращает единственный объект. Например, так: