首页 > 解决方案 > 类中的构造函数不能应用于给定类型

问题描述

我根据 deitel 的“Java 如何编程”一书创建了一个程序。在第 3 章“有所作为”练习中,它说:

(目标心率计算器)创建一个名为 HeartRates 的类。类属性应包括人的名字、姓氏和出生日期(由出生月、日和出生年的单独属性组成)。你的类应该有一个构造函数来接收这些数据作为参数。为每个属性提供 set 和 get 方法。该类还应包括计算并返回人的年龄(以年为单位)的方法、计算并返回人的最大心率的方法以及计算并返回人的目标心率的方法。编写一个提示输入人员信息的 Java 应用程序,实例化 HeartRates 类的对象并打印来自该对象的信息——包括人员的名字,

所以我写了这段代码:

// File: HeartRates.java

public class HeartRates {

    private String firstName;
    private String lastName;
    private int month;
    private int day;
    private int year;

    // constructor
    public HeartRates( String fName, String lName, int aMonth,
        int aDay, int aYear) {

        firstName = fName;
        lastName = lName;
        month = aMonth;
        day = aDay;
        year = aYear;
    }

    // method to set first name
    public void setFirstName( String fName ) {
        firstName = fName;
    }

    // method to get first name
    public String getFirstName() {
        return firstName;
    } 

    // method to set last name
    public void setLastName( String lName ) {
        lastName = lName;
    }

    // method to get last name
    public String getLastName() {
        return lastName;
    }

    // method to set month
    public void setMonth( int aMonth ) {
        month = aMonth;
    }

    // method to get month
    public int getMonth() {
        return month;
    }

    // method to set day
    public void setDay( int aDay ) {
        day = aDay;
    }

    // method to get day
    public int getDay() {
        return day;
    }

    // method to set year
    public void setYear( int aYear ) {
        year = aYear;
    }

    // method to get year
    public int getYear() {
        return year;
    }

    // returns person's age
    public int ageInYears() {
        return 2018 - getYear();
    }

    // returns maximum heart rate
    public int maxHeartRate() {
        return 220 - ageInYears();
    } 

    // display target heart rate
    public String targetHeartRate() {
    // targetHeartRate = range 50% - 85% of maxheartrate
        double fifty = 0.5 * maxHeartRate();
        double eightyFive = 0.85 * maxHeartRate();
        String target = (int)fifty + " BPM - " + (int)eightyFive + " BPM\n"; 
        return target;
    }

} // end class HeartRates

和另一个类来测试它:

// File: HeartRatesTest.java
// Testing heart rate class
import java.util.Scanner;

public class HeartRatesTest {

    public static void main(String[] args) {

        Scanner input = new Scanner( System.in );
        HeartRates profile = new HeartRates();

        String firstName;
        String lastName;
        int month;
        int day;
        int year;

        // collecting user's information
        System.out.print("Enter your first name: ");
        firstName = input.nextLine();
        profile.setFirstName( firstName );

        System.out.print("Enter your last name: ");
        lastName = input.nextLine();
        profile.setLastName( lastName );

        System.out.print("Enter your date of birth(month day year): ");
        month = input.nextInt();
        profile.setMonth( month );
        day = input.nextInt();
        profile.setDay( day );
        year = input.nextInt();
        profile.setYear( year );

        // displaying user's information
        System.out.printf( "\nFirst Name: %s\n", profile.getFirstName() );
        System.out.printf( "Last Name: %s\n", profile.getLastName() );
        System.out.printf( "Date of birth: %d\\%d\\%d\n", 
            profile.getMonth(), profile.getDay(), profile.getYear() );
        System.out.printf( "Age: %d\n", profile.ageInYears() );
        System.out.printf( "Maximum heart rate: %d BPM\n", profile.maxHeartRate() );
        System.out.printf( "Target heart rate: " + profile.targetHeartRate() );

    } // end method main
} // end class HeartRateTest

但我收到此错误消息:

 HeartRatesTest.java:10: error: constructor HeartRates in class
 HeartRates cannot be applied to given types;
                 HeartRates profile = new HeartRates();
                                      ^   required: String,String,int,int,int   
 found: no arguments   reason: actual and
 formal argument lists differ in length 1 error

但我不知道为什么要我输入 String,String,int,int,int。谁能帮我解决这个错误?

标签: java

解决方案


public HeartRates( String fName, String lName, int aMonth, int aDay, int aYear) 类的构造函数 HeartRates有参数String,String,int,int,int

所以你必须在

HeartRates profile = new HeartRates(); // need values as argument

就像是:-

// calling constructor with arguments
HeartRates profile = new HeartRates(firstName, lastName, month, day, year);

修改的HeartRatesTest.java

// File: HeartRatesTest.java
// Testing heart rate class
import java.util.Scanner;

public class HeartRatesTest {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String firstName;
        String lastName;
        int month;
        int day;
        int year;

        // collecting user's information
        System.out.print("Enter your first name: ");
        firstName = input.nextLine(); // no need of setFirstName()

        System.out.print("Enter your last name: ");
        lastName = input.nextLine(); // no need of setLastName()

        System.out.print("Enter your date of birth(month day year): ");
        month = input.nextInt(); // no need of setMonth()
        day = input.nextInt();   // no need of setDay()
        year = input.nextInt();  // no need of setYear()

        /* Object of HeartRates is defined after reading all values */
        HeartRates profile = new HeartRates(firstName, lastName, month, day, year); // calling constructor with arguments

        // displaying user's information
        System.out.printf("\nFirst Name: %s\n", profile.getFirstName());
        System.out.printf("Last Name: %s\n", profile.getLastName());
        System.out.printf("Date of birth: %d\\%d\\%d\n", profile.getMonth(), profile.getDay(), profile.getYear());
        System.out.printf("Age: %d\n", profile.ageInYears());
        System.out.printf("Maximum heart rate: %d BPM\n", profile.maxHeartRate());
        System.out.printf("Target heart rate: " + profile.targetHeartRate());

    } // end method main
} // end class HeartRateTest

当您正确使用构造函数时,您不需要使用那些set-functions. 每个数据插入都可以由您的构造函数完成。

输出 :-

Enter your first name: abc
Enter your last name: def
Enter your date of birth(month day year): 12 25 1998

First Name: abc
Last Name: def
Date of birth: 12\25\1998
Age: 20
Maximum heart rate: 200 BPM
Target heart rate: 100 BPM - 170 BPM

推荐阅读