2017-02-24 103 views
0

我的數據作業&算法類告訴我們創建一個系統任務工作順序程序。它要求我們執行各種操作,比如向數組添加一個新的SystemTask對象,刪除任務並列出/打印已排序的對象數組。JAVA:Object Array只打印最後一個元素

我已經完成了大部分編碼工作,但是我一直在打印出我的對象數組。看來無論我添加到對象數組中的最後一個數據是什麼,它都會成爲我數組中所有元素的數據。

一些指令:

  • 我的工作訂單()構造函數必須將4默認SystemTask對象在數組中。
  • listSystemTask()方法列出數組中所有SystemTask對象(按順序),前面有一個數字。

注意:請不要告訴我使用List或任何先行java 方法。我的家庭作業有其侷限性。

SystemTask類

public class SystemTask{ 

    private static String month, message; 
    private static int day, hour, minute; 

    //constructor methods 
    public SystemTask(){ 
    month = "Jan"; 
    day = 1; 
    hour = 00; 
    minute = 00; 
    message = "Task Here"; 
    } 

    public SystemTask(String mon, int d, int h, int mnt, String msg){ 
    month = mon; 
    day = d; 
    hour = h; 
    minute = mnt; 
    message = msg; 

    /*setMonth(mon); 
    setDay(d); 
    setHour(h); 
    setMinute(mnt); 
    setMessage(msg);*/ 
    } 

    //get and set methods 
    public static String getMonth(){ 
    return month; 
    } 
    public static int getDay(){ 
    return day; 
    } 
    public static int getHour(){ 
    return hour; 
    } 
    public static int getMinute(){ 
    return minute; 
    } 
    public static String getMessage(){ 
    return message; 
    } 
    public static void setMonth (String mon){ 
    if(mon.length()!= 3) 
     System.out.println("Invalid 3 Letter Code. Try Again."); 
    else 
     month = mon; 
    } 
    public static void setDay(int d){ 
    if(d<1 || d>31) 
     System.out.println("Invalid Day. Try Again."); 
    else 
     day = d; 
    } 
    public static void setHour(int h){ 
    if(h<0 || h>23) 
     System.out.println("Invalid Hour. Try Again."); 
    else 
     hour = h; 
    } 
    public static void setMinute(int mnt){ 
    if(mnt<0 || mnt>59) 
     System.out.println("Invalid Minute. Try Again."); 
    else 
     minute = mnt; 
    } 
    public static void setMessage(String msg){ 
    if(msg.length()<1 || msg.length()>40) 
     System.out.println("Invalid Message. Try Again."); 
    else 
     message = msg; 
    } 

    @Override 
    public String toString(){ 
    return getMonth()+" "+getDay()+", "+String.format("%02d",getHour()) 
      +":"+String.format("%02d",getMinute())+" "+getMessage(); 
    } 
} 

工單類

public class WorkOrders { 

private final SystemTask[] ary = new SystemTask[20]; //declare private 20 objects array 
//public static int index, empty; 

public static void main(String args[]){ 
    WorkOrders object = new WorkOrders();  //create a WorkOrders object 
    object.run();        //call a run method 
} 

public WorkOrders(){ 
    // for(int i = 0;i<ary.length;i++){ 
    //  ary[i] = new SystemTask(); 
    // } 

    /*SystemTask t1 = new SystemTask("Mar", 4, 21, 30, "Backup Users"); 
    ary[0] = t1; 
    SystemTask t2 = new SystemTask("Apr", 1, 17, 0, "Upgrade Hard Drives"); 
    ary[1] = t2; 
    SystemTask t3 = new SystemTask("May", 6, 10, 45, "Virus Scan"); 
    ary[2] = t3; 
    SystemTask t4 = new SystemTask("Jun", 3, 9, 15, "Database Backup"); 
    ary[3] = t4;*/ 

    ary[0] = new SystemTask("Mar", 4, 21, 30, "Backup Users"); 
    ary[1] = new SystemTask("Apr", 1, 17, 0, "Upgrade Hard Drives"); 
    ary[2] = new SystemTask("May", 6, 10, 45, "Virus Scan"); 
    ary[3] = new SystemTask("Jun", 3, 9, 15, "Database Backup"); 
} 

public void run(){ 
    char choice; 
    do{ 
     System.out.println("SYSTEM WORKORDER PROGRAM:"); 
     System.out.println("A)dd SystemTask"); 
     System.out.println("D)elete SystemTask"); 
     System.out.println("L)ist SystemTask"); 
     System.out.println("E)xit"); 
     System.out.print("Select an option: "); 
     choice = UserInput.getChar(); 

     switch (choice) { 
      case 'a': 
      case 'A': 
       //addSystemTask(); 
       break; 
      case 'd': 
      case 'D': 
       //deleteSystemTask(); 
       break; 
      case 'l': 
      case 'L': 
       listSystemTask(); 
       break; 
      case 'e': 
      case 'E': 
       System.out.println("You quit the program."); 
       System.out.println("\nThanks for using System Workorder!"); 
       System.exit(0); 
       break; 
      default: 
       System.out.println("\'" + choice + "\' does not exist. Try    again."); 
       break; 
     } 
     System.out.println(); 
    }while(choice !='E'|| choice !='e'); 
} 

public void listSystemTask(){ 
    System.out.println("\nALL LISTED TASKS"); 
    for(int c=0;c<ary.length;c++){ 
     if(ary[c]!=null) 
      System.out.println(c+1 + ": " + ary[c].toString()); 
    } 
}  

還有一種UserInput類,我做了。我沒有包括它,因爲它僅僅用於我的鍵盤輸入。我省略了一些與我的問題無關的代碼/方法。我只關心打印數組中的對象。

這裏的問題是,這是我所得到的輸出,當我打印的清單:

SYSTEM WORKORDER PROGRAM: 
A)dd SystemTask 
D)elete SystemTask 
L)ist SystemTask 
E)xit 
Select an option: L 

ALL LISTED TASKS 
1: Jun 3, 09:15 Database Backup 
2: Jun 3, 09:15 Database Backup 
3: Jun 3, 09:15 Database Backup 
4: Jun 3, 09:15 Database Backup 

我不知道哪裏出了問題的來源。我懷疑它是在構造函數中初始化數組,但我似乎無法修復它。或者也許在其他地方?

+0

的可能的複製[爲什麼我的ArrayList中包含的最後一個項目的N份添加到列表中?](http://stackoverflow.com/questions/19843506/why-does-my-arraylist-contain- n-copies-of-the-last-item-added-to-the-list) –

+0

順便說一下,你不能將對象添加到數組中。數組有固定大小。所以,你寧願「設置」到陣列 –

回答

3

的問題是與SystemTask

public class SystemTask { 
    private static String month, message; 
    private static int day, hour, minute; 

您已聲明的所有成員變量爲static。將會有多個SystemTask的實例,但它們都將它們的值存儲在相同的static字段中。它正在打印「最後一個SystemTask」,因爲它是最後一個要創建的,覆蓋前一個設置的值。

只需刪除該static聲明...

public class SystemTask { 
    private String month, message; 
    private int day, hour, minute; 

您還定義了所有的訪問方法爲static。從這些中刪除static,以允許它們訪問對象作用域變量。

public static String getMonth() { 
    return month; 
    } 

成爲...

public String getMonth() { 
    return month; 
    } 
+0

非常感謝。這工作。我想我需要學習更多的時候使用'static'關鍵字。 –

+0

@DavidDredddeJesus使用靜態的一般規則是非常RAIRLY :)他們創建了被認爲是反模式的「單身人士」。如果你認爲你需要一個單身人士,通常有辦法避免它們,或者減少你實際需要的人數。網絡上有很多關於單身人士的爭論和利弊。 – slipperyseal