В чем разница между ссылками и объектами в 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
Ссылка - это "крючок", где вы можете повесить объект.
Объект может быть на нескольких крючках.