Как идентифицируется класс в java
Получение имени класса в Java
Изучите различные способы получения имени класса в Java.
1. Обзор
В этом уроке мы узнаем о четырех способах извлечения имени класса из методов Class API: getSimpleName () , getName () , getTypeName() и getCanonicalName() .
Эти методы могут сбивать с толку из-за их схожих названий и их несколько расплывчатых Javadoc. Они также имеют некоторые нюансы, когда речь заходит о примитивных типах, типах объектов, внутренних или анонимных классах и массивах.
2. Получение Простого Имени
Давайте представим себе следующий класс:
Его простое имя будет RetrieveClassName :
А для массивов метод вернет простое имя типа массива, за которым следует пара открывающих и закрывающих скобок для каждого измерения массива ([]) :
Наконец, есть конкретный случай анонимных классов. Вызов getSimpleName() в анонимном классе вернет пустую строку.
3. Получение Других Имен
Что касается других методов, выходные данные могут немного отличаться в зависимости от вариантов использования. Мы увидим, что это означает для различных типов примитивов и объектов.
3.1. Примитивные типы
Давайте начнем с примитивных типов, поскольку они просты. Для примитивных типов все три метода getName (), getTypeName() и getCanonicalName() вернут тот же результат, что и getSimpleName() :
3.2. Типы объектов
В большинстве случаев это полное имя, которое содержит все простые имена пакетов классов, а также простое имя класса:
3.3. Внутренние классы
То, что мы видели в предыдущем разделе, – это общее поведение этих вызовов методов, но есть несколько исключений.
Внутренние классы-один из них. Методы getName() и getTypeName() ведут себя иначе, чем метод getCanonicalName() для внутренних классов.
Давайте представим себе внутренний класс InnerClass нашего RetrieveClassName :
Затем каждый вызов обозначает внутренний класс немного по-другому:
3.4. Анонимные классы
Анонимные классы-еще одно исключение.
Давайте проиллюстрируем это на примере. Мы создадим здесь два анонимных класса и вызовем getName() на первом и getTypeName() на втором, объявив их в com.baeldung.Главная :
Следует отметить, что второй вызов возвращает имя с увеличенным числом в конце, поскольку оно применяется ко второму анонимному классу.
3.5. Массивы
Наконец, давайте посмотрим, как массивы обрабатываются вышеперечисленными тремя методами.
Чтобы указать, что мы имеем дело с массивами, каждый метод обновит свой стандартный результат. Методы getTypeName() и getCanonicalName() добавят пары скобок к своему результату.
Давайте рассмотрим следующий пример, в котором мы вызываем getTypeName() и getCanonicalName() для двумерного внутреннего класса массива:
Обратите внимание, как первый вызов использует доллар вместо точки, чтобы отделить внутреннюю часть класса от остальной части имени.
4. Заключение
Мы узнали, что первый просто возвращает имя исходного кода класса, в то время как другие предоставляют дополнительную информацию, такую как имя пакета и указание на то, является ли класс внутренним или анонимным классом.
Классы. Объектно-ориентированное программирование
Классы и объекты
Java является объектно-ориентированным языком, поэтому такие понятия как «класс» и «объект» играют в нем ключевую роль. Любую программу на Java можно представить как набор взаимодействующих между собой объектов.
Класс определяется с помощью ключевого слова сlass :
Для хранения состояния объекта в классе применяются поля или переменные класса. Для определения поведения объекта в классе применяются методы. Например, класс Person, который представляет человека, мог бы иметь следующее определение:
Теперь используем данный класс. Для этого определим следующую программу:
Как правило, классы определяются в разных файлах. В данном случае для простоты мы определяем два класса в одном файле. Стоит отметить, что в этом случае только один класс может иметь модификатор public (в данном случае это класс Program), а сам файл кода должен называться по имени этого класса, то есть в данном случае файл должен называться Program.java.
Конструкторы
Если в классе не определено ни одного конструктора, то для этого класса автоматически создается конструктор без параметров.
Выше определенный класс Person не имеет никаких конструкторов. Поэтому для него автоматически создается конструктор по умолчанию, который мы можем использовать для создания объекта Person. В частности, создадим один объект:
В итоге мы увидим на консоли:
Если необходимо, чтобы при создании объекта производилась какая-то логика, например, чтобы поля класса получали какие-то определенные значения, то можно определить в классе свои конструкторы. Например:
Теперь в классе определено три коструктора, каждый из которых принимает различное количество параметров и устанавливает значения полей класса.
Консольный вывод программы:
Ключевое слово this
Ключевое слово this представляет ссылку на текущий экземпляр класса. Через это ключевое слово мы можем обращаться к переменным, методам объекта, а также вызывать его конструкторы. Например:
В третьем конструкторе параметры называются так же, как и поля класса. И чтобы разграничить поля и параметры, применяется ключевое слово this:
Так, в данном случае указываем, что значение параметра name присваивается полю name.
Кроме того, у нас три конструктора, которые выполняют идентичные действия: устанавливают поля name и age. Чтобы избежать повторов, с помощью this можно вызвать один из конструкторов класса и передать для его параметров необходимые значения:
В итоге результат программы будет тот же, что и в предыдущем примере.
Инициализаторы
Кроме конструктора начальную инициализацию объекта вполне можно было проводить с помощью инициализатора объекта. Инициализатор выполняется до любого конструктора. То есть в инициализатор мы можем поместить код, общий для всех конструкторов:
Class’ные Class’ы
Вводная
Немного деталей
Если Вы java-эксперт, примеры кода для Вас будут скучноватыми, а в остальном, как всегда. В свое время мне было очень интересно, что в java 7 снаружи и под капотом, как устроен формат файла class и прочее. Мне пришлось познакомиться вот с этими документами. От туда я подчеркнул почти все идеи для этой статьи. Тем не менее, я заранее прошу прощения за неточности в терминологии у фундаментальных теоретиков и опытных экспертов. На некторые вопросы я не буду давать ответы из-за их очевидности или легкого поиска ответа.
И так первый вопрос: ‘А какие бывают типы и виды классов в java 7?’ Большинство ответит правильно, но некоторые — неполностью. Очень часто забывают упомянуть про локальные классы.
Локальный класс
Я не нашел быстро хорошего определения локального класса на Русском языке, а с Английским проблемы, поэтому своими словами: ‘Локальный класс — это внутренний и вложенный именованный класс, не являющийся членом другого класса и объявление которого осуществляется внутри блока кода или метода’. Немного запутанно? На примере все просто:
Я просмотрел очень много кода за свою жизнь, но ни разу не встретил явных именованных деклараций класса внутри метода. Может просто не повезло. А Вы встречали? Но когда я решил собрать статистику по типам и видам классов, то обнаружил, что в rt.jar локальные классы присутствуют и более того, используются в таком небезызвестном классе как java.lang.Package. Век живи — век учись. Еще есть интересное утверждение: ‘Анонимный класс — это локальный класс без имени’. Для экспертов вопрос: ‘Так ли это?’
Класс аннотаций
Уже не осталось людей, которые бы ни разу не писали классы типа аннотации. И сразу маленький пример.
Но тем не менее, здесь есть чему удивиться. Как вы думаете, ниже представлен валидный код?
На самом деле ничего сложного нет. Но продолжим, а как Вам такой пример?
Ответы здесь все простые — это рабочие примеры кода, так как по факту, под капотом interface = interface, с небольшими оговорками, поэтому все, что можно писать в interface можно и в аннотациях (опять же с оговорками). Наследование в коде от класса типа аннотация я встречал в тестах. Про аннотации у меня все, но есть маленький пример аннотированного типа массива строк и формы его объявления:
Надеюсь я Вас не утомил. Но если это не так, тогда следующий абзац специально для Вас.
Обычный класс
Очень сложно удивить кого-либо информацией об обычном классе (исключая примеры с дженериками). Как я ни старался, найти что-то значимое не смог. Но есть у меня одна история-анекдот.
Однажды разработчику потребовалось написать утилитный класс для решения поставленной задачи. Вроде все сделал правильно, написал java-doc, тесты. Отправил патч на ревью.
Начальник-Михалыч посмотрел патч и сказал — ‘Все ок, но давай сделаем защиту от дурака — добавь приватный конструктор’. Как это водится, разработчику патч переделывать не хочется, а поверх нельзя, поэтому превозмогая себя и, переходя определенную грань субординации, разраб спросил: ‘А что у нас в компании, Михалыч, дураки работают или ты кого-то конкретно имеешь в виду?’. Но делать нечего, нужно переделывать, причем все просто — добавить приватный конструктор:
‘Готово’ — крикнул разраб, ‘Молодец’ — ответил Михалыч. Хотел он было нажать submit, как раздался звонок. В этот самый момент, начальник департамента, освободившись от важных дел решил тряхнуть стариной и ткнул в первый попавшийся патч для ревью. ‘О-о-о!’ — заверещал он. ‘Михалыч, Вы что код разучились писать? А где защита от деб*ла?’. Начальник департамента человек серьезный, поэтому Михалыч про себя: ‘Что у нас в компании, деб*лы работают или ты кого-то конкретно имеешь в виду?’. Угрюмый Михалыч заворачивает патч с пометкой добавить abstract к классу. Нижняя губа разраба затряслась.Шо опять?
По иронии судьбы в этот день в отдел пришел стажер и, получив свое первое задание, кинулся в бой. Его взгляд остановился на Utils, и на лице появились и восхищение и недоумение. Набравшись смелости, он громко задал свой первый искрометный вопрос: ‘Парни, а как можно наследоваться от класса, с приватным конструктором?’
Класс перечислений
Кого сейчас ими удивишь? Вот если бы лет 10 назад. Поэтому здесь немного вопросов по пониманию кода. Как вы думаете, есть ли разница в декларации следующих элементов перечисления и если есть, то почему?
Если вы знаете правильный ответ то следующий вопрос Вам покажется легким: ‘Что будет на консоле?’
Конечно, здесь все на поверхности — E3.SIMPLE и E4.SIMPLE это экземпляры анонимного класса этих енумов. Поэтому последние 2 вызова дадут false результат. Будьте внимательны, когда используете проверку на enum класс через isEnum().
Внутренний класс
Про внутренние классы информации очень много, как, что и с чем их едят. Но многие, кого я собеседовал не могли ответить на 2 вопроса. Прежде обратимся к примеру:
И первый вопрос: ‘Как получить доступ к полю myField класса InnerClassExample в конструкторе класса InnerInnerClass и возможно ли это?’ Второй вопрос: ‘Как создать экземпляр класса InnerInnerClass в методе main класса InnerClassCreate?
Классы в 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 8
Обычно перед разделом с описанием классов в учебниках пишут целую главу, которая рассказывает об ООП в общих чертах, абстрагируясь от какого-либо конкретного языка программирования. Возможно, мне тоже нужно написать что-нибудь такое, но на данном этапе я делать этого не буду, хотя подобная глава пригодилась бы и для учебника Javascript. Подразумевается, что вы уже знаете об ООП из какого-либо другого языка программирования.
Содержание
Объявление классов
Внутри фигурных скобок объявляются все поля, конструкторы и методы класса.
Объявление полей
Пример объявления полей:
В этом примере мы объявили четыре поля:
Модификатор доступа, static и final могут располагаться в любом порядке, но согласно соглашению о кодировании принят именно такой порядок, который описан в статье.
Поле health объявлено без модификаторов доступа, и для него будет использоваться уровень доступа package-private (поле будет доступно только внутри своего пакета).
Модификатор | Класс | Пакет | Дочерний класс | Все классы |
---|---|---|---|---|
public | Есть | Есть | Есть | Есть |
protected | Есть | Есть | Есть | Нет |
без модификатора | Есть | Есть | Нет | Нет |
private | Есть | Нет | Нет | Нет |
Имя поля следует давать в соответствии с соглашениями.
Обращаться к полю внутри класса, которому оно принадлежит можно просто по имени поля: