【问题标题】:Having trouble with constructors and user-input构造函数和用户输入有问题
【发布时间】:2017-10-26 13:27:53
【问题描述】:

我正在做一个小项目,但遇到了麻烦。它与创建类、构造函数等有关。对于类,所有数据字段都必须是私有的。我还必须有两个构造函数,一个是默认的,一个是参数化的。这是课程:

public class PetInfo {

    private String petName = "na";
    private boolean petType = true;
    private String petBreed = "na";
    private double petAge = 0;
    private double petWeight = 0;
    private String ownerName = "na";

    public PetInfo(){}

    public PetInfo(String name, boolean type, String breed, double age, double weight, String owner){
        this.petName = name;
        this.petType = type;
        this.petBreed = breed;
        this.petAge = age;
        this.petWeight = weight;
        this.ownerName = owner;
    }

    public String getName (){
        return petName;
    }

    public void setName(String name){
        petName = name;
    }

    public boolean getType(){
        return petType;
    }

    public void setType(boolean type){
        petType = type;
    }

    public String getBreed(){
        return petBreed;
    }

    public void setBreed(String breed){
        petBreed = breed;
    }

    public double getAge(){
        return petAge;
    }

    public void setAge(double age){
        petAge = age;
    }

    public double getWeight(){
        return petWeight;
    }

    public void setWeight(double weight){
        petWeight = weight;
    }

    public String getOwner(){
        return ownerName;
    }

    public void setOwner(String owner){
        ownerName = owner;
    }
}

这是我的主要功能:

import java.util.Scanner;
public class Pp1_C00019540 {

    public static void main(String[] args) {
        PetInfo[] info = new PetInfo[5];
        collectInfo(info);
    }
    public static void collectInfo(PetInfo[] info){
        Scanner input = new Scanner(System.in);
        for(int i = 0; i < info.length;i++){
            System.out.print("Enter pet name: "); 
        }
    }
}

所以它会打印“输入宠物名:”,但它不会让我输入名字。我试着做:

    info[i] = new PetInfo(input.nextLine());

但它告诉我“构造函数 PetInfo.PetInfo(String, boolean, String, double,double, String) 不适用。实际参数和形式参数的长度不同。”我的课有什么问题我没听懂吗?我测试了它,它似乎工作正常。

而且我不是在寻找一个明确的答案,我很可能会自己弄清楚。我只是不确定发生了什么,尤其是当我向构造函数传递正确的参数时,这似乎会起作用。

【问题讨论】:

  • 这很简单。没有 PetInfo 构造函数需要单个 String 参数。
  • “它告诉我“构造函数 PetInfo.PetInfo(String, boolean, String, double,double, String) 不适用” - 正确,因为你只传递给构造函数一个字符串:@987654326 @
  • @shmosel 我没有使用过具有多个参数的构造函数。因此,即使我在参数化构造函数中传递了 String,我仍然必须创建一个特定的 PetInfo 构造函数,它需要一个参数?我假设这对于 boolean 和 double 参数也同样有效?
  • 目前还不完全清楚您要做什么。如果要单独分配每个字段,可以使用零参数构造函数,然后调用设置器。或者您可以收集变量中的所有内容并将它们全部传递给多参数构造函数。或者您可以创建其他构造函数。这取决于你。
  • @shmosel 我必须有一个默认构造函数和一个参数化构造函数,并且对 new 的调用必须导致所有类数据成员都被初始化。所以看起来我需要使用多参数构造函数

标签: java arrays constructor user-input


【解决方案1】:

基本上,您的代码试图调用将单个字符串作为输入的PetInfo 构造函数。但是根据您拥有的代码,不存在这样的构造函数。您只有PetInfo 的大型多参数构造函数。在调用构造函数之前,您需要多次调用扫描仪进行输入。请看下面的代码:

private static void collectInfo(PetInfo[] info) {
    Scanner input = new Scanner(System.in);
    try {
        for (int i = 0; i < info.length; i++) {
            System.out.print("Enter pet name: ");
            String petName = input.nextLine();
            System.out.print("Enter pet type: ");
            boolean petType = input.nextBoolean();
            input.nextLine();
            System.out.print("Enter pet breed: ");
            String petBreed = input.nextLine();
            System.out.print("Enter pet age: ");
            double petAge = input.nextDouble();
            input.nextLine();
            System.out.print("Enter pet weight: ");
            double petWeight = input.nextDouble();
            input.nextLine();
            System.out.print("Enter pet owner: ");
            String petOwner = input.nextLine();
            info[i] = new PetInfo(petName, petType, petBreed, petAge, petWeight, petOwner);
        }
    }
    finally {
        input.close();
    }
}

希望上面的代码可以很好地说明我在说什么。另外,不要忘记在拨打nextBoolean()nextDouble() 之后拨打input.nextLine()。最后,不要忘记关闭您的 input 扫描程序以避免资源泄漏。

希望对您有所帮助。

【讨论】:

  • 太棒了!在 cmets 中向 OP 解释这个,懒得打字。干得好!
  • @Saramali 谢谢你的笑声。 :-)
  • 我是个白痴。这很有意义。谢谢@Saramali,谢谢@entpnerd!我真的很感谢您的帮助
  • @ANewProgrammer 不,你不是。你是一个新程序员。 :-) 继续努力。继续发帖。不要让火鸡让你失望。 :-)
【解决方案2】:

这很简单,当您使用扫描仪输入时。它接受字符串中的输入,因为没有这样的构造函数将字符串作为参数,它会给你一个错误。

您需要从扫描仪获取相应数据类型的输入,将它们存储在变量中,然后调用构造函数。我认为您要做的是在从扫描仪获取逗号分隔输入的同时调用构造函数,这是不可能的。

【讨论】:

  • 我明白你在说什么,这是有道理的。但是如何将这些变量添加到数组中?
  • 您创建了一个宠物信息对象。首先,您应该更改名称。类名应该是 Pet 而数组名应该是 myPets 之类的。无论如何,您使用构造函数创建一个对象,然后您可以将该对象添加到数组中。
  • 希望你能理解
  • 那么你是说在for循环中,我基本上将输入存储在变量中,然后使用构造函数制作另一个对象?
  • 不,在 for 循环中,您可以在各个变量中输入输入,创建一个对象并将该对象添加到数组中。所有这些都将是一个循环的迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2018-02-13
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多