Java中引用和对象有什么区别?

21

我有一个名为GUI的类,因此我可以创建这样的对象:

GUI g1 = new GUI();

并且一个像这样的引用变量:

GUI g2;

据我所知,g2是一个引用变量,它引用了GUI类,而g1是GUI类的一个对象。g1和g2之间有什么区别?我可以使用对象来调用GUI类的属性,但是g2可能有什么用途呢?


2
我认为你不能在代码中使用g2,因为它尚未初始化,而且是null。 - evilone
2
我认为这个问题值得一个好的答案留存! - salezica
@SantiagoLezica 谢谢老兄。一开始有人给这个问题点了踩。 - Rahul Virpara
如果我创建变量 GUI g2,这是否意味着它必须是 GUI 类的对象? - Rahul Virpara
@OP 没问题,伙计!这就是 Stack Overflow 的用途,如果将来有人想知道与你相同的问题,他们应该能够找到有意义的东西! - salezica
8个回答

35

参考是名称,对象是东西。您可以为东西使用不同的名称,即使是对于实际不存在的东西。

您可以声明名称,而不给它们任何“真正”的含义,像这样:

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;

:)


3
优秀的第一段。引入面向对象编程思想的好方法。 - Basil Bourque

23
在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.

g1g2唯一的区别在于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
这就是正确的答案。 - Sanjeet A
4
需要接受这个答案。 - wfunston

6

在为g2分配一个对象之前,您无法使用它,因为它目前没有指向任何对象,而g1已经指向了一个GUI对象,您可以使用它。

这个:

GUI g1 = new GUI();

这几乎等同于:

GUI g1;
g1 = new GUI();

4

引用(References)是指向名为对象(objects)的一块内存的指针。

GUI g1 = new GUI();

为了解释,让我把上面的陈述分开来。

GUI g1;
g1 = new GUI();

第一步: g1 是一个引用变量(指针),尚未指向任何有效的内存位置。

第二步:第二步为类GUI的对象分配内存,并使赋值操作使引用变量g1指向该对象(内存位置)。 new关键字为类GUI的对象分配内存。


2

对象就像在堆空间中漂浮的气泡。变量只是指向这些气泡的链接。表达式new GUI()创建一个对象,并使用=运算符将其链接到变量g1g2也是一个变量,但它没有链接到任何对象。您可以通过编写以下内容轻松交换它们:

g2 = g1;
g1 = null;

现在g2指向一开始g1所指向的对象,而g1则不再指向任何东西。对象保持原状,只有变量被更改。

1

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();

0
实际上,在Java中,变量的名称是一个引用(除了原始类型)。您不能使用g2,因为它尚未被初始化,甚至不是null。如果尝试为g2调用方法,则会在编译时出现错误。在GUI g2;之后,g2没有指向内存中的对象。如果像这样将g2设置为null:GUI g2 = null;,则可以在声明后使用它,但是如果为g2调用方法,则会在运行时出现NullPointerException。

0

引用是一个“钩子”,你可以在上面挂一个对象。 一个对象可能会在多个钩子上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接