Как узнать тип объекта java
Как узнать тип объекта разными способами в Java?
Нашел тут 3 способа http://exampledepot.com/egs/java.lang/GetClass.html?l=rel.
Может кто еще что-нибудь подскажет!
| | От: | rsn81 | http://rsn81.wordpress.com |
| Дата: | 13.04.08 06:16 | ||
| Оценка: | +2 | ||
Здравствуйте, rsn81, Вы писали:
R>А зачем, метода getClass кажется несколько маловато?
Ага маловато.
Может можно как-нибуть еще это сделать?
| | От: | Mr.Cat |
| Дата: | 13.04.08 09:50 | |
| Оценка: |
Здравствуйте, electromouse, Вы писали:
E>Ага маловато.
E>Может можно как-нибуть еще это сделать?
| | От: | electromouse |
| Дата: | 13.04.08 11:04 | |
| Оценка: |
Здравствуйте, Mr.Cat, Вы писали:
MC>Зачем?
Java — богатый ЯП, в нем много всего, мне интересно как решить эту задачу.
Прошу больше таких вопросов не задавать, я высказываться по сущетсву.
Можно еще использовать instanceof, чтобы проверить принадлежность ссылки на объект: interface или superclass.
| | От: | Аноним |
| Дата: | 13.04.08 12:31 | |
| Оценка: | +1 | |
Здравствуйте, electromouse, Вы писали:
E>Java — богатый ЯП, в нем много всего, мне интересно как решить эту задачу.
Неправда. Java — бедный язык, в нём есть всего лишь один способ узнать класс объекта — метод Object.getClass().
По приведённой вами ссылки перечислены способы, которыми можно получить объект класса java.lang.Class.
| | От: | electromouse |
| Дата: | 13.04.08 19:56 | |
| Оценка: |
Здравствуйте, rsn81, Вы писали:
R>Электрический мышонок прав: с помощью бесконечного числа проверок if (или full scan загруженных классов) с instanceof можно написать свой статический метод getClass.
Бу га га.
Все спасибо за советы, вопрос снят.
оффтоп.
rsn81 не пойму, зачем у тебя пароль на резюме(шучу)?
Как получить полный тип объекта
Я хочу получить тип этого объекта в таком виде
Каким образом можно получить тип оъекта в нужном для меня формате
Вот такой вариант кода у меня не сработал.
4 ответа 4
Если это поле конкретного класса, то вот так:
Если list не пустой, то задачу можно решить с помощью получения типа одного из объектов list :
UPD. Более общий случай (список может быть пустым):
Насколько я помню, в джаве генерики существуют только при компиляции, а в байт-коде их нет, поэтому получить в рантайме тип с генерик-параметром скорее всего не удастся.
PS: Если ошибаюсь, напишите комментарий, удалю ответ.
Самое большое, что можно сделать, это определить тип для массива. Для них, почему то, стирания не происходит.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками java рефлексия или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.9.10.40187
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Познаём Java. Третья чашка: примитивные типы, и объекты. Базовые конструкции
Типа реальные типы
Думаю, после краткого экскурса в возможности Java и прочитывания пары десятков строк кода примеров, вам захотелось узнать, чем должен уметь оперировать каждый Java-программист. Что ж, давайте поговорим о примитивных типах, классах (в том числе нескольких основных), сравнении, передаче параметров и простых структурах в Java.
Базовые типы
вы получите именно 200, а не что-то ещё — переменные будут автоматически приведены к нужному типу.
Есть несколько способов задавать значение целочисленным переменным, например:
Эти типы называются базовыми или примитивными, они не могут быть унаследованы, да и вообще не являются объектами в Java. Никакой информации о сущности такого типа кроме его значения мы получить не можем. Да и не надо, в общем-то.
Операции с базовыми типами
Сравнение
Почему нельзя писать == для объектов
Это чудо вернёт вам 3 раза false. Потому что мы явно указали создание новых объектов с одним значением, и сравнение по ссылке вернуло false.
А в первых двух случаях произошло развёртывание, так как операция сравнения определена только для примитивных типов.
Мораль: == только для примитивных типов.
«Кстати, строки»
Здесь, как вы видите приведены 2 способа инициализации, второй при этом хоть и избыточен, но гарантирует что ваша строка будет «новой».
Строго говоря, любая конструкция в Java в двойных кавычках — уже новая строка, созданная и закешированная (см. ниже).
Кроме того, для строк есть операция соединения (конкатенации):
String r = «Привет » + «мир»;
Конструкторы, ссылки и значения: куда что идёт, и куда оно уходит.
Когда вы создаёте новый объект, вы начинаете его жизненный цикл.
Начинается он с вызванного вами конструктора. Да? Нет.
При первом упоминании класса вызываются по порядку все его статик-блоки вида static <. >лежащие в классе.
Статик-блоки родителей вызываются по мере их упоминания.
Затем вызываются по порядку все блоки вида <. >верхнего родителя.
Далее — вызывается конструктор этого же родителя.
Затем последние 2 шага повторяются для каждого класса иерархии.
В последнюю очередь вызываются <>-блоки и конструктор вашего класса.
Далее — ваш объект живёт до тех пор, пока на него есть ссылки.
Как только ссылки на объект теряются — он подхватывается сборщиком мусора и уничтожается. Никаких a = null чтобы «стереть ссылку» писать не нужно — java и так знает, когда вы перестали использовать объект.
Перед уничтожением вызывается метод finalize вашего милого объекта.
Кстати, иногда встречается такая ошибка: человеку в метод передают некий объект, а он присваивает ему null, думая, что таким образом он объект сотрёт из всех ссылок. Нет, этого не будет, будет уничтожена только это ссылка. Однако, если ссылка была всего одна — разумеется, в этом случае объекту придёт конец.
Как выбираются конструкторы.
В предыдущем параграфе были упомянуты конструкторы. Их у класса может быть много, у каждого — свои параметры.
По умолчанию, если вы ручками не написали ни одного, то будет создан пустой конструктор без парамертов.
Каждый из них обязан вызывать конструктор класса-родителя.
Чтобы это сделать, вы должны дописать первой строкой в конструктор super-вызов:
public HelloWorld() <
super();
>
super-конструктор — это конструктор родителя. Вы можете использовать любой, из тех что у него есть.
На самом деле, если вы его не напишете — за вас это сделает компилятор. А что будет если у класса-родителя нет конструктора без параметров?
В этом случае вы должны явно вызывать super-конструктор всегда, и передавать ему параметры как для конструктора класса-родителя.
Что у вас там про кеширование?
Я упоминал кеширование объектов. Немного поясню. Дело в том, что упоминание чисел/строк — рутина, которая сваливается на нас постоянно. Чтобы не хранить в памяти тысячу интеджеров с 1 в качестве значения был сделан механизм кеширования. Он гарантирует вам, что на каждую вашу еденичку или строку будет создан ровно один объект в памяти, а при автоматическом развёртывании он и будет использован. Шутка в том, что разработчики платформы ограничили количество кешируемых чисел пределами, упомянутыми выше.
«Кстати, строки», часть 2 — будьте аккуратны.
Надеюсь, смог дать понять, как работать с простыми объектами. На этом мог бы и закончить про них, но вспомнил про массивы.
Массивы
Из приятных бонусов, массивы имеют поле length, то есть длину массива вы знаете всегда и она фиксирована.
Базовые конструкции Java
if(любое boolean-выражение или переменная)<>else<>
for(действия до начала цикла; условие продолжения цикла; действие после каждого шага)<>
while(условие продолжения цикла)<>
do<>while(условие продолжения цикла)
switch(переменная числового или enum)
for(Тип имяПеременной: массив)<>
На последнем хотел бы остановиться подробнее. В Java так выглядит цикл for-each. Он перебирает каждый элемент массива, например так:
Кроме того, for-each применим для любой коллекции, и не только для них. Об этом расскажу потом.
Java Core для самых маленьких. Часть 2. Типы данных
Вступление
В этой статье мы не будем использовать ранее установленную IDE и JDK. Однако не беспокойтесь, ваш труд не был напрасным. Уже в следующей статье мы будем изучать переменные в Java и активно кодить в IDEA. Эта же статья является обязательным этапом. И в начале вашего обучения, вы, возможно, будете не раз к ней возвращаться.
Что для нас означает строгая типизация? Это значит, что все данные и каждое выражение имеет конкретный тип, который строго определен. А также то, что все операции по передаче данных будут проверяться на соответствие типов. Поэтому давайте поскорее узнаем какие типы данных представлены в Java!
Примитивы
В языке Java существует 8, оскорбленных сообществом, примитивных типов данных. Их также называют простыми. И вот какие они бывают:
В дальнейшем, комбинируя эти самые примитивы, мы сможем получать более сложные структуры. Но об этом нам еще рано беспокоиться. Сейчас же рассмотрим каждый из примитивов подробнее.
Тип byte
Тип short
Тип int
Тип long
Используются при точных вычислениях, которые требуют результата с точностью до определенного знака после десятичной точки (вычисление квадратного корня, функции синуса или косинуса и прочего).
Тип float
32-разрядный тип данных с плавающей точкой. Требует в два раза меньше памяти и в некоторых процессорах выполняется быстрее, по сравнению с double. Но если значения слишком велики или слишком малы, то не обеспечивает требуемую точность вычислений. Используется когда нужно число с дробной частью, но без особой точности.
Тип double
На хранение требуется 64 бита. Рационально пользоваться double, когда нужно сохранить точность многократно повторяющихся вычислений или манипулировать большими числами.
Тип char
16-разрядный тип данных в диапазоне от 0 до 2^16. Хранит значения от 0 до 65536. Этот тип может хранить в себе полный набор международных символов на всех известных языках мира (кодировка Unicode). То есть, по сути, каждый символ представляет из себя какое-то число. А тип данных char позволяет понять, что это число является символом.
Тип boolean
Может принимать только 2 значения true или false. Употребляется в условных выражениях. К примеру 1 > 10 вернет false, а 1
Объекты, классы и типы в 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:








