Что такое поля класса java

Класс object в java. Основные поля и методы.

В Java определен один специальный класс — Object. Все остальные классы являются подклассами этого класса. То есть Object — суперкласс всех остальных классов. Это означает, что ссылочная переменная типа Object может ссылаться на объект любого другого класса. Кроме того, поскольку массивы реализованы в виде классов, переменная типа Object может ссылаться также на любой массив.

Класс Object определяет методы, которые доступны в любом объекте.

Методы getClass (), notify (), notifyAll () и wait () объявлены как final. Остальные методы можно переопределять.

В составе класса Object определена целая группа методов, которые наследуются всеми производными классами. Эти методы можно условно разделить на две категории – прикладные методы и методы, обеспечивающие поддержку многопоточных вычислений.

· public boolean equals(Object obj) Проверяет, равны ли текущий объект и объект, на который указывает ссылка obj, переданная в качестве параметра, и возвращает значение true, если факт равенства установлен, и false – в противном случае. Если необходимо проверить, указывают ли две ссылки на один и тот же объект, следует применять операторы == или! =. Метод equals сопоставляет содержимое объектов. В исходной реализации метода equals, предусмотренной в классе Object, предполагается, что объект равен только самому себе, Т.е. удовлетворяет условию this == obj.

· public int hashCode()Возвращает значение хеш-кода (hash code) текущего объекта. Каждый объект обладает собственным хеш-кодом, который находит применение в хеш-таблицах. В реализации по умолчанию предусмотрен возврат значения, которое, как правило, различно для разных объектов. Значение кода используется в процессе сохранения объекта в одной из хеш-коллекций.

· protected Object clone() throws CloneNotSupportedException Возвращает клон текущего объекта. Клон — это новый объект, являющийся копией текущего.

· public final Class getClass() Возвращает объект типа Class, который представляет информацию о классе текущего объекта на этапе выполнения программы.

· protected void finalize() throws ThrowableПозволяет выполнить необходимые операции очистки состояния объекта до того момента, когда объект будет уничтожен в процессе сборки мусора.

· public String toString()Возвращает строковое представление объекта. Метод tоString вызывается неявно, когда ссылка на объект употребляется в качестве операнда в контексте выражений конкатенации строк с помощью оператора +. Версия метода toString, реализованная в классе Object, по умолчанию возвращает строку, содержащую наименование класса, которому принадлежит текущий объект, символ @ и шестнадцатеричное представление хеш-кода объекта.

· void notify() Возобновляет единичный поток, который ожидает на объектном мониторе.

· void notifyAll() Возобновляет все потоки, которые ожидают на объектном мониторе.

· void wait() void wait(long timeout) void wait(long timeout, int nanos) Остановка текущего потока пока другой поток не вызовет notify() или notifyAll метод для этого объекта

Оба метода, hashcode и equals, должны быть переопределены, если необходимо придать понятию равенства объектов иной смысл, отличный от того, который предлагается классом Object. По умолчанию считается, что любые два различных объекта "не равны", Т.е. метод equals возвращает значение false, и их хеш-коды, как правило, различны.

Если версия метода equals, реализованная в некоем классе, допускает "равенство" двух различных объектов, их хеш-коды, возвращаемые соответствующими вариантами метода hashCode, также должны быть равны. Дело в том, что механизм хеширования тесно связан с методом еquаls, возвращающим true, если в хеш-таблице найден ключ с заданным значением. Например, в классе String метод equals переопределен таким образом, что он возвращает true, если оба сопоставляемых объекта String обладают одинаковым содержимым. В классе String также переопределен и метод hashcode – он возвращает значение, непосредственно зависящее от содержимого строки, так что две одинаковые строки неизбежно будут иметь один и тот же хеш-код.

Термин тождественность (identity) применяется в отношении равенства ссылок на объекты: если две ссылки тождественны, Т.е. указывают на один объект, оператор сравнения == возвратит значение true. Термин равнозначность (equivalence) используется для выражения факта равенства значений — метод equals возвращает true, если значения совпадают (причем ссылки на них могут быть и не тождественны). Поэтому мы вправе сказать, что реализация метода equals в классе Object, предлагаемая по умолчанию, предусматривает совпадение понятий тождественности и равнозначности. Класс, в котором понятие равенства расширяется, способен "производить" объекты – не тождественные, но равнозначные – посредством переопределения метода equals. Таким образом, чтобы тот возвращал true, принимая во внимание внутреннее состояние объектов, а не возможность совпадения ссылок на них.

В некоторых типах хеш-таблиц при поиске ключей учитывается тождественность ссылок на объекты, а не равнозначность самих объектов. Если вам необходимо создать подобную таблицу-класс, следует позаботиться о том, чтобы хеш-коды соответствовали свойству тождественности объектов, а не их состоянию. Метод System.identityHashCode возвращает то же значение, которое мог бы возвратить метод hashCode класса Object, если этот метод в производном классе не переопределен.

Этот класс определяет основное состояние и поведение, которое должны иметь все объекты, например, способности сравнивать один объект с другим, преобразовывать к строке и возвращать объектную ссылку. Класс Object включен в пакет java. Lang. Конструктор: Object().

БИЛЕТ №15

Работа со стандартными потоками

Приложению Java доступны три стандратных потока, которые всегда открыты: стандартный поток ввода, стандартный поток вывода и стандартный поток вывода сообщений об ошибках.

Все перечисленные выше потоки определены в классе System как статические поля с именами, соответственно, in, out и err:

public final class java.lang.System

public static PrintStream err;

public static InputStream in;

public static PrintStream out;

Заметим, что стандратные потоки, как правило, не используются аплетами, так как навигаторы Internet общаются с пользователем через окно аплета и извещения от мыши и клавиатуры, а не через консоль.

Стандартный поток ввода

Стандартный поток ввода in определен как статический объект класса InputStream, который содержит только простейшие методы для ввода данных. Нужнее всего вам будет метод read:

public int read(byte b[]);

Этот метод читает данные из потока в массив, ссылка на который передается через единственный параметр. Количество считанных данных определяется размером массива, то есть значением b.length.

Метод read возвращает количество прочитанных байт данных или -1, если достигнут конец потока. При возникновении ошибок создается исключение IOException, обработку которого необходимо предусмотреть.

Стандартный поток вывода

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

Для работы со стандартным потоком вывода вы будете использовать главным образом методы print и println, хотя метод write также доступен.

В классе PrintStream определено несколько реализаций метода print с параметрами различных типов:

public void print(boolean b);

public void print(char c);

public void print(char s[]);

public void print(double d);

public void print(float f);

public void print(int i);

public void print(long l);

public void print(Object obj);

public void print(String s);

Как видите, вы можете записать в стандартный поток вывода текстовое представление данных различного типа, в том числе и класса Object.

Метод println аналогичен методу print, отличаясь лишь тем, что он добавляет к записываемой в поток строке символ перехода на следующую строку:

public void println();

public void println(boolean b);

public void println(char c);

public void println(char s[]);

public void println(double d);

public void println(float f);

public void println(int i);

public void println(long l);

public void println(Object obj);

public void println(String s);

Реализация метода println без параметров записывает только символ перехода на следующую строку.

Классы. Объектно-ориентированное программирование

Java является объектно-ориентированным языком, поэтому такие понятия как «класс» и «объект» играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.

Шаблоном или описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке — наличие двух рук, двух ног, головы, туловища и т.д. Есть некоторый шаблон — этот шаблон можно назвать классом. Реально же существующий человек (фактически экземпляр данного класса) является объектом этого класса.

Класс определяется с помощью ключевого слова сlass :

В данном случае класс называется Person. После названия класса идут фигурные скобки, между которыми помещается тело класса — то есть его поля и методы.

Любой объект может обладать двумя основными характеристиками: состояние — некоторые данные, которые хранит объект, и поведение — действия, которые может совершать объект.

Для хранения состояния объекта в классе применяются поля или переменные класса. Для определения поведения объекта в классе применяются методы. Например, класс Person, который представляет человека, мог бы иметь следующее определение:

В классе Person определены два поля: name представляет имя человека, а age — его возраст. И также определен метод displayInfo, который ничего не возвращает и просто выводит эти данные на консоль.

Теперь используем данный класс. Для этого определим следующую программу:

Как правило, классы определяются в разных файлах. В данном случае для простоты мы определяем два класса в одном файле. Стоит отметить, что в этом случае только один класс может иметь модификатор public (в данном случае это класс Program), а сам файл кода должен называться по имени этого класса, то есть в данном случае файл должен называться Program.java.

Класс представляет новый тип, поэтому мы можем определять переменные, которые представляют данный тип. Так, здесь в методе main определена переменная tom , которая представляет класс Person. Но пока эта переменная не указывает ни на какой объект и по умолчанию она имеет значение null . По большому счету мы ее пока не можем использовать, поэтому вначале необходимо создать объект класса Person.

Конструкторы

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

Если в классе не определено ни одного конструктора, то для этого класса автоматически создается конструктор без параметров.

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

Для создания объекта Person используется выражение new Person() . Оператор new выделяет память для объекта Person. И затем вызывается конструктор по умолчанию, который не принимает никаких параметров. В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект.

Если конструктор не инициализирует значения переменных объекта, то они получают значения по умолчанию. Для переменных числовых типов это число 0, а для типа string и классов — это значение null (то есть фактически отсутствие значения).

После создания объекта мы можем обратиться к переменным объекта Person через переменную tom и установить или получить их значения, например, tom.name = «Tom» .

В итоге мы увидим на консоли:

Если необходимо, чтобы при создании объекта производилась какая-то логика, например, чтобы поля класса получали какие-то определенные значения, то можно определить в классе свои конструкторы. Например:

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

Консольный вывод программы:

Ключевое слово this

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

В третьем конструкторе параметры называются так же, как и поля класса. И чтобы разграничить поля и параметры, применяется ключевое слово this:

Так, в данном случае указываем, что значение параметра name присваивается полю name.

Кроме того, у нас три конструктора, которые выполняют идентичные действия: устанавливают поля name и age. Чтобы избежать повторов, с помощью this можно вызвать один из конструкторов класса и передать для его параметров необходимые значения:

В итоге результат программы будет тот же, что и в предыдущем примере.

Инициализаторы

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

Объекты, классы и типы в Java

Java – это объектно-ориентированный язык программирования. Java состоит из основополагающих компонентов:

  • Полиморфизм
  • Наследование
  • Инкапсуляция
  • Абстракция
  • Классы
  • Объекты
  • Пример
  • Метод

Рассмотрим компоненты – классы и объекты Java.

  • Объект – имеет состояние и поведение. Например: у кошки есть такие состояния: раскраска, возраст, порода, и поведение – прыгать, мяукать, спать. Объект является экземпляром класса.
  • Класс – можно определить как шаблон/план, описывающий поведение/состояние, поддерживаемое объектом его типа.

Объекты в Java

Разберём детально, что представляет собой объект в Java. Если оглянуться вокруг, мы найдём много объектов вокруг нас: автомобили, собаки, люди. Все они имеют состояние и поведение.
Если мы рассмотрим автомобиль, то его состояние – марка, цвет, стоимость и поведение – передвигается по дорогам, требует ремонта.

Если вы сравниваете виртуальный объект с настоящим объектом, они имеют очень похожие характеристики.
Виртуальные объекты также имеют состояние и поведение. Состояние виртуального объекта сохраняется в полях, а поведение отображается с помощью методов.

создание объектов Java

Получается, при разработке программного обеспечения методы работают с внутренним состоянием объекта, а связь между объектами осуществляется с помощью методов.

Описание классов в Java

Класс – это компонент языка Java, из которого создаются отдельные объекты.
Ниже приведен образец класса.

Класс может содержать в себе типы переменных:

  • Локальные – переменные, определенные внутри методов, конструкторов или блоков, называются локальными переменными. Переменная будет объявлена ​​и инициализирована в методе, а переменная будет уничтожена после завершения метода.
  • Переменные экземпляра – это переменные внутри класса, но вне какого-либо метода. Эти переменные инициализируются, когда создается экземпляр класса. К переменным экземпляра можно получить доступ из любого метода, конструктора или блоков этого конкретного класса.
  • Переменные класса – это переменные, объявленные внутри класса, вне любого метода, с ключевым словом static.

описание класса

Класс может иметь бесконечно много методов для доступа к значению различных видов методов. В приведенном выше примере barking(), hungry() и sleep() являются методами.
Ниже приведены некоторые важные темы, которые необходимо знать при изучении классов.

Описание конструкторов

У каждого класса есть конструктор. Если мы явно не пишем конструктор для класса, компилятор Java создает конструктор по умолчанию для этого класса.

Каждый раз, когда создается новый объект, будет вызываться как минимум один конструктор. Основное правило конструкторов заключается в том, что они должны иметь то же имя, что и класс. Класс может иметь более одного конструктора.
Ниже приведен пример конструктора:

Java также поддерживает Singleton Classes(Одноэлементные), где вы сможете создать только один экземпляр класса.

Построение объекта

В основном, объект создается из класса.
Есть три шага при создании объекта из класса:

  • Объявление – объявление переменной с именем переменной с типом объекта.
  • Instantiation – ключевое слово «new» используется для создания объекта.
  • Инициализация. За ключевым словом «new» следует вызов конструктора. Этот вызов инициализирует новый объект.

Ниже приведен пример создания объекта

Если мы скомпилируем и запустим вышеуказанную программу, то она даст следующий результат:

Введенное имя: Томми

Доступ к переменным и методам экземпляра

Переменные и методы экземпляра доступны через созданные объекты. Чтобы получить доступ к переменной экземпляра, следующий полный путь:

В этом примере объясняется, как получить доступ к переменным экземпляра и методам класса.

Если мы скомпилируем и запустим вышеуказанную программу, то она даст следующий результат:

Имя выбрано: Томми
Возраст щенка: 2
Значение переменной: 2

Правила объявления исходного файла

Теперь рассмотрим правила объявления исходного файла.

  • В исходном файле может быть только один открытый класс.
  • Исходный файл может иметь несколько закрытых классов.
  • Публичным именем класса должно быть также имя исходного файла, к которому в конце должен быть добавлен .java. Например: имя класса – публичный класс Employee <>, тогда исходный файл должен быть как Employee.java.
  • Если класс определен внутри пакета, оператор пакета должен быть первым оператором в исходном файле.
  • Если присутствуют операторы импорта, они должны быть записаны между оператором пакета и объявлением класса. Если нет никаких операторов пакета, то оператор импорта должен быть первой строкой в ​​исходном файле.
  • Операторы import и package будут относиться ко всем классам, присутствующим в исходном файле. Невозможно объявить разные операторы импорта и / или пакета для разных классов в исходном файле.

У классов есть несколько уровней доступа, и есть разные типы классов; абстрактные классы, финальные классы и т. д.

Помимо вышеупомянутых типов классов, в Java также есть некоторые специальные классы, называемые классами Inner и классами Anonymous(анонимные).

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

Если задано полное имя, которое включает пакет и имя класса, тогда компилятор может легко найти исходный код или классы. Оператор импорта – это способ дать правильное местоположение компилятору для поиска этого конкретного класса.
Например, следующая строка попросит компилятор загрузить все классы, доступные в каталоге java_installation / java / io —
import java.io. *;

Для нашего примера мы создадим два класса. Это Employee и EmployeeTest.
Сначала откройте блокнот и добавьте следующий код. Помните, что это класс Employee, а этот класс является публичным. Теперь сохраните этот исходный файл с именем Employee.java.

Класс Employee имеет четыре переменных экземпляра – имя, возраст, назначение и зарплата. У класса есть один явно определенный конструктор, который принимает параметр.

Чтобы запустить класс Employee, должен быть метод main и объекты должны быть созданы. Необходимо создавать отдельный класс для этих задач.

Инициализация полей в Java (Java fields initialization)

Как известно, в Java поля (fields) могут принадлежать классу или объекту. Поля, принадлежащие классу, являются статическими, а поля, принадлежащие объекту, — нестатическими. Статические поля доступны без создания объекта класса. Соответственно инициализироваться статические и нестатические поля должны в разное время: одни до создания объекта класса, а другие после.

Типы инициализации полей объектов и классов

Существуют следующие методы инициализации полей:

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

Далее мы рассмотрим каждый тип инициализации подробнее.

Инициализация статических полей в месте объявления

Начнем с примера:

Здесь инициализируется статическое поле SIZE класса Integer. Сама инициализация произойдет во время загрузки класса. В этом легко убедиться выполнив следующий код:

В результате будет выведено:

Как видно из вывода переменная i инициализируется в результате загрузки класса. Попробуйте выполнить код, закомментировав строку, содержащую Class.forName(. ).

Инициализация в статическом блоке

В некоторых случаях инициализацию неудобно проводить в месте объявления переменной. Например, если в результате выполнения инициализирующего выражения происходит проверяемое исключение. Или же, если инициализация производится путем выполнения кода, который не может быть представлен в виде выражения. Для таких случаев в Java предусмотрен специальный языковой элемент — инициализационный статический блок. Покажем на примере:

Переменная alphabet инициализируется в статическом блоке. Инициализация происходит во время загрузки класса аналогично как и в предыдущем примере.

Инициализация статических полей в месте объявления и статические блоки выполняются в порядке их объявления в классе. Давайте выполним следующий код:

На консоль будет выведено:

Инициализация полей объекта

В отличии от полей класса, поля объекта инициализируются во время конструирования экземпляра класса. В Java существует 3 типа такой инициализации:

  • инициализация в месте объявления
  • инициализация в нестатическом блоке
  • инициализация в конструкторе

Инициализация полей объекта в месте объявления

Покажем на примере:

Инициализация поля posts будет произведена во время конструирования объекта Blog.

Инициализация полей объекта в нестатическом блоке

Использование инициализационных блоков является альтернативой предыдущему способу инициализации. Данный тип инициализации может использоваться, если:

  • во время инициализации необходимо обработать проверяемое исключение
  • значение поля не удобно вычислять с помощью выражения (например, для этого нужен специально созданный класс или метод, который не хочется создавать только для этих целей)
  • необходимо инициализировать поле анонимного класса (в анонимном классе невозможно объявить конструктор)

Пример обработки проверяемого исключения:

Инициализация полей объекта в конструкторе

Часто инициализацию полей объекта имеет смысл проводить только с учетом значений параметров конструктора. В таких случаях ее производят в самом конструкторе. Пример:

Инициализация в конструкторе и наследование

Выполним следующий код:

В результате выполнения получим:

Вывод свидельствует о том что:

  • инициализация полей в месте объявления и в инициализационном блоке происходит до инициализации в конструкторе
  • инициализации полей в месте объявления и в инициализационных блоках выполняются в порядке их объявления в классе
  • инициализация полей базового класса происходит полностью до инициализации производного класса, т.е. сначала выполняются все инициализаторы базового класса, а потом все инициализаторы производного класса.

Результат декомипляции предыдущего примера

Ну и напоследок давайте декомпилируем следующий код с помощью Jad:

Получился следующий листинг:

Интересно, что компилятор перенес всю нестатическую инициализацию объекта в конструктор класса. При этом статический инициализационный блок остался без изменений.

Выводы

Java предоставляет богатый арсенал языковых инструментов. Какие из них когда использовать — решать разработчику. Но важно знать о наличии их всех и важно отчетливо понимать, почему выбран тот или иной в каждом конкретном случае.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *