【问题标题】:Prevent object stored in ArrayList from being over written防止存储在 ArrayList 中的对象被覆盖
【发布时间】:2012-05-02 16:38:16
【问题描述】:

基本上我必须编写一个简单的联系人管理器,并将对象存储在数组列表中。

令我沮丧的是我有 newContact 方法,当调用它时会创建 Contact 的新实例,并将其存储在 ArrayList 中。问题是每次我调用该方法时,列表中的所有其他对象都会被覆盖。

import java.util.ArrayList;
public class ContactManager {

  public static ArrayList<Contact> contactList = new ArrayList<Contact>();
  public static Contact[]c = {};

  public static void main(String[]args){
    newContact();
    newContact();

    System.out.println(contactList.get(1).getName());
    System.out.println(contactList.get(0).getName());
  }

  public static void newContact(){
    Contact c = new Contact();
    contactList.add(c);
  }
}

在 Contact 类构造函数中,有一段代码使用 Scanner 类初始化对象的属性。

如果在第一次调用中输入“John”,在第二次函数调用中输入“Peter”,上述代码将打印出来:

彼得 彼得。

为什么不打印出 John Peter?

我能想到的唯一一件事是,Java 可能只存储对数组列表中对象的引用,并且与变量不同,对象在函数执行后不会被销毁..

有什么办法吗?

我希望这能解释我想要达到的目标。

PS。我知道人们讨厌那些作为家庭作业问题的人。但我这样做是为了学习新东西。原始分配几乎不要求实例化 5 个对象并将它们存储在 ArrayList 中。我已经完成了,现在我只是想看看我是否可以提出更动态的解决方案。

联系类代码:

import java.util.Scanner;

公开课联系方式{

private static String name, number;

//constructor will ask to enter contact details
public Contact(){
    Scanner in = new Scanner(System.in);

    System.out.println("Enter name:");
    name = in.next();

    System.out.println("Enter number:");
    number = in.next();
}

//getters and setters

public static String getName(){
    return name;
}

public static String getNumber(){
    return number;
}

public static void setName(String newName){
    name = newName;
}

public static void setNumber(String newNumber){
    number = newNumber;
}

}

【问题讨论】:

  • 它应该打印 John Peter。错误在于您的代码。你能告诉我们Contact()的代码吗?
  • 请向我们展示初始化属性的代码。
  • 联系人列表被声明为static这一事实可能会导致问题,如果不查看代码我无法确定。
  • @ÓscarLópez 我不认为静态与它有任何关系。在这种情况下不会造成问题
  • @ÓscarLópez:我同意 Edge - 它不是最好的 OO 设计,但我不认为这就是问题所在。

标签: java


【解决方案1】:

这是因为Contact 类中的成员是静态的。这意味着所有Contact 实例共享相同的namenumber。您应该将它们设为实例成员,以便每次执行 new Contact 时都会获得这些变量的新副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 2018-09-11
    • 2018-06-27
    • 2017-05-09
    • 2018-12-23
    • 1970-01-01
    • 2017-06-06
    • 2019-07-14
    相关资源
    最近更新 更多