【问题标题】:Retutning object as result from method从方法返回对象作为结果
【发布时间】:2015-10-02 09:12:32
【问题描述】:

我开始学习我们从方法返回对象作为结果的部分,我有点卡在这里。如果你们中的任何人能帮助我,我将不胜感激。这是我书中的代码

class Test
{
   int a;

   Test(int i)
   {
      a=i;
   }
   Test increment()
   {
      Test privremeni = new Test(a+a);
      return privremeni;
   }
}
public class ReturnObject 
   {
     public static void main(String[] args) 
     {
      Test ob1 = new Test(2);
      Test ob2;

      ob2 = ob1.increment();
      System.out.println("ob1.a: "+ob1.a);
      System.out.println("ob2.a: "+ob2.a);

      ob2 = ob2.increment();
      System.out.println("ob2.a after second increment(): "+ob2.a);
     }
    }

令人困惑的部分:

首先:Test ob2; 这里我们不创建实际的对象,我们只是将类 Test 的引用分配给对象。在此对象具有值 null 之后。对吧?

第二个:ob2 = ob1.increment();当我们做这部分ob1.increment();然后方法increment()创建一个名为privremeni的新对象并返回对象privremeni的引用并将其分配给ob2

第三个:ob2 = ob2.increment() 我们再次调用方法increment(),它会再次递增。那么ob2 是否会与我们第一次调用increment() 方法时具有相同的引用,或者当我们再次创建新对象时它将获得新的引用?

我认为我可能无法理解这一点,因为当我们通过值传递引用时,我仍然有一些问题要理解,我认为这部分在这里非常重要。

如果您能给我更多有关此代码的示例以帮助我理解这一点,我将不胜感激。

【问题讨论】:

  • Test ob; 在您的代码中不存在,因此很难谈论它。如果它是一个局部变量,它在被赋值之前在逻辑上不会有值。如果是字段,则默认值为 null。请注意,ob 在这种情况下不是对象,而是变量。区分对象和变量(以及引用)很重要。
  • 第一:yes基本上是对的,检查ob2 == null时会返回true。第二:您正在创建一个新对象作为increment() 方法调用的返回值,所以您在那里也是正确的。第三:每次调用increment()都会返回一个新的Test实例,所以调用前ob2的实例与调用后的ob2是不一样的。它是一个不同的对象,而不仅仅是一个不同的值。

标签: java oop pointers reference


【解决方案1】:

首先: Test ob2;
这里我们不创建实际的对象,我们只是将类Test的引用分配给对象。在此对象具有值为 null 之后。对吧?

Test ob2;

是的,这个对象现在是空的,但是它有一个对象类型的引用,你不能做ob2 = new MyOtherTest();


第二个: ob2 = ob1.increment();
当我们做这部分时ob1.increment(); 然后方法increment() 创建一个名为privremeni 的新对象并返回对象privremeni 的引用并将其分配给ob2 ?

是的,就是这样! :) 你将拥有一个带有a = 4 (2+2)Test(4) 对象


第三次: ob2 = ob2.increment()
我们再次调用方法 increment(),它会再次递增。那么当我们调用increment() 方法时,ob2 是否会具有与第一次相同的引用,或者当我们再次创建新对象时它将获得新的引用?

新对象,新引用,所以这里是ob2 = new Test(8)如果你有一个值为 4 的 Test 对象的引用,它将仍然存在,阅读你的代码,Test(4) 现在是垃圾收集器的候选对象


正在恢复

Test ob1 = new Test(2); // new object Test(2)
Test ob2;  // new memory space reserved for ob2, but ob2 = null

ob2 = ob1.increment();  // ob2 now references to Test(4) object created at increment method

// print statements

ob2 = ob2.increment(); // ob2 is now Test(8)

在代码的最后,赋值是:

ob1 = Test(2);
ob2 = Test(8);
Test(4) is elegible for garbage collector cause is not referenced.

还要看看Test(4) 不适合垃圾收集器的这种情况:

Test ob1 = new Test(2); // new object Test(2)
Test ob2;  // new memory space reserved for ob2, but ob2 = null

ob2 = ob1.increment();  // ob2 now references to object Test(4) created at increment method

// print statements

Test ob3 = ob2; // Test(4) is now referencing to ob2 and ob3

ob2 = ob2.increment(); // ob2 is now Test(8)

在代码的最后,赋值是:

ob1 = Test(2);
ob2 = Test(8);
ob3 = Test(4);

我认为我可能无法理解这一点,因为当我们通过值传递引用时,我仍然有一些问题要理解,我认为这部分在这里非常重要。

Test ob1 = new Test(2); // new object Test(2)
Test ob2;  // new memory space reserved for ob2, but ob2 = null
ob2 = ob1.increment();  // ob2 now references to object Test(4) created 
Test ob3 = ob2; // Test(4) is now referencing to ob2 and ob3

如果你这样做:

ob2.a = 9;  // that means also ob3.a = 9 because they reference same object!!!!

【讨论】:

  • 最让我困惑的部分是在程序结束时 Test(4) 发生了什么。但现在我明白了,在我们第二次调用 increment() 方法后它失去了它的引用。谢谢先生的解释。现在很清楚了!
【解决方案2】:

Test ob1 = new Test(2);将初始化变量a,其值为2

首先:测试ob;这里我们不创建实际的对象,我们只分配 类 Test 对对象的引用。在这个对象有值之后 空值。对吧?

我假设它的 Test ob2,而不是测试 ob。 是的。这里我们没有创建任何对象。但我们也没有分配任何参考。它只是一个声明。 ob2 将包含一个空值。

第二个:ob2 = ob1.increment();当我们做这部分 ob1.increment(); 然后方法 increment() 创建名为 privremeni 的新对象并返回 对象 privremeni 的引用并将其分配给 ob2 ?

ob1.increment() 将创建一个新对象,privremeni 是一个局部变量,将引用该对象。在下一行increment() 方法将返回该对象并将其分配给 ob2。 ob2 对象的实例变量 a 将具有不同的值 - 4。因为您已将其递增 (2+2)

第三:ob2 = ob2.increment() 我们再次调用方法 increment() 并且它 将再次增加。所以 ob2 的引用与第一个相同 我们调用 increment() 方法的时间,否则它将获得新的引用 我们再次创建新对象?

您正在用新对象覆盖 ob2 的值。所以较早的对象(在第二个问题中提到)将被垃圾收集。而这个新对象的实例变量a将会有一个新的值8(4+4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 2012-03-02
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多