java - 类中的构造函数不能应用于给定类型
问题描述
我根据 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。谁能帮我解决这个错误?
解决方案
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
推荐阅读
- s4sdk - DestinationAccessException 在 Cloud Foundry 环境中使用 S4 SDK 执行 ODATA V2 调用时出错
- makefile - make - 仅在需要时创建中间文件
- docker - Kafka Producer 中的代理列表参数错误
- xamarin - Action.Picker returns invalid/wrong Uri (How to get path or byte[] from multiple picked gallery img)
- javascript - 使用 Javascript 动态创建行,然后发送到 Flask。没有信息被传输
- php - codeigniter中的ftp连接问题
- reactjs - Eslint airbnb 和 prettier config 删除文本中点后的所有空格
- c# - 处理 Web api 的会话
- android - android 谷歌地图语言作为区域设置语言
- apache-spark - 如何从 Apache spark 2 中的 excel 文件中读取多张工作表