2016-04-01 13 views
1

Ich lerne objektorientierte Programmierung in einem Java-Kurs und mache ein Projekt, bei dem ein Programm drei Arten von Objekten erstellt: Adresse, Datum und Mitarbeiter. Das Programm speichert Daten von mehreren Mitarbeitern und zeigt die Daten dann in einem Array vom Typ Employee an.Eine statische Referenz auf eine nicht statische Methode in einer anderen Klasse erstellen

Ich bin mit vier verschiedenen Klassen: eine Address Klasse, eine Date Klasse und eine Employee Klasse und eine EmployeeTest Klasse, die das Array erzeugt. Hier

ist die Adressklasse:

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); 
    } 
} 

Das Datum Klasse:

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); 
    } 
} 

Und die Mitarbeiter-Klasse:

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

} 

Alle diese Klassen im selben Paket sind (Ich benutze Eclipse). Der Punkt der Employee-Klasse besteht darin, ein Objekt vom Typ Employee zu erstellen und die Adresse, den Namen und das HireDate mit den Klassen Address, Name und Date abzurufen.

Der Ort, wo das Array ins Spiel kommt, ist hier:

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


    } 

} 

Das Programm den Benutzer auf, die Anzahl der Mitarbeiter aufgefordert, in dem Array gespeichert werden, dann ist ein Employee[] der Größe EmployeeAmount schafft. Die Idee des Codes ist, dass für jeden Mitarbeiter im Array alle Variablen in den anderen Klassen erhalten werden: Mitarbeiternummer, Mitarbeitername (zuerst und zuletzt), Adresse (Adresse, Stadt, Bundesland, Postleitzahl), Mietdatum (Monat, Tag, Jahr). Nachdem das alles erreicht ist, durchläuft die zweite for Schleife jeden Mitarbeiter und zeigt die Informationen an.

Das Problem, das ich habe ist, dass in der Employee Klasse Eclipse gibt mir einen Fehler in den getDate(), getName() und getAddress() Methoden. Wenn ich zum Beispiel return Date.getDateString() sage, sagt Eclipse, dass ich keinen statischen Verweis auf eine nicht statische Methode machen kann. Die Lösung besteht darin, getDateString() statisch zu machen, und ich habe das versucht, aber das Problem besteht darin, dass die Werte gesperrt werden, indem alle Methoden und Variablen in den Klassen Address, Employee und Date gemacht werden. Dies bedeutet, dass für alle Mitarbeiter dieselben Daten angezeigt werden.

Hier ist was ich meine. Unten ist eine Beispielausgabe, wenn ich alle Methoden und Variablen statisch gemacht habe. Der Text zwischen den Sternchen ist was der Benutzer eingibt.

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

Durch alle Variablen und Methoden machen statischen, werden die Werte, wie dargestellt, verschlossen, welches das Programm unbrauchbar macht. Hat jemand eine Lösung für dieses Problem? Ich brauche eine Möglichkeit, die Informationen jedes Mitarbeiters anzuzeigen, während ich auf die Methoden in den anderen Klassen verweise. Nun würde ich normalerweise alle Variablen und Methoden unter einer Klasse namens Employee erstellen, aber die Zuweisungsanweisungen geben an, dass ich einzelne Klassen erstellen muss.

+1

Der Mitarbeiter sollte eine Instanz eines "Datums" und einer "Adresse" (und vermutlich eines "Namens") haben. – MadProgrammer

+0

Also sollten diese Instanzen die gleichen wie die Benutzereingaben sein? – LightFlicker

+1

Machen Sie nicht alle Ihre Methoden statisch oder Ihre Variablen. Entfernen Sie static, erstellen Sie eine Instanz Ihrer Klassen und rufen Sie Methoden für die Instanzen auf. – pczeus

Antwort

1

Sie erstellen für jede Iteration der for-Schleife einen Name, Address und Date. Aber Sie haben keinen Weg, noch setzen Sie sie auf jede Employee Instanz.

Sie müssen Methoden hinzufügen, um die Werte für jeden Mitarbeiter festzulegen und die Informationen zu speichern. Etwas wie folgt aus:

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

Dann in Ihrer for-Schleife, stellen Sie die Werte:

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

By the way, sollten Sie keine Variablen Kapital zu schlagen, nur Klassen. Variablen sollten mit Kamelen besetzt sein.

+0

Und Sie sollten Unveränderlichkeit der Wandlungsfähigkeit bevorzugen;) – MadProgrammer

+0

Aber sind die Setter-Methoden nicht bereits in den anderen Klassen? – LightFlicker

+0

Oh, ich sehe jetzt. Alles klar, danke, lass mich das versuchen. – LightFlicker