【问题标题】:Array of custom Java objects自定义 Java 对象数组
【发布时间】:2012-12-21 21:16:26
【问题描述】:

我正在尝试创建一个 Person 数组(一个具有变量字符串名称和双倍总数的类)。但是由于某种原因,创建第二个 Person 会替换(?)第一个人。 . .

Person[] p = new Person[40];
    
p[0] = new Person("Jango", 32);
p[1] = new Person("Grace", 455);
    
System.out.println( p[0].getName() );
System.out.println( p[1].getName() );
System.out.println( p[0].equals(p[1]) );

输出是:

Grace
Grace
false

为什么不是:

Jango
Grace
false

????????????

public class Person {

    @SuppressWarnings("unused")
    private Person next;
    private String name;
    private double total;

    public Person(String _name)
    {
        name = _name;
        total = 0.0;
        next = null;
    }

    public Person(String _name, double _total)
    {
        name = _name;
        total = _total;
        next = null;
    }

    public String getName()
    {
        return name;
    }
}

【问题讨论】:

  • 你能告诉我们person类吗?也许您使用静态变量来存储名称?
  • 我们能看到 Person 类吗?
  • 你能告诉我们Person的构造函数吗?
  • 假设Person 的定义合理,这不应该发生。要么您在实际代码中输入错误的数组索引之一,要么错误在 Person
  • 您需要查看类字段中的“静态”是什么意思,以及对象比较在 Java 中的工作原理。

标签: java arrays object


【解决方案1】:

您的问题是 name 实例变量被声明为静态,使其成为类变量。对于该类的每个实例,对名称的任何更改都会更改。您需要从 nametotal 中删除静态标识符,您的代码将正常工作。

【讨论】:

  • 如果它们是静态的,它们就不是实例变量。所以你的说法是矛盾的。
  • 好吧,name 将是 Person 类的实例变量。这就是他正在尝试做的事情。这就是我使用该术语的原因。
  • 如果它们是静态的,它们是类变量,而不是实例变量。不是吗?
  • 你是对的......我知道。我想说他将实例变量声明为静态的……使它们成为类变量。这不是他打算做的。抱歉没有全部输入..
【解决方案2】:

目前这些变量是static,这意味着它们将保留最后分配的值。

private static String name;
private static double total;

您需要将这些字段设为类实例变量:

private String name;
private double total;

Understanding Instance and Class Members

【讨论】:

    【解决方案3】:

    您的字段是静态的。如果您希望它们能够为类的每个实例存储名称和总数的单独实例,它们不应该是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      相关资源
      最近更新 更多