【问题标题】:What is difference between references and objects in java? [duplicate]java中的引用和对象有什么区别? [复制]
【发布时间】:2012-02-12 09:50:56
【问题描述】:

我有类 GUI,所以我可以创建这样的对象:

GUI g1 = new GUI();

还有一个像这样的引用变量:

GUI g2;

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

【问题讨论】:

  • 我认为你不能在你的代码中使用 g2,因为它还没有被初始化并且它是空的。
  • 我认为这个问题应该得到一个很好的答案!
  • @SantiagoLezica 感谢 mate.first 有人否决了这个问题。
  • 如果我创建变量GUI g2 这是否意味着它必须是类 GUI 的对象?
  • @OP 没问题的人!这就是 SO 的用途,如果将来有人想知道你做过的同样的事情,他们应该能够偶然发现一些有意义的东西!

标签: java object reference


【解决方案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;

:)

【讨论】:

  • 第一段很棒。介绍 OOP 想法的好方法。
【解决方案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.

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】:

在为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 类的对象分配内存。

    【讨论】:

      【解决方案5】:

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

      g2 = g1;
      g1 = null;
      

      现在g2 指的是g1 一开始所指的对象,而g1 指的是任何东西。对象是完整的,只是变量被改变了。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            引用是一个“挂钩”,您可以在其中挂上一个对象。 一个对象可以挂在多个钩子上。

            【讨论】:

              猜你喜欢
              • 2013-02-05
              • 2015-11-07
              • 2012-01-19
              • 2011-04-27
              • 2019-02-09
              相关资源
              最近更新 更多