2016-04-01 20 views
1

Bir Java kursunda nesne yönelimli programlama öğreniyorum ve bir programın üç tür nesne oluşturduğu bir proje yapıyorum: Adres, Tarih ve Çalışan. Program birkaç çalışanın verilerini saklar ve daha sonra verileri bir tür Çalışan çalışanında görüntüler.Başka bir sınıfta statik olmayan bir yönteme statik bir başvuru yapmak

Ben dört farklı sınıflar kullanıyorum: Bir Address sınıf, bir Date sınıf ve bir Employee Sınıf ve diziyi oluşturan bir EmployeeTest sınıfı. İşte

Adres sınıftır:

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

Tarih Sınıfı:

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

Ve Çalışan Sınıf:

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

} 

bu sınıfların tamamı

aynı paketin içindedir (Eclipse kullanıyorum). Çalışan sınıfının noktası, Çalışan tipi bir nesne oluşturmak ve Adres, İsim ve Tarih sınıflarını kullanarak Adres, Ad ve Kiralama Tarihini alabilmektir.

dizi devreye girer yerim burası:

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


    } 

} 

programı dizide saklanacak çalışan sayısına girmesini ister, sonra da büyüklüğü EmployeeAmount bir Employee[] yaratır. Kodun fikri, Dizideki her Çalışan için, diğer sınıflardaki tüm değişkenlerin elde edilmesidir: Çalışan Numarası, Çalışan Adı (ilk ve son), Adres (Sokak Adresi, Şehir, Eyalet Kodu, Posta Kodu), Kiralama Tarihi (Ay, Gün, Yıl). Tüm bunlar elde edildikten sonra, ikinci for döngü her Çalışanın içinden yinelenir ve bilgileri görüntüler.

ben yaşıyorum sorun Employee sınıfında Eclipse getDate(), getName() ve getAddress() yöntemlerde bana bir hata verir olmasıdır. Örneğin, return Date.getDateString(), Eclipse dediğimde, statik olmayan bir yönteme statik bir başvuru yapamadığımı söylüyor. Bu çözüm, getDateString()'u statik yapmaktır ve bunu denedim, ancak sorun, Adres, Çalışan ve Tarih sınıflarındaki tüm yöntemleri ve değişkenleri yaparak değerlerin kilitli olmasıdır. Tüm çalışanlar için aynı verinin gösterileceği anlamına gelir.

İşte demek istediğim. Aşağıda tüm yöntemleri ve değişkenleri statik yapsaydım, bir örnek çıktı var. Yıldız işaretleri arasındaki metin, kullanıcının girdiği şeydir. gösterildiği gibi değişken ve statik yöntemlerin tümü yaparak

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

değerleri programın gereksiz kılan, kilitlenir. Bu problemin çözümü olan var mı? Diğer sınıflardaki yöntemlere başvururken, her çalışanın bilgilerini görüntülemenin bir yoluna ihtiyacım var. Şimdi, normalde tüm değişkenleri ve yöntemleri Employee adı verilen tek bir sınıfta oluşturacağım, ancak ödev yönergeleri bireysel dersler yapmam gerektiğini belirtti.

+1

Çalışanın, bir "Date" ve "Address" (ve muhtemelen bir "Name") örneğinin olması gerekir. – MadProgrammer

+0

Bu örnekler, kullanıcı girişleriyle aynı mı olmalıdır? – LightFlicker

+1

Tüm yöntemlerinizi statik veya değişkenlerinizi yapmayın. Statikleri kaldırın, sınıflarınızın bir örneğini oluşturun ve örneklerde yöntemleri çağırın. – pczeus

cevap

1

For döngüsünün her yinelemesi için bir Name, Address ve Date oluşturuyorsunuz. Ancak yolunuz yok ve bunları her bir Employee örneğine göre ayarlamıyorsunuz.

Her Çalışana ait değerleri ayarlamak ve bilgileri depolamak için yöntemler eklemeniz gerekir. Böyle bir şey: Döngünüzden için, belirlenen değerlerde Sonra

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

: Bu arada

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

, değişkenleri, sadece sınıfları yararlanmak olmamalıdır. Değişkenler deve kasalı olmalıdır.

+0

kullanıcı girdisine yanıt olarak bunları oluşturmanız gerekir. Ve mutabilitenin değişmezliğini tercih etmelisiniz;) – MadProgrammer

+0

Ancak diğer sınıflardaki ayarlayıcı yöntemleri değil misiniz? – LightFlicker

+0

Oh, şimdi anlıyorum. Tamam, teşekkürler şunu deneyeyim. – LightFlicker