2012-02-12 3 views
15

У меня есть графический интерфейс класса, так что я могу создать объект так:В чем разница между ссылками и объектами в java?

GUI g1 = new GUI(); 

и ссылочную переменную как это:

GUI g2; 

Теперь, насколько я знаю, g2 является ссылочная переменная, которая дает ссылку к GUI-классу, а g1 - объект класса GUI. В чем разница между g1 и g2? Я могу использовать свойство класса GUI с объектом, но каково возможное использование g2?

+2

Я думаю, что вы не можете использовать g2 в своем коде, потому что он еще не инициализирован и имеет значение null. – evilone

+3

g1 - ссылка тоже! –

+2

Я думаю, что этот вопрос заслуживает хорошего ответа, чтобы не отставать! – slezica

ответ

22

Ссылки имена. Объекты - это вещи. У вас могут быть разные имена для вещей, даже для вещей, которые на самом деле не существуют.

Вы можете объявить имена, фактически не давая им никакого «реального» означает, как это:

GUI g1; 

Вы можете присвоить значение (реальный материал для обозначения) для имен с оператором =:

GUI g1 = some_gui; 

Имена могут изменить свое значение с течением времени. Одно и то же имя может ссылаться на разные вещи в разных точках истории.

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

Есть также синонимы: несколько имен может ссылаться на одно и то же:

GUI g2 = g1; 

Это довольно много, что делать ссылки. Это имена, предназначенные для обозначения вещей.

Материал может быть создан:

new GUI(); 

Материал может быть создан и назван на месте для последующего использования (в буквальном смысле!):

GUI g1 = new GUI(); 

И материал можно назвать, используя его имя (или любое из его названий!):

g1.doSomething(); 
g2.doSomethingAgain(); 

Можно создать различные вещи того же рода (класса) и указать изд-разному:

GUI g1 = new GUI(); 
GUI g2 = new GUI(); 
GUI g3 = new GUI(); 

GUI g1_synonym = g1; 

:)

+2

Большой первый абзац. Хороший способ представить идеи ООП. –

5

Вы не можете использовать g2 пока не присвоить объект к нему, так как в настоящее время он не указывает на какой-либо объект, в то время как g1 уже указывает на GUI объект, и вы можете использовать его.

Это:

GUI g1 = new GUI(); 

довольно много эквивалентно:

GUI g1; 
g1 = new GUI(); 
2

Объекты, как пузырьки, плавающие через пространство под названием кучи. Переменные - это просто ссылки на эти пузырьки. Выражение new GUI() создает объект, а оператор = связывает его с переменной g1. g2 также является переменной, но не связан ни с каким объектом. Вы можете легко поменять их, написав

g2 = g1; 
g1 = null; 

Теперь g2 относится к объекту, который g1 имел в виду в самом начале, и g1 относится ни к чему. Объект неповрежден, изменены только переменные.

0

Фактически в Java имя вашей переменной является ссылкой (кроме примитивных типов). Вы не можете использовать g2, потому что он не был инициализирован и даже не равен нулю. Вы получите ошибку времени компиляции, пытающуюся вызвать метод для g2. После GUI g2; g2 не указывает на объект в памяти. Если вы установили g2 равным GUI g2 = null;, вы можете использовать его после объявления, но если вы вызовете метод g2, вы получите время выполнения NullPointerException.

0

Оба, g1 и g2 являются ссылками. Но g2 не инициализируется, поэтому его нельзя использовать в коде.

//Tells that g1 g2 should hold Gui object. Currently they are not holding any object. 
Gui g1; 
Gui g2; 

//Now g1 reference holds object. g2 reference still doesn't point to any object. 
g1 = new GUI(); 
11

В чем разница между ссылками и объектами в Java?

Ссылка - это объект, который предоставляет способ доступа к объекту своего типа. Объект - это объект, который предоставляет способ доступа к элементам его класса или типа.

Как правило, вы не можете получить доступ к объекту без ссылки на него.

class GUI 
{ 
    void aMethod() 
    { 
     // some business logic. 
    } 
} 

Вы можете позвонить по телефону aMethod с ссылкой или без ссылки. но вам определенно нужен объект.

без ссылки:

new GUI().aMethod(); 
// you can't reuse the object 
// bad way to code. 

С Артикул:

GUI aGUIReference = new GUI(); 
aGUIReference.aMethod(); 
// Now, the object can be reused. 
// Preferred way to code 

Теперь немного объяснений своим строк кода:

GUI g1 = new GUI(); 
// g1 is a reference to an object of GUI class. 

GUI g2; 
// g2 is a reference that can point to an object of GUI class 
// but currently not pointing to any. 

Единственное отличие ч/б g1 и g2 что g1 инициализируется с объектом, но g2 указывает на null

g2 = g1; 
// it means g2 will point to the same object g1 is pointing to 
// only one object but two references. 
+1

Это правильный ответ. –

+2

Это должен быть принятый ответ – wfunston

0

Ссылки имена. Объекты - это вещи. У вас могут быть разные имена для вещей, даже для вещей, которые на самом деле не существуют.

Вы можете объявить имена, фактически не давая им никакого «реального» означает, как это:

GUI g1; 

Имена могут изменить свое значение с течением времени. Одно и то же имя может ссылаться на разные вещи в разное время.

GUI g1 = some_gui; 

doSomething(); 

g1 = some_other_gui; 

Это в значительной степени то, что делают ссылки. Это имена, предназначенные для обозначения вещей.

Материал может быть создан:

new GUI(); 

Материал может быть создан и назван на месте для последующего использования (в буквальном смысле!):

GUI g1 = new GUI(); 

:)

0

Ссылка является «крюк», где вы можете повесить объект на. Объект может быть на нескольких крючках.

3

References является своим родом указателей на блок памяти под названием objects.

GUI g1 = new GUI(); 

Для объяснения, позвольте мне нарушить вышеуказанное заявление.

GUI g1; 
g1 = new GUI(); 

первый шаг: g1 является ссылочная переменная (указатель), но не указывает на какой-либо уважительной ячейку памяти.

2-й шаг: второй шаг выделяет память для объекта класса GUI, а операция присвоения указывает ссылочную переменную g1 на этот объект (расположение памяти). Ключевое слово new выделяет память для объекта класса GUI.

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