试图在main中的静态方法中从对象运行public方法,而不是工作

时间:2017-02-06 20:33:23

标签: java

好的,所以我有这个迷你程序,我创建了一个叫做手机的程序。它有3个类:Main.java,Contact.java和MobilePhone.java。

Main.java使用扫描程序执行静态方法,以通过电话菜单显示和返回信息。 Contact.java是一个简单的类,它将名称和数字存储为联系人。 MobilePhone.java具有ArrayList,它将Contact类中的对象存储为联系人,然后有几个方法,如addContact();删除联系人(); queryContact(); modifyContact();等...

我遇到的问题是我在Main.java中运行这些静态方法,其中一些调用MobilePhone.java中的公共非静态方法,它们似乎并不是全部执行方法中的代码。这是一个例子:

在Main.java中我有一个名为addContact()的方法;看起来像这样: note mobilePhone(区分大小写)是新MobilePhone类的名称。

private static void addContact(){
    System.out.println("Enter name: ");
    String name = scanner.nextLine();
    System.out.println("Enter number: ");
    String number = scanner.nextLine();
    Contact newContact = Contact.createContact(name, number);
    mobilePhone.addContact(newContact);
}

mobilePhone.addContact();看起来像这样:

public void addContact(Contact contact){
    for(int i = 0; i < this.contacts.size(); i++){
        if(this.contacts.get(i).equals(contact)){
            System.out.println("Contact already exists.");
        } else {
            this.contacts.add(contact);
            System.out.println("New contact: " + contact.getName() + " - "
                    + contact.getNumber() + " added.");
        }
    }
}

正在发生的事情是扫描程序正在从Main.addContact()获取输入;但当它到达mobilePhone.addContact(newContact)行;它似乎没有在该函数中执行任何操作。这似乎是因为在任何情况下都没有从System.out.println()打印任何内容。

我有另一个函数打印ArrayList中名为printContacts()的所有对象;而且它也不打印:

public void printContacts() {
    System.out.println("Contacts List: ");
    for(int i = 0; i < contacts.size(); i++){
        System.out.println("#" + (i+1) +". " + this.contacts.get(i).getName()
                + " - " + this.contacts.get(i).getNumber());
    }
}

我无法弄清问题是什么。我没有收到错误,我只是没有收到我想要的返回信息。

2 个答案:

答案 0 :(得分:4)

MobilePhone.addContact()中,您拥有在for循环中添加联系人的代码 - 因此每次其他联系人不等时都会添加联系人。< / p>

一开始,没有联系人(我假设),所以它添加联系人......从不。所以没有办法添加任何联系人。您观察到的所有其他问题都可能是由此产生的 - 例如如果你不能添加任何东西,就不会有任何东西要打印。

修正:

public void addContact(Contact contact){
    for(int i = 0; i < this.contacts.size(); i++){
        if(this.contacts.get(i).equals(contact)){
            System.out.println("Contact already exists.");
            return;
        }
    }

    this.contacts.add(contact);
    System.out.println("New contact: " + contact.getName() + " - "
        + contact.getNumber() + " added.");
}

答案 1 :(得分:1)

您不能使用equals()方法来比较两个对象,除非您重写它以执行此操作。默认情况下,如果两个对象的equals()方法是同一个实例,则它们仅返回true。 (字符串在这里是一个例外。)

在您的情况下,由于您可能添加到列表中的潜在新联系对象与任何现有联系对象不同,因此会失败。

对此有两种可能的解决方法:

1.     if(this.contacts.get(i).getName().equals(contact.getName())) 

是一种检查它是否确实与您添加的联系人相同的方法。

  1. 您可以使用Contact对象上的自定义实现覆盖equals()方法。

    Contact {           
    @Override
     public boolean equals(Object obj) {
     if (obj == null) {
       return false;
     }    
    if(this.name.equals(obj.getName()))
      return true;
    else
      return false;
       }
     }
    
  2. 您甚至可以通过姓名和电话号码或任何您想要的内容添加支票。请注意在hashCode()上使用自定义equals()方法的含义。

    请参阅此链接以获取更多信息  What issues should be considered when overriding equals and hashCode in Java?