Объекты в java занимают очень важную нишу. Вникнув в работу объектов, изучив все их тонкости – это огромный шаг в изучении языка программирования. В рамках одной статьи полностью охватить данный материал проблематично, поэтому решил посвятить object-ам еще одну статейку.
Что у нас будет в статье.
1. Объекты и примитивные типы
2. static для объектов
3. Как ведут себя объекты
4. Объекты и Злостный Мусорщик
Еще раз повторюсь, в java все построено на объектах или почти все...Вот к этому «почти» и относятся примитивные типы, которые представлены не как объекты, такие как int, boolean, char, double и др. Все это сделано для того, чтобы повысить производительность вычислений для таких простых операций, ведь для представления объектов требуется значительные системные ресурсы. Однако и для примитивных типов есть возможность создания объектов. Ну, например, для int есть Int, для double – Double. Хм, сейчас подумал о String, а ведь для него нет примитивного типа. Возможно это связано с тем, что строка (String) занимает все-таки приличные объемы. Можно переводить примитивные типы в объекты и наоборот, для этого существует такое понятие как автоупаковка и автораспаковка (оставляйте комменты, если хотите, чтобы в следующих статьях мы рассмотрели автоупаковка и автораспаковка).
При изучении объектов в java, я всегда пытался противопоставить им что-то из реальной жизни, чтобы в полной мере осмыслить их работу. В одной литературе мне очень понравилось сравнение объекта с телевизором, а его ссылки – с пультом от телевизора. Как мы знаем, что примитивными типами мы оперируем непосредственно ими самими, а с объектами – их ссылками. Так вот, справедливо что, если мы перейдем в другую часть комнаты, мы возьмем с собою только пульт, а не сам телевизор, чтобы управлять его работой: переключение программ, увеличение громкости и яркости. Мне кажется, что сравнение очень удачное, чем объекты -«строители».
static для объектов. Нам очень часто в программах попадается загадочное слово static, которое имеет разное назначение для полей класса, самого класса и методов. Вначале разберем для полей класса. Объявление переменной как int a говорит о том, что у каждого созданного объекта будет своя переменная «а». Тогда как объявление переменной static int a будет говорить нам о том, что переменная принадлежит классу, и вновь созданные объекты от этого класса будут использовать только эту переменную в ЕДИНСТВЕННОМ экземпляре. Рассмотрим это в программе:
Когда static встречается в названии метода, это будет означать, что данный метод может вызываться без построения объекта. Справедливо для метода main, который вызывается первым в программе и до построения всех объектов. Здесь следует отметить то, что вызывать статический метод и переменную можно как через объект, так и через класс (класс.название_метода, класс.название_переменной). Но все же делать лучше это по второму способу. Смотрим:
А если ключевое слово «static» встречается перед классом, например, public static ClasStatic. Это говорит нам о том, что построить объект данного класса - невозможно.
Теперь, на мой взгляд, самое интересное: как себя ведут объекты. Давайте сравним два примитивных типа и два объекта. Если с первыми все понятно – они равны, то сравнение двух объектов с одинаковым значением выдаст нам « false». Как так? Дело в том, что мы сравниваем разные ссылки, хотя они ведут к двум объектам одного типа. И только поэтому, несмотря на значения, в частности с Integer, эти объекты не равны между собою. Но стоит нам присвоить ссылку m1 ссылке m, и результат опять нас удивит. Смотрим:
Следующий момент - это присваивание примитивных типов и ссылок на объекты. С примитивными типами также все понятно, значение из одной переменной копируется в другую:
int a= 8;
int b=7;
a=b; //здесь само число «7» копируется в переменную «a» и будет a=7
Если мы дальше изменим переменную «a»:
a=2;
то переменная «b» не измениться, она останется:
b=7;
Все логично и понятно. Но как только мы начнем манипулировать объектными ссылками, ситуация меняется в корне. Не забываем, что мы присваиваем не сами объекты, а их ссылки (это важно!) Лучше все это смотреть в коде:
Объекты и Злостный Мусорщик. Для нас уже не секрет, что объекты требуют значительных ресурсов и то, что объекты создаются динамически, т. е. во время выполнения программы. А это значит, что за их созданием и уничтожением нужно постоянно следить. Вернемся к последней иллюстрации, где мы присваивали ссылки, что в итоге привело к ее потере на некоторый объект, вследствие чего такой объект стал не «при делах». Теперь представьте сколько таких объектов «не при делах» могут находиться в программе, а это дополнительная память. В некоторых языках программирования за созданием и уничтожением объектов нужно постоянно следить. В java это решается комфортно для программиста, которому не нужно думать о жизнедеятельности объектов. Все объекты, утратившие ссылки будут ликвидированы сборщиком мусора или, как я его называю, Злостным Мусорщиком. Так что нам заморачиваться по этому поводу в java не стоит, и даже в том, как работает сборщик мусора. Но теперь мы точно понимаем, что означает фраза «//Ss2 потеряна и объект ждет Злостного Мусорщика».
Ставьте лайки, подписывайтесь на канал и вас ждет масса увлекательных статей по java.
по теме:
Объекты, субъекты и конструкторы
Моя телега, где буду выкладывать полезные штучки по java, а также анонс моих статей.