2011-12-24 147 views
1

我知道我在做一些愚蠢的事情,但我無法弄清楚如何解決它。靜態方法和非靜態方法Java

問題出在private方法removeVowels特別是當使用vowels方法時。

編譯器給

non-static variable vowels cannot be referenced from a static context

這裏是我的代碼:

public class RecursionHW2 { 

      String vowels; 

      // Part (A) First way 
      public static int upperCase(String myString){ 

       return upperCaseChecker(myString , 0); 
      } 

      public static int upperCaseChecker(String myString, int index){ 

       int inc; 

       //My Base Code 
       if(myString.length() <= index) return 0; 
       if(Character.isUpperCase(myString.charAt(index)) == true) inc= 1; 
        else inc= 0; 

       return inc+upperCaseChecker(myString,index+1); 
      } 



      // First way of Solving part (B) 
      public static int count(String str, char a) 
      { 
       if (str.length() == 0) 
        return 0; 
       else if (str.charAt(0) == a) 
        return 1 + count(str.substring(1, str.length()), a); 
       else 
        return count(str.substring(1, str.length()), a); 
      } 


      //Second way of solving part (B) 
      public static int anotherCount(String myString, char myWord) 
      { 
       return anotherCount(myString, myWord, 0); 
      } 

      public static int anotherCount(String myString, char myWord, int index) 
      { 
       int inc; 

       if (index >= myString.length()) 
       { 
        return 0; 
       } 

       if (myString.charAt(index) == myWord) inc =1; 
        else 
         inc = 0; 

       return inc + anotherCount(myString, myWord, index+1); 
      } 



      // part (C) solving 
      public Boolean isSorted(int[] a, int n) 
      { 
      if(n == 0 || n == 1) return true; 
      else 
      return isSorted(a, n, 1); 
      } 

      private Boolean isSorted(int[] a, int n, int cur) 
      { 
       if(cur == n) return true; 

       if(a[cur - 1] <= a[cur]) 
        return isSorted(a, n, cur+1); 
       else 
        return false; 
      } 



      //part (D) Solving 
      public static String removeVowels(String myString) 
      { 
       return removeVowels(myString, ""); 
      } 

      private static String removeVowels(String myString, String t) 
      { 
       if(myString.length() == 0) return t; 

       if(vowels.contains(myString.charAt(0) + "")) 
        return removeVowels(myString.substring(1), t); 
       else 
        return removeVowels(myString.substring(1), t + myString.charAt(0)); 
      } 


     public static void main(String[] args){ 


      //I've wrote 2 ways to solve the Second Recursive Q2 
      System.out.println("Method 1: Number of Occurence " + count("Hello This is Mohammad Fadin",'o')); 
     // System.out.println("Method 2: Number of Occurence "+ anotherCount("Hello This is Mohammad Fadin",'o')); 

      String s1 = "Hello WorlDD"; 
      System.out.println("Number of Upper Cases " + upperCase(s1)); 

      String s2 = "Hello"; 
      System.out.println("After Vowels Removed " + removeVowels(s2)); 
     } 


    } 
+0

請閱讀編譯錯誤消息。它完全描述***是什麼問題。 – 2011-12-24 17:24:17

回答

4

您已使用main方法將您的代碼「感染」了static。在你main方法,你應該做這樣的事情,所以你不必讓一切static

public class RecursionHW2 
{ 
    public static void main(String[] args) 
    { 
    RecursionHW2 rhw2 = new RecursionHW2(); 

    int count = rhw2.count("Hello world"); 

    // and so on 
    } 
} 
+0

不錯!我沒有這樣想。我現在就試試這個。 – Sobiaholic 2011-12-24 18:05:26

+0

已感染。描述它的好方法:) – rpax 2014-03-03 19:07:29

0

變化:

String vowels; 

到:

static String vowels; 
+0

woooooot!爲什麼我沒有注意到這一點:S – Sobiaholic 2011-12-24 17:23:37

+6

雖然這會使編譯器錯誤消失,但這是一個非常錯誤的事情。您應該使用實例變量和實例數據,併爲實用方法和類級數據(例如常量和缺省值)保留靜態成員。 – 2011-12-24 17:26:40

+0

我完全同意@AdamZalcman全心全意;它遠遠優於創建對象的實例,而不是將整個事物變爲靜態的。但沒有跡象表明靜態修飾符是作爲賦值的一部分所必需的,或者不是。 – Makoto 2011-12-24 17:30:37

0

因爲元音是非靜態的,所以不能在靜態方法中使用String元音。您需要將靜態關鍵字添加到字符串,然後您的代碼將工作。

3

您不能從靜態上下文中引用實例變量。您必須首先創建RecursionHW2的實例,或者使變量vowels靜態更合理。或者您可以考慮從removeVowels方法中刪除靜態修飾符。

更新:
但是,您的類看起來像一堆的實用方法,所以你可能要使它非實例化(通過添加一個私有構造函數),讓所有的方法靜態的(因爲他們清楚地不要在對象狀態下操作)並將vowels作爲removeVowels方法的附加參數。

0

你可以使變量靜態或只是保持一切非靜態,這將得到解決。你需要問自己的更大問題是什麼時候應該使用靜態,什麼時候不使用?

+0

嗯你真的是對的。我對此很困惑。 – Sobiaholic 2011-12-24 17:26:18

+0

如果一個方法不對任何特定對象的狀態進行操作,它應該是靜態的 – 2011-12-24 18:14:53

1

問題正是編譯器告訴你的:你正在從靜態上下文中引用一個非靜態(實例)變量vowels。事實上,幾乎所有的方法都是靜態的,這是一個非常糟糕的設計。

使所有需要訪問實例數據的方法(這裏是:vowels實例變量)非靜態並在main()中實例化您的類。

0

變化

String vowels; 

static String vowels; 

你所有的方法都是靜態的,因此不需要你的對象的實例是存在 - 即你不必說

x = new RecursionHW2(); 
x.upperCase(..); 

但是,如果你不使元音成爲靜態的,除非對象被實例化,否則它不存在。

0

靜態變量屬於類,即不屬於類實例的靜態變量(對象) 。

測試

class Foo { 

    private static String vowers; 
    private String bar; 

} 


Foo a = new Foo() 

創建類Foo的一個新實例,每個實例都有其自己的變量吧,但都vowers變量,因爲這屬於類。靜態方法也一樣。

在靜態方法(類方法)中,您不能引用非靜態變量。這是爲什麼?

想象,從一個靜態方法,你引用變量如果你這樣做,是不是靜態

class Foo { 
    private static String vowers; 
    private String bar; 

    public static void exampleMethod() { 
     bar = "home"; 
    } 

} 

Foo a = new Foo()// has a new bar 
Foo b = new Foo()// has a new bar 

vowers是一個變量,屬於類而不是實例

當你

Foo.exampleMethod() 

該方法不知道變量bar用於實例a的變量或變量b的實例。因此,您只能從靜態方法訪問該類的靜態變量