@EmmGold

Создание экземпляра класса эквивалентен созданию переменной?

Допустим. Есть некий класс, хочу создать экземпляр этого класса. Пишу

man superman = new man();

Ведь по сути, я создаю ссылку на вновь созданную переменную(структуру(класс)).
Получается что-то типа

int x = new int(); Выглядит немного оригинально...

Почему я не могу просто написать "man superman;" ? Итак понятно, что создаётся новый экземпляр класса man.

Или у этой записи "man superman = new man();" есть некие интересные особенности, которые я пока не понимаю? Может гуру Java подскажут как ещё можно использовать описание класса и создавать экземпляры класса.
  • Вопрос задан
  • 1163 просмотра
Решения вопроса 2
Konstantin18ko
@Konstantin18ko
Стоматолог
Смотрите:
У Вас есть две фигурки супер мена.
man superman1 = new man();
man superman2 = new man();
Переменная superman1 ссылается на первую фигурку, superman2 - на вторую фигурку.

man superman3 = superman1;

Теперь, у нас есть третья переменная, которая ссылается на первую фигурку.
Итого: 3 переменных, 2 объекта.

Почему же мы пишем int x = 0; а не int x = new int(0);
Потому что int - это целочисленная цифра и ей нельзя передать какие либо свойства/аргументы. Единица, это единица, два это два.
man superman1 = new man(быстро бегать, неуязвимый);
man superman2 = new man(далеко прыгать, бессмертный);

int x = new int(0); все, у типа int закончились супер способности, только число и все.
String str = new String("String"); всего лишь строка, больше ничего нет.
Ответ написан
Комментировать
pi314
@pi314
Президент Солнечной системы и окрестностей
Короче, в дополнение к уже имеющимся ответам и для их систематизации... Начнем с простых вещей.

Есть принципиальная разница между объявлением переменной и присвоением ей значения. Для примитивных типов это не должно вызывать затруднений
int x; // <---- declaration *
...
x = 15; // <----- assignment
...
int y = 25; // <------- declaration, then assignment

* - тот факт, что в этом месте после объявления в переменной в большинстве имплементаций Явы будет значение 0, оставим на потом, и разберемся, в чем конкретно разница. Объявление приводит к тому, что где-то в памяти резервируется место, которое потом может быть (но может и не быть!) заполнено значением соответствующей длины (типа). Быть или не быть, полностью зависит от дальнейшей программы. А присвоение приводит к тому, что некое значение помещается в ранее объявленную переменную.
(В этом суть! Всё остальное, включая неявное объявление переменных, анонимные классы, оптимизации компилятора и т.д. - сахар, для удобства и компактности/читаемости кода.)

Далее. Откуда берется значение, которое присваивается переменной? Оно либо уже известно в момент компиляции кода (константа/литерал, как, например, 15 или 25 выше), или станет известно во время его выполнения. Второе имеет место быть в случае, когда тип переменной - ссылка на объект (экземпляр класса). В момент компиляции никакого экземпляра еще нет. Чтоб он возник (и стала известна ссылка на него, которую туда можно поместить), нужно еще выполнить много разных действий, первое из которых - попытаться выделить под него память (что, кстати говоря, может и не получиться, если ее по какой-либо причине в этот момент нет). Именно это и делает new - выделяет память под экземпляр класса, создает его, выполняет статическую инициализацию, вызывает подходящий конструктор (он может быть перегружен или наследоваться), и только если все прошло успешно - присваивает переменной ссылку на свеженький экземпляр.

Этого, конечно, можно и не делать, а написать просто
Man superman;
и это будет означать именно то, что написано: под переменную (типа "ссылка на экземпляр класса Man") будет выделено место, но никакого экземпляра не возникнет, а сама переменная будет содержать значение null (т.е. ссылка "в никуда", типа как 0 для int). Однако, такой код тоже может иметь смысл, если, например, экземпляр будет создан позже или же переменной позже будет присвоено значение другой переменной, содержащей на тот момент ссылку на экземпляр подходящего типа.

Ну и, наконец, отличить примитивный тип от объекта в Java очень просто :) По договоренности названия примитивных типов начинаются с маленькой буквы, а названия классов - с большой.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@FoxInSox
Почему я не могу просто написать "man superman;" ?


Потому что есть примерно миллион случаев когда необходимо объявить переменную, но не создавать экземпляр.
Ответ написан
@tasce
Такой синтаксис, а сахара для него не придумали. Остаётся либо смириться, либо придумать Java препроцессор для сахара. Ваш пример с "man superman;" больше похож на сахар.
Ответ написан
Насколько я понимаю вы новичок в Java.
Советую изучить вот эту статью для начала.
И вообще, лучше осилить 4 главы из этой книги(можно легко найти в сети).С ходу объяснить невозможно.
В Java Object object;- это всего-лишь ссылка.Вы просто декларируете переменную.Чтобы присвоить ей объект в Куче(специальная структура данных, в которой хранятся все объекты JVM), мы используем object = new Object();
Такой подход позволяет динамически менять объекты, использовать полиморфизм, отложенную инициализацию и т.д.

P.s
int x = new int(); написать нельзя, потому что int - это примитивный тип.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы