【问题标题】:Java - Open questions to the Keyword "return"Java - 对关键字“return”的开放式问题
【发布时间】:2018-06-01 21:53:00
【问题描述】:

我对java中的关键字“return”有疑问。

在名为“change”的方法中,将返回一个带有给定参数 n 的新人对象,但在 main 中定义的对象“pone”不会被新对象覆盖。在 main 方法中执行后“return new Person(n)”对象会发生什么?一位学生告诉我“返回新的 Person(n) 将覆盖 pone 对象中的值。

这是代码:

public class Person {

    String name;

    Person(String name) {
        this.name = name;
    }

    Person change(String n) {
        return new Person(n);
    }

    void setname(String n) {
        name = n;
    }

    @Override
    public String toString() {
        return name;
    }

    public static void main(String[] args) {

        Person pone = new Person("Jack");
        System.out.println(pone.change("Julia"));
        System.out.println(pone);
    }
}

输出:

   System.out.println(pone.change("Julia")); -> Julia
   System.out.println(pone);  -> Jack

【问题讨论】:

  • 你被告知的是错误的。

标签: java class methods return overriding


【解决方案1】:

您的学生不正确。

return new Person(n); 调用 Person(String name)。没有任何内容可以修改调用站点上this 引用的实例。

change 的更合适的实现可能是

Person change(String n) {
    name = n;
    return this;
}

假设您仍想返回一个 Person 实例 - 此类方法通常是 void 类型,但您拥有它的方式确实允许方法链接

【讨论】:

    【解决方案2】:

    试试这个

    String change(String n) {
        return name = n;
    }
    

    【讨论】:

    • 已经有一个方法集可以改变name的值。"void setName(String n)"
    • @Stultuske 它只会返回字符串名称。
    【解决方案3】:

    我不太清楚你说什么,但如果你想把杰克换成朱莉娅,你应该这样做:

    Person pone = new Person("Jack");
    pone = pone.change("Julia");
    

    【讨论】:

      【解决方案4】:

      这里的关键字new表示change方法会创建一个Person的新实例,并且这个新实例被分配了自己的内存,然后构造函数中的this指向这个已经创建的新对象。该对象不会影响现有的人。

      【讨论】:

      • 执行完方法后会销毁Person的新实例吗?
      • 好吧,这取决于:如果您不再存储或使用该实例,那么是的,GC 会出现并回收内存。但是,如果您将 change 方法的输出存储到一个新人中,那么它仍然可以使用。
      【解决方案5】:

      您的学生不正确。没有值被覆盖。不是一个人对象,而是创建了两个人对象。

      在这里创建了 2 个 Person 对象。一个有名为“pone”的引用变量(值为 Jack),另一个(值为 Julia)没有任何引用变量来保存从“change”方法返回的对象。

      1. System.out.println(pone.change("Julia"));打印 Julia 作为第二个对象 朱莉娅作为名字。此值未分配给任何参考变量,因此 value 将来永远无法访问,并且有资格获得 GC。
      2. System.out.println(pone);将 Jack 打印为 pone 是参考变量 保存第一人称对象的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-03
        • 2018-06-07
        • 1970-01-01
        • 2020-07-18
        • 2010-12-09
        • 2014-12-24
        • 2019-02-22
        • 2011-03-16
        相关资源
        最近更新 更多