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

У меня есть GUI класса, поэтому я могу создать такой объект:

GUI g1 = new GUI();

и ссылочной переменной:

GUI g2;

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

Ответы

Ответ 1

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

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

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

В чем разница между ссылками и объектами в 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.

Единственное различие b/w 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.

Ответ 3

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

Это:

GUI g1 = new GUI();

в значительной степени эквивалентен:

GUI g1;
g1 = new GUI();

Ответ 4

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

GUI g1 = new GUI();

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

GUI g1;
g1 = new GUI();

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

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

Ответ 5

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

g2 = g1;
g1 = null;

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

Ответ 6

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

Ответ 7

Оба, 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();

Ответ 8

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

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

GUI g1;

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

GUI g1 = some_gui;

doSomething();

g1 = some_other_gui;

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

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

new GUI();

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

GUI g1 = new GUI();

:)

Ответ 9

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