В лекциях Javarush написано, что и экземпляр класса - объект, и сам класс (шаблон), по которому делается экземпляр класса - тоже объект, и вообще что в Java все является объектом. Напишите, пожалуйста, свое видение, что же все-таки объект в Java?
"...в Java все является объектом, даже класс" (из лекции)
Комментарии (22)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
7 февраля 2023, 11:05
0
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
7 февраля 2023, 10:54
Спасибо за ваше видение)
С объектом как экземпляром класса все понятно было. Тут было немного неясно о том, что с точки зрения ООП класс тоже объект в Java, такой же как и сам объект этого класса, но благодаря Гоффу уже разобрался с этим
0
Денис Enterprise Java Developer
7 февраля 2023, 13:45
Самое забавное в этом всем то, что примитивы как таковые тоже являются объектами... Что для меня стало открытием если честно:
The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
Находятся люди которые говорят что мол Java не чистый ООП язык, потому как тут есть примитивы... а оказывается не вполне они и правы.
0
it
7 февраля 2023, 13:53
Денис, а почему стоит считать примитивные типы объектами?
0
Денис Enterprise Java Developer
7 февраля 2023, 13:58
Потому что так написано в документации, или этого не достаточно?)
0
it
7 февраля 2023, 15:30
ну нет не достаточно))
не в том плане что я спорю,
а в том что если например на собесе спросят, что мол стоит ли считать
примитивные типы объектами?
то мне же не говорить им что - ну потому что в документации так..)
нет же такого класса как void например..
и не могу создать объект того же int через new
почему многие тогда говорят что примитивы не являются объектами...
просто хочу разобраться в теме)
0
Павел
8 февраля 2023, 06:31
Документация это не догма
Например в документации написано что String это объект, однако на собесах можно порассуждать на эту тему. Но прямо сейчас не хотел бы пускаться в этот холивар)
На счет примитивов тоже не однозначно написано в документации: "также представлены как объекты класса" (also represented as Class objects), то есть не написано прямо что это объект, а использовано слово представлены (represented).
Документация как в библия, можно толковать по разному)
+1
Денис Enterprise Java Developer
8 февраля 2023, 10:06
UK:
К сожалению мой уровень познаний в Java не на столько высок :) но подозреваю, что под капотом у всех примитивов есть своё представление, в виде класса Class, им же система и оперирует. Тебе как конечному пользователю с этого разницы никакой. Но что бы посмотреть детально есть ли различия нужно лезть уже под капот сильно (возможно даже в байткод) и почитать как JVM вообще работает. Не из праздного любопытства делать такие упражнения :)
Павел:
Например в документации написано что String это объект,
Стесняюсь спросить, если не объект то что же?)
0
it
8 февраля 2023, 10:46
Понял)
спасибо за ответ)
0
Павел
8 февраля 2023, 15:39
Объект на счет которого можно порассуждать что он массив примитивов или обертка над примитивами, это уже куда рассуждения вынесут
0
Денис Enterprise Java Developer
8 февраля 2023, 19:00
DTO с примитивами это объект или нет?)
0
Павел
9 февраля 2023, 06:01
String это не дто
0
Денис Enterprise Java Developer
9 февраля 2023, 08:51
Понял, вопрос снят :)
0
Сергеев ВикторMaster
9 февраля 2023, 15:48
на самом деле отличие простое, просто терминология странная.
Примитив в переменной хранит свое значние.
Объект в переменной хранит адрес памяти куда положили объект.
Примтив имеет определенный размер в байтах, объект нет.
стоит ли считать примитивные типы объектами?
В контексте java однозначно нет, у них разное поведение.
На самом деле деление идет не на объект и примитив, а на ссылочный тип и примитивный тип
https://docs.oracle.com/javase/specs/jls/se9/html/jls-4.html
и различаются они однозначно. Ссылочные хранят ссылку на объект, примитивные хранят значение.
Если брать отличия примитивных значений и самих объектов. То тут тоже есть однозначеные отличия. Примитив не может быть null потому что он фактически является значение и установка всех битов в 0, значит значение 0 а не null.
Для объекта допустимо ссылаться на null
+5
it
9 февраля 2023, 18:00
А то есть тут если обсуждать эту тему, то правильно было бы говорить о
примитивных и ссылочных типах данных, а обозначение объект это как нечто абстрактное..
Как например в вопросе что хранят переменные - значения или ссылки,
и обычным ответом должно быть значение, просто ссылочные типы данных хранят значение в виде ссылки на данные в памяти, а примитивные типы данных не имеют ссылки, а содержат в себе данные? так ведь.. насчет примитивных звучит уже странно, чет я запутался..
0
Justinian Judge в Mega City One Master
15 февраля 2023, 02:30
документация не догма, догма это спецификация, но здесь вообще не вижу честно говоря каких-то проблем и альтернативных толкований.
Есть у нас класс Student
и есть метод void feed(Student student) {
и есть метод void hack(Class<Student> clazz) {
это же разные вещи.
То что Денис цитирует, ну да, "The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects"
то есть примитивы могут иметь свое отображение как объекты ТИПА CLASS, не объект примитива.
А объект типа Class.
Поэтому противоречий вообще не вижу, речь просто про специальную конструкцию которая отображает некий класс, просто к обычным классам, абстрактным классам и интерфейсам добавили еще примитивы и void, чтобы можно было работать с типами данных.
Но тип данных это не объект, это абстракция и семантический конструкт.
А вот объектом документация и спецификация называет именно экземпляры Class, которые содержит информацию о типе.
Поэтому все ок,
"Petya" is String object, строковый литерал Петя это объект типа Стринг.
int has representation as Class object - есть такой объект типа Класс, который описывает примитивный тип. Ну описывает и на здоровье.
+3
Justinian Judge в Mega City One Master
15 февраля 2023, 02:44
переменные хранят в себе значения.
Переменные ссылочного типа хранят в себе значение, которое является ссылкой на объект в памяти.
Переменные примитивного типа хранят в себе значение, которое и является значением этого примитива.
Грубо говоря, память можно представить так:
String s = "Petya";
Student student = new Student("Maria");
int age = 10;
boolean isHungry = true;
и в памяти это грубо говоря выглядит так:
имя переменной | тип | значение
----------------------------------------------------------------------------------------------------------------------
s | String | a4506fd (фактически это просто единички и нолики, обозначающее целое число, просто для удобства оно записывается в шестнадцатеричном виде, это номер ячейки в памяти с которой начинается объект)
----------------------------------------------------------------------------------------------------------------------
student | Student | b5fe30
----------------------------------------------------------------------------------------------------------------------
age | int | 10
----------------------------------------------------------------------------------------------------------------------
isHungry | boolean | 1
HEAP (область памяти, где расположены объекты)
..
a4506fd номер ячейки начало объекта Петя
внутри массив "Петя"
...
...
b5fe30 номер ячейки, в которой начинается объект студент Мария
String name = ссылка на строку "Мария"
поля и тд
...
Это схематично и грубо, но сам принцип, как видишь, все переменные содержат значения.
Просто если это примитив, то в значении собственно значения будут - числа целые или с плавающей запятой, булеан тип.
А если это ссылочные типы, то они ссылочными называются поскольку содержат ЧИСЛО, которое обозначает ячейку в памяти где начало объекта, или проще адрес объекта.
+2
Justinian Judge в Mega City One Master
15 февраля 2023, 02:47
примитивы отдельно выделили поскольку удобно хранить прям здесь и сейчас прямо в переменной дискретные значения простых типов - число, true / false
А вот содержимое объектов в ссылке уже не то что неудобно, но технически и невозможно хранить, ведь ссылка как пульт от телевизора.
Объект (телевизор может быть один) а пультов много.
Бессмысленно делать так, чтобы в каждый пульт от телевизора был встроен телевизор, зачем тогда пульт..
Пока так, будут вопрос задавай ребятам, пока не прояснится, но сильно глубоко не копай, чтобы не запутаться, главное схематично понять, потом все устаканится само, важно чувствовать точку, после которой любая инфа сверху не разъясняет, а добивает ))
+2
it
15 февраля 2023, 08:23
Понял, спасибо за ответы ))
+1
it
7 февраля 2023, 07:49
Ну не все, а как же примитивные типы?))
В лекциях про это говорилось, что как бы Все, но как бы и Не все =)
По крайней мере я встречал это где то)
Объект - конкретный представитель класса, имеющий свои характеристики и функции которые описаны в классе, где класс выступает как определенный чертеж, или скажем набор общих характеристик и свойств объекта..
Например есть класс "Животное" - у него есть свои свойства,
и набор функций присущих животному:
- кушать
- передвигаться
- спать
- думать и т.п.
И отдельный представитель класса, а значит определенный объект(сущность) - это например "волк", где волк имеет свойства описанные в классе, имеется ввиду не только те методы которые
волк может себе переопределить как и любой другой объект, как например - кушать, но и иметь свои собственные черты и функции.
То есть в итоге мы можем создать класс Животное и создать его объект new Животное и оперировать тем функционалом который есть, но можем пойти дальше,
создать класс например волк, или лисичечька,
то есть чертежи будущих объектов и потом,
создать такие объекты new Волк, new Лисичечька...
Соответственно придется унаследоваться от класса Животное, тут конечное есть фишка в том что в java нет множественного наследования, скорей множественная реализация в виде использования интерфейсов, но не суть, так вот о Животном, где можно унаследоваться и уже иметь список шаблонных функций Животного которые в классе Волк сможем применять, но в принципе можно и не наследоваться, но тогда придется писать опять методы по новому, такие как - есть, - спать и т.п.
Тут про многое можно рассуждать и долго)))
0
СОБЕРЕМ ОСТАТКИ ВОЛИ И ВЫЙДЕМ НА НОВЫЙ УРОВЕНЬ!Expert
7 февраля 2023, 06:50
Спасибо, уже немного разобрался в теме
0
Павел
7 февраля 2023, 06:45
В лекции все правильно написано
Класс и объект это разные понятия
Не все в Java является объектом
В чем вопрос? Что с объектами не понятно?
0