有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java防止存储在ArrayList中的对象被过度写入

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

让我沮丧的是,我有一个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”,则上述代码将打印出来:

彼得 彼得

为什么它不打印出约翰·彼得

我能想到的唯一一件事是,也许Java只在arraylist中存储对对象的引用,而且与变量不同的是,对象在函数执行后不会被销毁

有什么办法吗

我希望这能解释我想要实现的目标

另外,我知道人们讨厌那些被当作家庭作业问题的人。但我是作为一个额外的,为了学习新的东西。最初的赋值几乎不要求实例化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;
}

}

共 (1) 个答案

  1. # 1 楼答案

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