2012-12-21 173 views
2

我想创建一个Person的数组(一个类与变量字符串名称,和总数)。但由于某种原因,创建第二个人会替换(?)第一个人。 。 。自定义Java对象数组

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 static String name; 
    private static 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; 
    } 
} 
+6

你能向我们展示人类吗?也许你使用一个静态变量来存储名称? – Henry

+0

我们可以看到Person类吗? – Joel

+0

你能告诉我们Person的构造函数吗? –

回答

5

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

+0

如果它们是静态的,它们不是实例变量。所以你的陈述是矛盾的。 –

+0

那么,名称将是一个Person类的实例变量..这就是他正在试图做的..这就是为什么我使用这个词。 – Joel

+0

如果它们是静态的,它们是类变量,而不是实例变量。不是吗? –

3

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

private static String name; 
private static double total; 

你需要让这些字段类实例变量:

private String name; 
private double total; 

Understanding Instance and Class Members

1

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