当前位置: 首页 > 知识库问答 >
问题:

试图在main中的静态方法中从对象运行公共方法,但不起作用

赵钊
2023-03-14

好的,我有一个我正在创建的小程序叫做移动电话。它有三个类:Main.java、Contact.java和MobilePhone.java.

主要的java使用扫描器执行静态方法,通过电话菜单显示和返回信息。联系java是一个简单的类,它将姓名和号码存储为联系人。手机。java有as ArrayList,它将Contact类中的对象存储为contacts,然后有几个方法,比如addContact();removeContact();queryContact();修改联系人();等

我遇到的问题是,我主要运行这些静态方法。java和其中一些调用MobilePhone中的公共非静态方法。java,它们似乎没有执行方法中的所有代码。下面是一个例子:

总的来说。java我有一个名为addContact()的方法;如下所示:注意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);
}

MobiePhone.add联系人();看起来像这样:

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();但当它到达移动电话线路时。addContact(新联系人);它似乎不执行该函数中的任何操作。这似乎是因为两个系统都没有打印任何内容。出来println()在任何情况下。

我有另一个函数,用于打印ArrayList中的所有对象,称为printContact();它也不打印:

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个答案

吕淮晨
2023-03-14

您不能使用equals()方法来比较两个对象,除非您重写它来这样做。默认情况下,两个对象的equals()方法只有在它是相同的实例时才返回true。(字符串在这里是例外。)

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

有两种可能的修复方法:

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

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

您可以使用联系人对象上的自定义实现重写equals()方法。

Contact {           
@Override
 public boolean equals(Object obj) {
 if (obj == null) {
   return false;
 }    
if(this.name.equals(obj.getName()))
  return true;
else
  return false;
   }
 }

你甚至可以通过姓名和电话号码或任何你想要的方式在支票上加一张支票。请注意在hashCode()上使用自定义equals()方法的含义。

请参考此链接了解更多信息,在Java中重写equals和hashCode时应该考虑哪些问题?

万俟均
2023-03-14

手机中。addContact(),您有在for循环中添加联系人的代码,因此每当已经存在的另一个联系人不相等时,它就会添加联系人。

一开始,没有联系人(我假设),所以它添加了联系人...从来没有。所以没有办法添加任何联系人。你观察到的所有其他问题都可能是这种情况的后果——例如,如果你不能添加任何东西,就永远不会有任何东西可以打印。

修正:

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.");
}
 类似资料:
  • 我知道这个问题之前也提出过,我已经阅读了所有关于它们的内容,但仍然没有找到解决这个错误的方法。谁能帮我解决这个问题吗? 尝试了一切,运行这段代码。同样在cmd中运行,仍然会得到相同的错误。虽然main包含在这个程序中,但为什么它仍然给我错误? 错误:在类测试中未找到Main方法,请将Main方法定义为:public static void Main(String[]args)或JavaFX应用程序

  • 我编写了一个Java类,在这个类中尝试访问FTP。 我在Eclipse上工作,我想对它进行一个Junit测试。我知道如何测试公共类,但我仍然停留在测试静态void main方法上。 我开始像这样创建ftptest.java: 如有任何帮助,我们将不胜感激。 谢谢!

  • 我有一个关于静态方法访问的问题。我有一个类,其中有4个静态方法。如代码所示: } 我正在从下面的代码调用来自onLoadShipperDetailsListCtrl()的setSortingEnable()方法: } 因此,如果我从其他类调用setSortingEnabled()方法,我会认为它是公共的,而其他方法是私有的,但它会给我一个错误:Java . lang . nosuchmethode

  • 问题内容: 首先,如果这是一个非常愚蠢的问题,请原谅我,我只是想学习这种语言的核心。我正在阅读《有效的Java》,并且第一章讨论了静态工厂方法与构造方法。他们的利弊。令我困惑的几件事是: 静态工厂方法返回的对象的类是非公共的 -究竟是什么意思? 与构造函数不同,每次调用静态工厂方法都不需要创建新对象 -这是怎么发生的?我仅调用工厂方法来获取新对象,是否将检查方法放入工厂方法中以检查对象是否已存在?

  • 问题内容: 我有以下代码: 运行此命令时,我不断收到错误消息: 怎么解决呢? 问题答案: 您正在将 未绑定的 对象存储在字典中。通过访问名称作为类或实例上的属性,此类对象(以及对象,函数和对象)仅通过描述符协议进行绑定。直接访问类主体中的对象不是属性访问。 在 创建类 之后 创建字典(以便您将它们作为属性访问),或者显式绑定,或者在将它们存储在字典中之前提取原始函数。 注意,对对象的“绑定”仅意味

  • 问题内容: 尝试在页面对象中使用静态方法时,我遇到了NullPointerExceptions的麻烦。如果我使用非静态方法进行操作,则效果很好。 非静态版本: 这很好。日期字段已设置。 静态版 这不起作用,并在标有“ *”的行(访问WebElement的行)上导致java.lang.NullPointerException。 我有点喜欢在测试中使用像这样的静态方法,因为我并没有真正看到它的问题,它