2016-04-01 32 views
1

私は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()); 
     } 


    } 

} 

プログラムは、配列に格納する従業員の数をユーザに促し、その後、サイズEmployeeAmountEmployee[]を作成します。コードの考え方は、配列内の各従業員に対して、従業員番号、従業員名(最初と最後)、住所(住所、市区町村、州コード、郵便番号)、その他のクラスのすべての変数が取得されます。雇用日(月、日、年)。これがすべて得られたら、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つのクラスの下に作成しますが、割り当て手順では個別のクラスを作成する必要があることが指定されています。

+1

従業員は、自分自身の 'Date'と' Address'(おそらくは 'Name')のインスタンスを持っていなければなりません – MadProgrammer

+0

これらのインスタンスはユーザーの入力と同じですか? – LightFlicker

+1

すべてのメソッドを静的にしたり、変数にしたりしないでください。静的メソッドを削除し、クラスのインスタンスを作成し、インスタンス上でメソッドを呼び出します。 – pczeus

答えて

1

forループの繰り返しごとにName,AddressおよびDateを作成しています。しかし、あなたは道ではなく、それぞれEmployeeインスタンスに設定することもありません。

各従業員の値を設定して情報を格納するメソッドを追加する必要があります。その後

public class Employee { 
    private int employeeNum; 
    private Name name; 
    private Date hireDate; 
    private Address address; 


    public void setEmployeeNum(int eNum){ 
     employeeNum = eNum; 
    } 

    public int getEmployeeNum(){ 
     return employeeNum; 
    } 

    public void setHireDate(Date date){ 
     this.hireDate = date; 
    } 

    public String getHireDate(){ 
     return hireDate.getDateString(); 
    } 

    public void setName(Name n){ 
     this.name = n; 
    } 

    public String getName(){ 
     return name.getEmployeeName(); 
    } 

    public void setAddress(Address addy){ 
     this.address = addy; 
    } 

    public String getAddress(){ 
     return address.getEmployeeAddress(); 
    } 
} 

あなたのforループでは、値を設定します:このような何か

EmployeeArray[i].setName(EmployeeName); 
    EmployeeArray[i].setAddress(EmployeeAddress); 
    EmployeeArray[i].setHireDate(HireDate); 

ところで、あなたは、クラスのみを変数を生かすべきではありません。 変数にはラクダが必要です。

+0

そして、あなたは可変性の不変性を優先すべきです;) – MadProgrammer

+0

他のクラスには既にセッターメソッドがありますか? – LightFlicker

+0

ああ、私は今参照してください。よろしくお願いします。 – LightFlicker

関連する問題