代码之家  ›  专栏  ›  技术社区  ›  Ismail Marmoush

java(初学者):返回一个对象?它是作为常量引用返回的还是什么?

  •  10
  • Ismail Marmoush  · 技术社区  · 14 年前

    我有一个返回用户定义对象的函数。首先我想知道这个对象是否通过引用返回,如果它是私有的呢?

    另外,我如何将它作为常量(最终)引用返回,因为我不希望有人来处理它?我把返回对象和返回object.copy()或object.clone()搞混了;

    5 回复  |  直到 6 年前
        1
  •  16
  •   Pablo Santa Cruz    14 年前

    在Java中,总是返回一个引用(除非返回的值是一个基元类型,如 int , float , char , ...).

    因此,如果不希望修改返回的对象,则 必须 返回它的完整副本(您可以使用 Clonable 接口和 clone 方法(如果类定义了它)。

        2
  •  11
  •   Ferdi265    11 年前

    因此,要回答您的问题,您首先必须知道Java如何传递变量。

    变量有一个值:

    int i = 1234;
    Person p = new Person("Peter");
    

    现在,变量i正好包含1234,而变量p包含被创建人的内存地址。

    所以我包含1234,p包含地址(比如a4dfi3)。

    anyMethodYouLike(p);
    System.out.println(p.getName());
    public void anyMethodYouLike(Person somePerson) {
       somePerson.rename("Homer");
    }
    

    所以在这个例子中,我们给出了任何方法,你喜欢的变量p。。。等待!我们给这个方法变量的值(a4dfi3)。然后,该方法对该变量调用rename(该变量仍与p具有相同的地址,因此它修改p指向的同一个人)。 因此,在该方法之后,p所指向的人的名字被打印出来,这就产生了“Homer”。

    someOtherMethod(p);
    System.out.println(p.getName());
    public void someOtherMethod(Person somePerson) {
       somePerson = new Person("Walter");
    }
    

    在这个例子中,我们仍然给这个方法一个名为“Peter”的人的地址。但这一次,该方法在某人中创建了一个新的人(因此将某人的地址重写为。。比如说13N37。 但是!a4dfi3的人没变!打印调用仍然输出“Peter”而不是“Walter”。

    现在,让我们看看它在基本体中的行为:

    someMethod(i);
    System.out.println(i);
    public void someMethod(int someInt) {
       someInt++;
    }
    

    所以,i(1234)的值被传递给某个整数。然后某个整数递增到1235。但我还是1234岁。

    这是Java中对象和原语之间的巨大区别。

    现在回答你的问题: 一。正如您可以在这里看到的,是的,Java总是传递对象的引用地址。 2。如果你不想让别人弄乱你的对象的值,你必须首先用这些信息创建一个新的对象(例如Cloneable和clone()),但这是一个真正的混乱,因为你必须确保,你的对象中的所有不是基元的东西都被重新创建,当你有巨大的对象树结构时,这是非常糟糕的。

    我希望我能帮忙, 费迪265

        3
  •  2
  •   newacct    11 年前

    你真正应该意识到的是,“通过”或“返回”没有什么特别的。每当你“通过”或“返回”某物时,它只是传递该物的价值。周期。任何类型。无论何时“传递”或“返回”某个对象,都与简单地将其赋给变量完全相同。

    然而, 是什么 你要传递或归还的东西的价值?这就是你的困惑所在。您的问题是关于“返回一个对象”;但是,这样的事情在Java中没有意义。对象不是Java中的值。不可能有一个值为对象的变量。

    Java中唯一的类型是基元类型和引用类型。因此,唯一的值是原语和引用。(引用是指向对象的指针。)在Java中,我们只通过引用(指向对象的指针)操作对象。我们不能在变量中存储对象;但是我们可以在变量中存储引用(指向对象的指针)。因此,当您谈论传递或返回对象时,您几乎肯定是在谈论传递或返回引用。而且,如前所述,传递或返回引用没有什么特别的——传递或返回引用(指针)的值。

        4
  •  1
  •   GuruKulki    14 年前

    它返回对象的引用。

    假设你有一个类似的方法调用。

    Object obj = makeObject();
    

    它创建一个对象并返回(在makeObject方法中创建的对象的引用)。

        5
  •  0
  •   Jeremy    14 年前

    1) 是的,它返回对对象的引用。

    2) 如果方法是私有的,则只能从类本身中调用它。

    3) 制造一个物体 final 不会阻止其他人对其调用方法。有一些方法可以通过使用包和方法可见性使对象不可变。(查看公共、受保护和私人工作的方式)

    4) 没有 Object.copy()

    五) Object.clone() 是一头乱七八糟的野兽。