Создание объектов

Открыта
Создание объектов - 1

— Это снова твоя любимая учительница. Раз у нас так быстро пошли дела, решила рассказать тебе, что такое объекты, и как с ними работать.

— Чтобы создать какой-нибудь объект, нужно написать имя типа (класс) этого объекта и ключевое слово new перед ним. Допустим, у нас есть класс «кот» – Cat, тогда:

Код Описание
Cat cat;
Объявляет ссылочную переменную с именем cat и типом Cat. Значение переменной cat – ссылка null.
new Cat();
Создаёт объект типа Cat.
Cat cat = new Cat();
Создаёт ссылочную переменную cat типа Cat.
Создаёт новый объект типа Cat. Присваивает в переменную cat ссылку на новосозданный объект.
Cat murzik = new Cat();
Cat vaska = new Cat();
Создаются два объекта, ссылки на которые присваиваются двум разным переменным соответственно.
Cat murzik = new Cat();
Cat vaska = new Cat();

vaska = murzik;
Создаются два объекта, ссылки на которые присваиваются двум разным переменным.

Затем, переменной vaska присваивается ссылка на объект, содержащийся в переменной murzik. Теперь обе переменных ссылаются на первый созданный объект.
(На второй больше никто не ссылается – второй объект считается мусором)

Cat murzik = new Cat();
Cat vaska = null;

vaska = murzik;

murzik = null;
Создаётся один объект типа Cat, ссылка на который заносится в первую переменную (murzik), вторая переменная (vaska) содержит пустую (нулевую) ссылку.

Обе переменных ссылаются на один объект.

Теперь только vaska ссылается на объект, но не murzik.

2
Задача
Java Syntax,  2 уровень,  3 лекция
Недоступна
Набираем код
Внимание! Объявляется набор кода на JavaRush. Включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — вовсе не бесполезное занятие, как может показаться на первый взгляд: благодаря ему новичок привыкает к синтаксису и запоминает его (современные IDE редко дают ему это сделать).

— А что будет, если просто создать объект и не присваивать его [ссылку] никакой переменной?

— Если просто создать объект и не присвоить его никакой переменной, то Java-машина создаст его и тут же объявит его мусором (неиспользуемым объектом). А через некоторое время удалит его в процессе «сборки мусора».

— А как мне уничтожить объект, если он мне больше не нужен?

— Никак. Как только не останется ни одной переменной, хранящей ссылки на данный объект, он будет помечен как мусор и убран: уничтожен Java-машиной при следующей «сборке мусора».

Пока есть хоть одна ссылка на объект, он считается живым и уничтожаться не будет. Если хочешь побыстрее уничтожить объект – обнули все ссылки на него: присвой всем переменным, ссылающимся на него, значение null.

— Понятно. Вроде и не сложно совсем после предыдущих уроков.

— Диего вчера сидел всю ночь и придумывал для тебя интересные задачи. Специально для тебя старался. У него отличное чувство юмора, кстати:

1
Задача
Java Syntax,  2 уровень,  3 лекция
Недоступна
Одного кота нам мало
Как известно, быстро только кошки родятся (если что, это пословица такая, а не домысел). Хотя и объекты создавать тоже можно быстро. Открываем маленькое общество любителей котиков: создадим два объекта типа Cat, и присвоим им имена. Помните, каждый кот — индивидуален, так что имена у них должны быть разные.
1
Задача
Java Syntax,  2 уровень,  3 лекция
Недоступна
Макс, Белла и Джек
Если вы откроете эту задачку, то обнаружите в ней уже созданный класс Dog, то есть «собака». Нам предстоит создать нескольких собак. Мы уже продумали их историю, знаем, как они выглядят и на какие клички откликаются… Но в контексте задачи нас интересует вот что: создайте три объекта типа Dog, а затем присвойте им имена “Max”, “Bella” и “Jack”.
1
Задача
Java Syntax,  2 уровень,  3 лекция
Недоступна
Необъективная реальность
Плохому танцору мешают ноги, а иному программисту мешает язык программирования. Городская легенда, распространённая среди молодых программистов, гласит: «Будешь плохо кодить, придет Java и съест твою память». Предлагаем вам вывести текст этой легенды в консоль. И не забывайте беречь память! Она не бесконечна.
Комментарии (366)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
artem2 уровень, Pskov
вчера, 19:21
Cat murzik = new Cat(); Cat vaska = null; vaska = murzik; //оба ссылаются на один объект murzik = null; // ссылается только vaska Если murzik = null, но при этом vaska=murzik, почему vaska не ссылается на null? Почему 4-е присваивание не отменяет 3-е?
Анатолий Киреев3 уровень, Екатеринбург
8 часов назад
выполнение кода идет сверху вниз
Даня2 уровень, Москва
суббота, 07:41
(На второй больше никто не ссылается – второй объект считается МУСОРОМ!) Отбросы вперёд!
Rain Storm3 уровень
6 октября, 22:05
Народ, как присвоить собакам имена? :/
Санжар Мухитдинов4 уровень, Каттакурган
7 октября, 14:45
важно при копировании данных из примера и сознания на их основе остальных собак исправить
Dog dog1 = new Dog();
dog1.name = "Max";
на соответствующее другим собакам в первой и второй стоке
Dog dog2 = new Dog();
dog2.name = "Bella";
я первую строку исправил, а вторую забыл и условие "Каждому объекту типа Dog должно быть присвоено имя." стало красным.
Rain Storm3 уровень
7 октября, 21:48
Спасибо, уже сообразила. Сейчас прохожу схожую задачку, только с присвоением владильца питомцам. Там разобрался? :D
Санжар Мухитдинов4 уровень, Каттакурган
8 октября, 02:01
Привет, если ты говоришь о 2,5,3 (2 уровень, 5 лекция, 3 задача), да прошел, там как про мужа и жену из 2,2,6.
Даня2 уровень, Москва
суббота, 07:49
Никак. ; D
Saiman8324 уровень, Пермь
21 сентября, 03:40
гуглим кому интересно что это :) подсказка
Petro4 уровень, Киев
10 сентября, 12:40
То есть в первой задаче, создается 2 объекта с ссылками на них, во второй задаче, так же создается 3 объекта с ссылками на них, но им еще и присваивают имена.....
Андрей17 уровень, Санкт-Петербург
9 сентября, 08:27
Шилдт лучше объясняет, это точно. Он говорит, что запись:
Cat murzik = new Cat();
Можно представить в виде двух строк:
Cat murzik;
murzik = new Cat();
Не увидел здесь подобную формулировку, на мой взгляд она лучше объясняет происходящее.
Ergo3 уровень, Москва
10 сентября, 18:21
Не совсем очевидно, что в этом объяснении лучше, если это просто правило записи любой переменной, а не какое-то специфичное объяснение только для создания объектных переменных. Вот что написано у Васильева: Создание объекта Процесс создания объекта можно условно разделить на два этапа: -объявление объектной переменной, через которую будет осуществляться доступ к объекту; -собственно создание объекта и "связывание" объекта с объектной переменной. Объявление объектной переменной аналогично объявлению переменной базового типа, но только для объектной переменной в качестве идентификатора типа указывается название класса. В частности, если мы хотим объявить объектную переменную класса MyClass, то соответствующая команда выглядит следующим образом: MyClass obj; Здесь объявляется переменная с именем obj класса MyClass. Принадлежность объектной переменной к определенному классу означает, что данная переменная может ссылаться на объект соответствующего класса. Но важно понимать, что объявление объектной переменной не означает создания объекта. То есть переменная существует, под нее выделяется место в памяти. Но это не объект. Объект создается с помощью оператора new, после которого указывается имя класса, на основе которого создается объект, и круглые скобки -в нашем случае пустые. Более конкретно, для создания объекта класса MyCLass,, используем инструкцию new MyClass().
Ergo3 уровень, Москва
10 сентября, 18:21
На заметку На самом деле после оператора new указывается конструктор создания объекта. Это специальный метод, который вызывается как раз при создании объекта. Название конструктора совпадает с названием класса. В круглых скобках передаются аргументы конструктору (если они нужны). Если аргументов у конструктора нет, то круглые скобки пустые. Это как раз наш случай. Но, поскольку мы с конструкторами еще не познакомились, то временно можем полагать, что после оператора new указывается имя класса и пустые круглые скобки. При выполнении данной инструкции создается новый объект класса MyClass, а значением выражения new MyClass() является ссылка на созданный объект. Обычно такую ссылку присваивают значением объектной переменной. Поэтому в нашем случае, после создания объектной переменной оbj, объект мог бы создаваться с помощью такой команды: obj = new MyClass(); Нередко команду объявления объектной переменной и команду создания объекта объединяют в одну инструкцию. Так, вместо команд MyClass obj и obj=new MyClass() мы могли бы использовать следующую команду: MyClass obj = new MyClass();". И так далее.
Артем Баранов7 уровень, Самара
16 сентября, 15:36
Кстати очень к месту и очень хорошее обьяснение, на пальцах показывающее "кто на ком стоял". По моей логике из функционального программирования п.1 смысла как бы не имеет так как "кто мешает ПРОСТО создать переменную а объект какого класса она будет представлять разберемся по факту на п.2". Долго не мог это в голове уложить
Саят3 уровень
26 сентября, 13:27
Хорошо объясняет Васильев. Интересно почему его нет в рекомендованной литературе на JavaRush
Юрий Гагарин3 уровень, Москва
8 сентября, 09:55
Получается, что после кода из задачи dog1.name = "Max", физически происходит следующее : в памяти с местом под объект dog1 в ячейку name записывается имя Max, я правильно думаю ?
javaUndefined6 уровень, Стрежевой
8 сентября, 13:00
dog1 хранит ссылку на объект, в памяти для переменной name объекта Dog хранится имя.
Alexey Prilessky9 уровень, Минск
23 августа, 16:44
Народ, скажите, тут сайт засчитывает задание только если сделал по примеру, а если решил другими способами , то не засчитает ? Решаю последнее задание таким способом, что в методе main создаю ссылку на новый метод: Print("текст задания"); public static void Print(String x); System.out.println(x); теоретически должен все равно вывестись текст, а оно считает это за ошибку.
Helga4 уровень, Киев
27 августа, 15:37
https://javarush.ru/help/1065 Возможно тут вы найдете решение.
Валера Тапок7 уровень, Москва
30 августа, 11:32
Тело метода пишется в фигурных скобках, а у вас там стоит символ ;, т.е. System.out.println(x); будет заключено в фигурные скобки
Natallia3 уровень, Campbell
7 октября, 06:22
практика хорошо конечно, но код должен быть чистым для поставленных целей - в этой задаче цель 1 строка кода. и да, отсутствуют фигурные строки в методе=)
Venom3 уровень
17 июля, 13:13
Так, всё сложно. Кто может проще объяснить?
Alexander Popov16 уровень, Санкт-Петербург
18 июля, 08:33
Ну у тебя есть класс, по сути, это пользовательский тип данных, так же как String, например. Ты создаешь объект класса также как и любую другую переменную. по схеме Тип_переменной имя_переменной. но есть одно отличие. в момент создания объекта класса таким образом, ты создаешь просто ссылку и говоришь компилятору что по адресу, на который она ссылается, будет лежать объект этого класса, например объект класса Cat. После этого мы имеем просто пустую ссылку, которая пока никуда не указывает. что бы выделить под нее память, и адрес этой память положить в ссылку, используется ключевое слово new. Работает по схеме имя_объекта_класса = new имя_класса(). то есть ты выделяешь кусочек памяти, адрес которой передаешь в переменную. дальше ты обращаешься к своему объекту класса уже по этой ссылке вот и все)
Алексей8 уровень
30 августа, 07:35
Cat murzik = new Cat(); Cat vaska = new Cat(); Создаются два объекта, ссылки на которые присваиваются двум разным переменным соответственно. Разве мы можем создать 2 объекта с одинаковыми именами? Upd. понял. Мы создаем объект, но не "видим" его. На него ссылается переменная. Если переменная перестает на него ссылаться, объект приговорен. Как если бы у дома отобрали адрес, то автоматически он сносится. Так?
aMozart238 уровень, Караганда
4 сентября, 05:19
Так там нет одинаковых имен. Cat везде, включая правую часть выражения - это тип ведь.
Алексей8 уровень
4 сентября, 17:01
Понял, спасибо!
Ergo3 уровень, Москва
6 сентября, 15:41
Cat() - это метод-конструктор класса Cat, который создает объект в классе Cat. new - оператор, который вызывает метод-конструкторна выполнение. По умолчанию метод-конструктор, когда создает объект, создает просто пустое нечто, в которое копирует поля и методы из класса, в которых нет никаких значений. Если говорить проще, представь, у тебя есть кусок пластилина, вот ты отщипнул от него кусочек, скатал в шарик, потом отщипнул еще один, снова скатал в шарик - вот эти два бесформенных шарика - и есть объекты, а пластилин - это класс, потому что оба шарика имеют те же характеристики, что и первоначальный кусок - цвет, консистенцию, состав и т.д. Позже из каждого шарика ты можешь вылепить что-нибудь, например, из одного собачку, из другого - кота, это и будет присваиванием значений полям объекта. Но компьютер различает эти два шарика, даже когда они - два одинаковых бесформенных куска пластилина, потому что они лежат в разных местах памяти (например, один ты положил в верхний ящик стола, другой - в нижний, ты же их теперь не перепутаешь и всегда сможешь найти по адресу ящика).
Алексей8 уровень
7 сентября, 17:03
Спасибо!
Ergo3 уровень, Москва
7 сентября, 18:19
Алексей, не за что)
aMozart238 уровень, Караганда
10 сентября, 09:14
Об этом я уже конкретно начал догадываться. Спасибо за советы и поправку.
Иван Атрушкевич3 уровень, Минск
30 сентября, 22:04
Так в том же и смысл, что бы натыкаться на сложности в процессе игры и искать их решения из вне. Расширяет кругозор)
8 июля, 19:23
Вроде и все делаю (бывает вообще легко), но вообще не до конца понимаю как это делаю, и почему.
Лёха6 уровень, Санкт-Петербург
26 августа, 07:10
Привет! Не парся, я тоже долго не понимал как все это работает, просто решал и решал. Все понимание придет позже. А лучше в месте с этим курсом читай "Изучаем Java" Кэти Сьера и Берт Бейтс
Ergo3 уровень, Москва
7 сентября, 18:23
Дмитрий Одинцов, не удивительно, что не понимаешь, когда объясняют так паршиво. Советую книги Кея Хорстманна "Java. Библиотека профессионала. Том 1. Основы" и Васильева А.Н. "Программирование на Java для начинающих". Начнешь все прекрасно понимать и довольно быстро. И не придется миллион раз повторять вариации задач на тему "Выведи на экран фразу "Бублик", а теперь фразу "Конь в пальто".
Ergo3 уровень, Москва
7 сентября, 19:46
Лёха, >А лучше в месте с этим курсом читай "Изучаем Java" Кэти Сьера и Берт Бейтс Отличный совет - изучать книгу по Java 5, когда вышла Java 12, не говоря уже о том, что в 8 или 9 версии, не помню точно, ввели модульность и лямбда-выражения, которые кардинально изменили парадигму программирования. Наверное, ты поверил лживым издательским вбросам "год издания книги 2019" - они просто переиздали в 2019 году перевод книги 2005 года.
Иван Атрушкевич3 уровень, Минск
30 сентября, 22:04
Это лучшее для новичков!
Justinian41 уровень, Киев
8 октября, 11:44
100%, я вообще не понимаю как можно новичкам читать по старой книге с пятой джавой о том, что такое полиморфизм или конструктор (понятиях которым 50 лет), без учета парадигмы функционального программирования и детального разбора принципа ассоциативности операций при распаралелливании обработки коллекций стримами или последных изменений в 13 уже джаве. Да и вспоминаю вузы, там каждый год летом, перед началом нового учебного года выбрасывают все старые учебники и книги, которые издавались не в этом году. Какой там от них толк. Особенно в программировании, где базовые математические концепции, которые лежат в основе соответствующих парадигм программирования меняются каждые три дня.
Chashchin3 уровень, Пермь
пятница, 12:58
посоветуй, плиз ,что-нибудь из современного для начинающего
Justinian41 уровень, Киев
пятница, 20:12
Читай Head first Java , теория срока давности не имеет. Только в этой книге читай только теорию, никаких заданий. Да, в более поздних версиях джавы могли добавиться фишки, но они никуда от изучающего джаву не уйдут, ему про это 20 раз напомнят в других источниках. Современные книги покрывают в основном ЕЕ. Классика джава кору это книги написанные 10-20 лет назад, в самом лучшем случае переизданы. Спрашивать для начинающего современные книги, это все-равно что для школьника искать современные книги по арифметике, что там изменилось то за последних 100-300 лет, что имеет значение для школьника? Книги по джава кору (основам) старые, поскольку там изменения очень медленно накапливаются, и как я писал, базовым концепциям 30-50 лет. Вот когда будешь изучать Java EE часть (специальные технологии, фреймворки) вот там да, книги выходят новые регулярно, и там будешь современные читать.
Chashchin3 уровень, Пермь
пятница, 20:26
cпасибо, учту