2009-12-10 64 views
0
public class Start { 
    public Register theReg = new Register(); 
    public static Start go = new Start(); 

    public static void main(String[] args) { 
     Register theReg = new Register(); 
     go.regUsers(); 

     if(theReg.logIn("jsmith","password")) { 
      System.out.println("You're logged in as " + 
           theReg.userLoggedIn.getName()); 
     } else { 
      System.out.println("dang"); 
     } 
    } 

    public void regUsers() { 
     Student regJoe = 
      theReg.regSeniorStaff("Joe smith", "password", "jsmith", 1); 
    } 
} 

public class Register { 
    public ArrayList<People> users; 
    public People userLoggedIn; 

    public Register() { 
     users = new ArrayList<People>(); 
     users.add(new Student("john","password","jo",1)); 
     userLoggedIn = null; 
    } 

    public Student regStudent(String name, String password, 
      String username, int stuId) { 
     Student s = new Student(name, password, username, stuId); 
     users.add(s); 
     return s; 
    } 
} 

我想我錯過了一些愚蠢的東西。像....Java ArrayList不允許我從外部構造函數中添加

啓動方法將創建一個新的Register對象,其中有ArrayList。然後稍微向下,開始使用regStudent等方法註冊用戶。但是,只有Register上的構造函數才允許我將對象添加到ArrayList;調用方法稍後做同樣的事情就是不添加它們。它創建對象但不能添加它們。也不能刪除的東西,只有.get在他們的作品。

任何幫助將是偉大的,謝謝!

+2

您是否看到錯誤?如果是這樣,那是什麼? – 2009-12-10 22:21:01

+0

沒有錯誤,基本上如果我從類外調用regStudent方法(創建了一個新的註冊對象),該方法創建新的學生對象,但無法將其添加到列表中。 構造函數中的users.add(...)部分工作,只是從來沒有在類中的任何其他方法。 – graeme 2009-12-10 22:22:36

+3

向我們展示您調用regStudent的代碼,然後檢查結果。 – 2009-12-10 22:24:19

回答

3

它看起來好像你隱藏你的theReg全球變種。你很可能會查詢全局,並看到只有構造函數添加的項目在你的ArrayList中。

public class Start { 
    public Register theReg = new Register(); //<<---- your global var 
    public static Start go = new Start(); 

    public static void main(String[] args) { 
     Register theReg = new Register(); // <<---- hiding the global 
     go.regUsers(); 

     if(theReg.logIn("jsmith","password")) 
      System.out.println("You're logged in as " + theReg.userLoggedIn.getName()); 
     else 
      System.out.println("dang"); 
    } 
} 
+0

這是問題,謝謝指出。我以前不知道/沒有意識到的東西! – graeme 2009-12-10 22:45:20

1

你知道如何使用類嗎?這個例子中的命名沒有多大意義。爲什麼「註冊」具有「userLoggedIn」「People」對象?如果那是一個「人」的對象,它會更有意義嗎?

Register r = new Register(). 
r.regStudent(...); 
r.regStudent(...); 

應該可以正常工作。

我的猜測是,你有這樣的事情:

public static void registerStudent() 
{ 
    Register r = new Register(); 
    r.add(...); 
} 

我說得對不對?

你以爲我們可以閱讀頭腦,所以我給了它一個鏡頭。這聽起來像你可能反覆實例化你的註冊對象,而不是實際持有一個引用並調用它的方法。那會產生你描述的行爲。

編輯: 看起來你不知道如何使用類。這裏有一個教程:
http://java.sun.com/docs/books/tutorial/java/javaOO/classes.html

+0

不,實際上你做的方式首先是我如何做到這一點(在更新的問題中顯示,我添加了更多的代碼)。我所提出的代碼並不是全部2個班級,其餘的班級不應該真正幫助解決我認爲沒有的問題,而是讓事情複雜化。感謝您的輸入。 – graeme 2009-12-10 22:36:16

+1

我仍然認爲你應該閱讀某種OOP教程。你的設計沒有意義。如果註冊會員持有註冊學生名單,一次只能有一個人登錄嗎?類名「Register」,「Start」和「People」與他們實際的實際意義不符,您的方法和變量命名約定需要幫助。 我一直在努力,但是你的代碼需要認真的工作。 – 2009-12-10 23:04:54

2

這將是學習如何使用調試器的好時機。 Eclipse有一個很好的調試器;您可以在行users.add(s)上設置斷點並檢查列表users的內容。

您可能還想仔細檢查一下您的regStudent方法是否在執行過程中被調用。如果您使用的是Eclipse,那麼可以右鍵單擊並在工作區中找到對該方法的所有引用,並確保在執行過程中調用其中的一個。

+0

謝謝,我曾嘗試運行調試器(我使用eclipse)。我會再去一次。 – graeme 2009-12-10 22:39:51

1

你的錯誤是,你有變量名theReg - 一個是Start類的一個實例成員,在main()方法的其他局部變量。然後,您將一個人添加到其中一個Register實例中,並詢問另一個人是否已添加此人。

+0

你是對的先生!謝謝你,非常感謝! – graeme 2009-12-10 22:41:59

相關問題