私はJavaコースでオブジェクト指向プログラミングを学習しています。私は、プログラムが3つのタイプのオブジェクト、Address、Date、および従業員。このプログラムは、複数の従業員のデータを格納し、Employee型の配列にデータを表示します。別のクラスの非静的メソッドへの静的参照の作成
私は、4つの異なるクラスに使用しています:Address
クラス、Date
クラス、およびEmployee
クラス、および配列を作成EmployeeTest
クラスを。ここで
は、Addressクラスである:
public class Address {
private String Street;
private String City;
private String State;
private int ZipCode;
public Address(String St, String Ci, String Sta, int Zip){
Street = St;
City = Ci;
State = Sta;
ZipCode = Zip;
}
public String getEmployeeAddress(){
return (Street + ", " + City + ", " + State + " " + ZipCode);
}
}
Dateクラス:
public class Date {
private int Month;
private int Day;
private int Year;
public Date(int M, int D, int Y){
Month = M;
Day = D;
Year = Y;
}
public String getDateString(){
return (Month + "/" + Day + "/" + Year);
}
}
そして、従業員クラス:これらのクラスの
public class Employee {
private int EmployeeNum;
public void setEmployeeNum(int ENum){
EmployeeNum = ENum;
}
public int getNum(){
return EmployeeNum;
}
public String getDate(){
return Date.getDateString();
}
public String getName(){
return Name.getEmployeeName();
}
public String getAddress(){
return Address.getEmployeeAddress();
}
}
すべてが同じパッケージに含まれています(私はEclipseを使用しています)。 Employeeクラスのポイントは、Employee型のオブジェクトを作成し、Address、Name、およびHireDateをAddressクラス、Nameクラス、およびDateクラスを使用して取得できるようにすることです。
配列が場に出た場所はここにある:
import java.util.Scanner;
import java.lang.*;
public class EmployeeTest {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("How many employees will have their data stored today?");
int EmployeeAmount = Integer.parseInt(input.nextLine());
Employee [] EmployeeArray = new Employee[EmployeeAmount];
for (int i = 0; i < EmployeeArray.length; i ++){
System.out.print("What is employee " + (i+1) + "'s employee number?");
int EmployeeNumber = Integer.parseInt(input.nextLine());
EmployeeArray[i] = new Employee();
EmployeeArray[i].setEmployeeNum(EmployeeNumber);
System.out.println("What is the first name of employee " + EmployeeNumber + "?");
String EmployeeFirstName = input.nextLine();
System.out.println("What is the last name of employee " + EmployeeNumber + "?");
String EmployeeLastName = input.nextLine();
Name EmployeeName = new Name(EmployeeFirstName, EmployeeLastName);
System.out.println("Please enter the street address: ");
String StreetAddress = input.nextLine();
System.out.println("Please enter the name of the city: ");
String CityName = input.nextLine();
System.out.println("Please enter the two character code for the state: ");
String StateID = input.nextLine();
System.out.println("Please enter this address's zip code: ");
int ZipCode = Integer.parseInt(input.nextLine());
Address EmployeeAddress = new Address(StreetAddress, CityName, StateID, ZipCode);
System.out.println("Finally, what was the month(#) of the hire date?");
int Month = Integer.parseInt(input.nextLine());
System.out.println("What was the day(#)?");
int Day = Integer.parseInt(input.nextLine());
System.out.println("What was the year?");
int Year = Integer.parseInt(input.nextLine());
Date HireDate = new Date(Month, Day, Year);
}
for (int j = 0; j < EmployeeArray.length; j ++){
System.out.println("Employee number: " + EmployeeArray[j].getNum());
System.out.println("Employee Name: " + EmployeeArray[j].getName());
System.out.println("Employee Address: " + EmployeeArray[j].getAddress());
System.out.println("Employee Hiredate: " + EmployeeArray[j].getDate());
}
}
}
プログラムは、配列に格納する従業員の数をユーザに促し、その後、サイズEmployeeAmount
のEmployee[]
を作成します。コードの考え方は、配列内の各従業員に対して、従業員番号、従業員名(最初と最後)、住所(住所、市区町村、州コード、郵便番号)、その他のクラスのすべての変数が取得されます。雇用日(月、日、年)。これがすべて得られたら、2番目のfor
ループが各従業員を繰り返して情報を表示します。
私が午前問題はEmployee
クラスでは、Eclipseは、私にgetDate()
でエラーが発生しますgetName()
、およびgetAddress()
方法ということです。例えば、return Date.getDateString()
と言うと、Eclipseでは、非静的メソッドへの静的リファレンスを作成できないと言われています。解決策は、getDateString()
を静的にすることです。これを試しましたが、問題はAddress、Employee、およびDateクラスのすべてのメソッドと変数を作成することで値がロックされることです。すべての従業員に同じデータが表示されることを意味します。
ここに私の言いたいことがあります。以下は、すべてのメソッドと変数を静的にした場合のサンプル出力です。アスタリスク間のテキストは、ユーザーが入力したものです。静的変数とメソッドのすべてをすることにより
How many employees will have their data stored today?**2** What is employee 1's employee number?**1** What is the first name of employee 1? **Bob** What is the last name of employee 1? **Jones** Please enter the street address: **300 1st Avenue** Please enter the name of the city: **New York** Please enter the two character code for the state: **NY** Please enter this address's zip code: **10001** Finally, what was the month(#) of the hire date? **1** What was the day(#)? **1** What was the year? **2001** What is employee 2's employee number?**2** What is the first name of employee 2? **Bobby** What is the last name of employee 2? **Robinson** Please enter the street address: **301 1st Avenue** Please enter the name of the city: **Los Angeles** Please enter the two character code for the state: **CA** Please enter this address's zip code: **90001** Finally, what was the month(#) of the hire date? **1** What was the day(#)? **2** What was the year? **2004** Employee number: 2 Employee Name: Bobby Robinson Employee Address: 301 1st Avenue, Los Angeles, CA 90001 Employee Hiredate: 1/2/2004 Employee number: 2 Employee Name: Bobby Robinson Employee Address: 301 1st Avenue, Los Angeles, CA 90001 Employee Hiredate: 1/2/2004
示すように、値は、プログラムが無駄になりれ、ロックされています。誰にもこの問題の解決策がありますか?他のクラスのメソッドを参照しながら、各従業員の情報を表示する方法が必要です。さて、通常、私はすべての変数とメソッドをEmployee
という1つのクラスの下に作成しますが、割り当て手順では個別のクラスを作成する必要があることが指定されています。
従業員は、自分自身の 'Date'と' Address'(おそらくは 'Name')のインスタンスを持っていなければなりません – MadProgrammer
これらのインスタンスはユーザーの入力と同じですか? – LightFlicker
すべてのメソッドを静的にしたり、変数にしたりしないでください。静的メソッドを削除し、クラスのインスタンスを作成し、インスタンス上でメソッドを呼び出します。 – pczeus