2012-04-08 211 views
2

我剛剛開始使用Java,我需要一些幫助。我知道我不能對靜態方法做非靜態引用,但我需要幫助解決它。我在讀你可以通過創建對象的實例來訪問非靜態成員變量,但我不確定如何去做。這裏是一些代碼。任何幫助或指示將非常感激。從靜態方法訪問非靜態成員變量

package tweetClassification;   

public class PriorityRules {  

    public static void prioritize(final String userInput){ 

      ClassificationRule.apply(aUserInput); //ERROR 
          // Cannot make a static reference to 
          // the non-static method apply(String) 
          // from the type ClassificationRule 
     } 
} 

*---------------------------------------------------------------- 
package tweetClassification; 

public class ClassificationRule { 

     public void apply (final String aUserInput) { 

      apply(aUserInput); 
     } 
    } 

*---------------------------------------------------------------- 
package tweetClassification; 

import java.util.ArrayList; 

public class RuleFirstOccrnc extends ClassificationRule { 

    public void apply (final String aUserInput){ 

     for(TweetCat t: TwtClassif.tCat) 
      applyFirstOccurrenceRuleTo(t, aUserInput); 
    } 

*---------------------------------------------------------------- 
package tweetClassification; 

public class RuleOccrncCount extends ClassificationRule { 

    public void apply (final String aUserInput){ 

     for(TweetCat t: TwtClassif.tCat) 
      applyOccurrenceCountRuleTo(t, aUserInput); 
    } 

回答

3

,因爲靜態方法附加到類,而不是任何特定的情況下不能從一個靜態方法是指非靜態變量。從它的角度來看,這些非靜態變量甚至不存在。然而,你的問題是誤導性的,因爲你的代碼中沒有任何地方顯示任何非靜態變量成員。看起來你的問題更多的是如何實例化適當的分類規則並將其應用於靜態方法參數。有許多方法可以做到這一點,最簡單的將是簡單的實例化一個規則的實例:

ClassificationRule rule = new RuleFirstOccrnc(); 
rule.apply(userInput); 

但考慮到你有分類規則的多個子類,你可能需要一個更復雜的方法實例化它們。一個工廠在這裏可能很有用,或者你可以使用一些更高級的對象創建模式,比如注入。

+0

@Perception的答案是正確的。此外,我建議你聲明簡單的舊'ClassificationRule'爲'abstract',並使其''apply'方法也是'abstract'。就像現在這樣,ClassificationRule的'apply'方法是一個無限循環。 – 2012-04-08 03:25:07

+0

謝謝你的工作!..這非常簡單..謝謝你的解釋非常有幫助。 – tom3322 2012-04-08 03:26:18