【问题标题】:Java, why is the field not changing? [duplicate]Java,为什么字段没有变化? [复制]
【发布时间】:2014-12-02 16:14:01
【问题描述】:

我在使用 Java 时遇到问题。为什么下面的代码返回null

public class TestClass {
    public String top,top1,top2,top3,top4;

    public TestClass(){
        changeTop(top);
        changeTop(top1);
    }

    public void printTop(){
        System.out.println(top);
    }

    public void changeTop(String reference){
        reference="lolly";
    }

}

当我运行以下命令时:

TestClass x =   new TestClass();
x.printTop();

它还返回null。我不明白,因为我以为我传递了对ChangeTop 的引用。 我怎样才能解决这个问题?我想将参数的名称赋予一个方法来更改它。

【问题讨论】:

  • 我知道我可以这样做。top="lolly",但这不是我想要的。想象我们有一个 top1,top2,top,3... 。难道不能简单地给一个改变值的方法起名字吗?
  • @ZouZou:这个问题不是“Java 是“引用传递”还是“值传递”的重复问题?这里的实现是错误的。 changeTop 方法将“lolly”分配给参数“reference”本身,而不是“top”。因此 top 始终为空。
  • @Nazgul 这就是我恢复关闭的原因。
  • @Nazgul 我不同意 - 这个问题是由对 Java 中引用语义如何工作的基本误解引起的。链接的答案解释了可以做什么和不能做什么,因此完全涵盖了这种情况。
  • @Nazgul 重新阅读这个问题,我想我做对了。 OP 期望构造函数中的changeTop(top); 在调用new TestClass(); 时更改top 的值。因此,最后的投票实际上是正确的。

标签: java reference field


【解决方案1】:

试试这个:

public void changeTop(String reference){
    this.top = reference;
}

然后运行这个:

TestClass x =   new TestClass();
x.changeTop("lolly");
x.printTop();

编辑

如果有很多变量,请尝试将您的 TestClass 更改为:

public class TestClass {
    public List<String> tops;

    public TestClass(List<String> newTops){
        changeTop(newTops);
    }

    public void printTop(){
        System.out.println(tops);
    }

    public void changeTop(List<String> tops){
        this.tops = tops;
    }

}

尝试运行这个:

public static void main(String[] args) {
    List<String> tops = Arrays.asList("lolly", "colly", "solly", "molly");
    TestClass x = new TestClass(tops);
    x.printTop();
}

还有输出:

[lolly, colly, solly, molly]

【讨论】:

  • 要清除这一点,我不想在我的方法中硬编码字段的名称。我想创建一个方法,我可以在其中传递一个字段名并将该字段设置为特定值。
  • 这就是我在第二个sn-p中所做的
  • 如果我想改变top2,top3或top4,我应该写什么?
  • @Bosiwow 我无法再给出答案,因为它已关闭,但请考虑不要有五个名为 top1top2、... 的变量,而是创建一个数组,或者更好的是,创建一个Map,其键是字符串"top1""top2" 等。然后你就可以做你想做的了。此外,任何时候如果您有一大堆具有相似名称和相同类型的变量,您应该考虑不要让它们成为单独的变量。
  • @Bosiwow 看看我的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
相关资源
最近更新 更多