2013-07-12 100 views
2

這是一項家庭作業,也是我的第一個Java程序。我寫了一個StudentAverage類,現在我想測試類方法,但是當我編寫我的測試程序時,IDE告訴我不能聲明我的主要靜態方法。我使用Eclipse作爲我的IDE。無法實現類的測試程序

由於這是一項家庭作業,我仍然在學習Java,所以我也希望得到一些關於我在做什麼錯誤的指導。

這裏是我的代碼:

/** 
*Program:  StudentAverage, Calculate the student average quizzes taken 
* @author:  Jose Mazorra 
* Date:  July 11, 2013 
* Class:  CIS406 
*/ 

/** 
    A student who is taking quizzes. 
*/ 
public class StudentAverage 
{ 
    //Instances variables 
    private String name; 
    private double quizScores; 
    private double numOfQuizzesTaken; 

    /** 
     Constructs a student with a given name. 
     @param n the name 
    */ 
    public StudentAverage(String stuName) 
    { 
    name = (stuName); 
    } 

    /** 
     Gets the name of this student. 
     @return the name 
    */ 
    public String getName() 
    { 
    return name; 
    } 

    /** 
     Adds a quiz score. 
     @param score the score to add 
    */ 
    public void addQuiz(int score) 
    { 
    numOfQuizzesTaken++; 
    quizScores = quizScores + score; 
    } 


    /** 
     Gets the sum of all quiz scores. 
     @return the total score 
    */ 
    public double getTotalScore() 
    { 
    return quizScores; 
    } 

/**Returns the average of all quiz taken 
* by the student 
* @return average score 
*/ 

public double getAverageScore(){ 

double avgScore; 

avgScore = (quizScores/numOfQuizzesTaken); 

return avgScore; 

} 

public class StudentAverageTester{ 

    public static void main(String[] args){ 

     StudentAverage student = new StudentAverage() 

     student.name("Jose"); 
     student.numOfQuizzesTaken(10); 
     student.quizScores(400); 

     double avg = student.avgScore(); 

     System.out.println(name); 
     System.out.println(avg); 
     System.out.println("Expected 40"); 



    } 


} 

} 
+1

這兩個公共類都在同一個文件中嗎? –

+6

刪除第二個類中的public關鍵字或將其移到它自己的單獨文件 – Andy

+2

考慮閱讀jUnit並使用它來測試您的代碼。 –

回答

1

你正在創建一個類另一個class.I不認爲你打算做that.Also如果這兩個類都在一個文件中只有一個類可以是公共.Better每個類移動到其單獨的文件

更新:

所以這裏的問題是,你正在創建內部類和Java中 內部類不能有靜態方法。因爲內部類是 隱含地與其外部類的實例相關聯,所以它不能自己定義任何靜態方法。由於靜態嵌套類不能直接引用在其封閉類中定義的實例變量或方法,因此它只能通過對象引用來使用它們,因此在靜態嵌套類中聲明靜態方法是安全的。

+1

*你正在創建另一個班級*我建議重新考慮你要寫什麼,這句話沒有太多意義。你可以在一個java文件中有幾個類,但是其中只有一個類可以是'public'類'(如果這就是你想說的話)。 –

+0

@LuiggiMendoza我說另一個類只是嵌套類的術語。考慮到提問者正在編寫他的第一個Java代碼,你不會指望他編寫嵌套類。關於每個文件的一個公共類,這是我實際上說的在我的答案中。 – Algorithmist

+1

當我開始我的Java學習時,我創建了內部類,而不知道它們對應用程序設計的實際影響,因爲我使它工作就足夠了:)。當然,現在我知道不是這樣,我更希望OP的這個想法很清楚。此外,OP表示* IDE告訴我,我不能聲明我的主要靜態*(順便提一下,這很奇怪),而不是公共類型必須在它自己的文件中定義* 2個「公共」課程在同一個文件中。 –

2

您已創建StudentAverageTester作爲StudentAverage的非靜態內部類。非靜態內部類不允許有static聲明,這就是您看到編譯錯誤的原因(請參閱JLS 8.1.3)。

如果您將StudentAverageTester類提取到它自己的StudentAverageTester.java文件中,那真的會更好。

2

你的代碼有一些錯誤。首先,做每個人都要做的事,並把StudentAverageTester放在自己的文件中。目前,您正在申報StudentAverage課程。您也沒有在您的StudentAverage類中聲明無參數構造函數。在StudentAverageTester你有

StudentAverage student = new StudentAverage() 

,但它應該是

StudentAverage student = new StudentAverage("Some name") 

你也忘了分號。

UPDATE

name財產是私有的。您不能像StudentAverageTester那樣訪問它。您需要聲明一個setter方法,如setName(String name)

請考慮檢查您的StudentAverageTester類。您正在調用您未直接定義和訪問私人成員的方法。你不能那樣做。使用setters和getters。

+1

實際上,如果您將'static'標記添加到'StudentAverageTester',您將看到其他編譯器錯誤消息,並在修復它們之後,程序將按預期編譯和運行。 –

+0

@LuiggiMendoza哦,是的,有很多錯誤。我會爲他解決它。我去過那兒。 – Andy

+0

IMO修復OP的錯誤是他功課的一部分,所以最好是幫助他解決問題而不是解決他/她的任務。主要的問題是在內部類中使用「靜態」方法(正如喬納森的回答指出的那樣)。 –

0

謝謝大家的意見和建議。這真的很有幫助。我遵循了這些建議並創建了2個文件。一個用於我的測試人員,另一個用於主要班級。

這裏是我的測試類代碼

class StudentTester { 

    public static void main (String[] args){ 

     StudentAverage testAverage = new StudentAverage("Jose Mazorra", 50); 

      testAverage.addQuiz(900); 
      String name = testAverage.getName(); 

      double avg = testAverage.getAverageScore(); 

      System.out.println(name); 
      System.out.println(avg); 


    } 

} 

這是很多easiear創建單獨的文件不是在做什麼我最初做這是有一個文件中的一切。更清潔,更容易維護。 我也對我的主要代碼進行了一些修改:

/** 
    A student who is taking quizzes. 
*/ 
public class StudentAverage 
{ 
    //Instances variables 
    private String name; 
    private double quizScores; 
    private double numOfQuizzesTaken; 

    /** 
    * Constructs a Student object with a name "Jose Mazorra" and zero total quiz score 
    */ 
    public StudentAverage() 
    { 
     name = "Jose mazorra"; 
     quizScores = 0; 
     numOfQuizzesTaken = 1; 
    } 

    /** 
    * Constructs a Student object with an initial name and total quiz score 
    */ 
    public StudentAverage(String pName, double pQuizScore) 
    { 
     name = pName; 
     quizScores = pQuizScore; 
     numOfQuizzesTaken = 20; 
    } 


    /** 
     Gets the name of this student. 
     @return the name 
    */ 
    public String getName() 
    { 
    return name; 
    } 

    /** 
     Adds a quiz score. 
     @param score the score to add 
    */ 
    public void addQuiz(int score) 
    { 
     quizScores = quizScores + score; 
    } 


    /** 
     Gets the sum of all quiz scores. 
     @return the total score 
    */ 
    public double getTotalScore() 
    { 
    return quizScores; 
    } 

/**Returns the average of all quiz taken 
* by the student 
* @return average score 
*/ 

public double getAverageScore(){ 

double avgScore; 

avgScore = (quizScores/numOfQuizzesTaken); 

return avgScore; 

} 

} 
相關問題