2012-11-27 2 views
0

Из того, что я узнал, объекты класса в Java фактически ссылаются на эти объекты. Сам объект не может иметь переменную, а только ссылку на нее.Поведение ссылок на классы в Java

Рассмотрим следующий C++ пример:

SomeClass A(5); 
SomeClass &B = A; 
SomeClass &C = B; 

Теперь, я думаю, что я прав, говоря, что все три утверждения ниже будут использовать один и тот же объект:

A.someMethod(); //some object 
B.someMethod(); //the same object 
C.someMethod(); //the same object 

Однако, в Java, хотя объекты фактически являются ссылками, используя оператор присваивания, создаст совершенно новый объект с новой ссылкой на него.

SomeClass A = new SomeClass(); 
SomeClass B; 
B = A; 

Теперь, вызовы метода будет вызывать из совершенно разных объектов:

A.someMethod(); //uses one object 
B.someMethod(); //uses entirely different object 

Скажите, пожалуйста, является ли я правильно или неправильно.

+7

Вы ошибаетесь .. –

+3

Вы понимаете, насколько легко было бы это проверить и узнать сами? –

+1

Ссылка не объект. Ссылка (никому не говори!) указатель на объект. –

ответ

2

Рекомендации разные. У конкретного объекта может быть несколько ссылок, указывающих на него. При вызове метода класса во время компиляции всегда ссылка класса проверяется, содержит ли ссылочный тип метод, определенный в его классе. Если не выдается ошибка времени компиляции. Если метод переопределяется в подклассе данного класса, то переопределенный метод вызывается во время выполнения. Во время компиляции всегда проверяется «класс-ref» в <class-ref>.method(), чтобы узнать, содержит ли оно определение метода. Другие модификаторы, такие как статические, окончательные, абстрактные, видимость метода, также проверяются во время компиляции, и возникает ошибка времени компиляции, если используется неправильная комбинация модификаторов метода.

SomeClass A = new SomeClass(); 
    SomeClass B; 
    B = A;  // Same class, same object, different reference 


A.someMethod(); //uses one object 
B.someMethod(); //uses the same object 
+0

+1 для исправления комментариев в примере из OP –

2

Ссылки на Java очень похожи на ссылки на C++. Назначение одной ссылки на другую делает не создать новый объект. В Java новые объекты создаются только при явном использовании оператора new.

Добавление:

Для полноты следует отметить, что объекты Струнные следовать своим собственным правилам. В частности, константа String создает объект во время компиляции без явного использования new. Кроме того, auto- (un) бокс является более сложной темой, где объекты создаются без явного использования new. Тем не менее, основной момент в обоих случаях остается: назначение одной ссылки на другую делает не создать новый объект. Обе ссылки относятся к одному и тому же объекту.

+2

Строковая константа * никогда * не создаст новый объект. Создается объект String, который представляет строковый литерал во время выполнения интернированный ПЕРЕД выполнением кода. В отличие от этого, unboxing * может * вызывать создание объектов при запуске кода ... но это не всегда. –

+0

@StephenC Спасибо за разъяснение. Я пытался квалифицировать свое утверждение о том, что объекты создаются только с помощью 'new', потому что какой-то язык нацистов придет и скажет мне, что литературные объекты String не создаются именно так. Надеюсь, мой обновленный ответ более точен. –

+1

«Для полноты» - вы должны также упомянуть, что объекты в Java могут быть созданы рефлексивно или десериализацией объектов, ни одна из которых не связана с оператором 'new'. –

-2

Bro на самом деле, кажется, что Java создает совершенно иной и новый объект, когда вы делаете то же ссылки на объект (A = B). Но на самом деле java предоставит копию объекта другой ссылке, которую вы сделали, как в вашем примере A и B, относятся к одному и тому же объекту, но у них есть свои собственные копии этого объекта типа SomeClass. Это то же самое, что и вызов по значению языка C. Вы можете использовать и модифицировать этот объект, но модификация, сделанная в этом объекте, не будет влиять на оригинальную копию или другую копию, означает, что если вы изменяете объект SomeClass с использованием ссылки B, это не повлияет на объект ссылки B, хотя оба относятся к тем же объектам, но они имеют свои собственные копии.

+0

-1 Это неверно. Обе ссылки указывают на один и тот же объект после назначения. Объект не копируется. –

Смежные вопросы