2016-10-26 63 views
1

我已經聲明瞭一個默認和一個參數化構造函數。使用單個對象我稱之爲構造函數和函數。當我運行程序時,我得到的輸出爲0而不是得到階乘。我有初始化F = 1還是輸出爲0我想使用默認和參數化構造函數來查找數字的階乘。獲得輸出爲0

class Factorial 
{ 
    int num, f; 

    Factorial() 
    { 
     f = 1; 
    } 

    Factorial(int n) 
    { 
     num = n; 
    } 

    public int getFactorial() 
    { 
     for(int i = 1; i <= num; i++) 
     { 
      f = f * i; 
     } 
     System.out.println("Factorial= " + f); 
     return f; 
    } 

    public static void main(int m) 
    {  
     Factorial obj = new Factorial(); 
     obj = new Factorial(m); 
     obj.getFactorial(); 
    } 
} 
+0

提示:Java中的類名起始於UpperCase。並且不要縮寫變量名稱。相反:使用名稱來說明名稱背後的事情! – GhostCat

回答

3

這是因爲,當類與factorial(int n)構造初始化f初始值保持爲零。

設置f1在初始化來解決這個問題:

int n, f = 1; 

Factorial() { 
} 

Factorial(int n) { 
    num = n; 
} 

這使得你的類一個很大的問題:調用getfactorial多次將改變類的狀態,增加了階乘的價值。您可以通過創建一個boolean變量來解決此問題,該變量指示是否計算了階乘,並在執行計算後返回f

如果您不需要「懶惰」計算,請在方法中將f作爲局部變量。

+1

呃...甚至更好:使'f'成爲一個局部變量的方法! – Seelenvirtuose

+0

@Seelenvirtuose該方法的問題在於,每次調用getfactorial時都會重新計算階乘,使得階級幾乎毫無意義。另一方面,當前的設計使OP可以懶惰地計算階乘,作爲練習。 – dasblinkenlight

+0

@Seelenvirtuose在發表我之前的評論之前,我已經編輯了答案,以解釋這一點。 – dasblinkenlight

0

作爲一種良好的做法,變量應該具有儘可能小的範圍(首選本地,然後是實例)。或者換句話說:只有當你想在同一個類的幾個方法之間共享某個日期時才應該使用狀態變量。但是你的情況如何?因子是一個操作,可以從一個參數中僅用一步來計算:無需進一步處理。

所以,我建議你refactorize你的類:

  1. 落狀態變量:將它們轉換爲局部變量或參數的方法。
  2. 將階乘方法設置爲靜態(正是因爲它不需要狀態變量)。
  3. 另一個小細節:參數通過字符串數組從總線傳遞到main方法 - 總是。
  4. 只需一種方法將所有輸入和輸出保留給用戶,最好是使用main方法。

所以將保持這樣的:

class Factorial 
{ 
    public static int getFactorial(int num) 
    { 
     int f=1; 
     for (int i = 1; i <= num; i++) 
     { 
      f = f * i; 
     } 
     return f; 
    } 

    public static void main(String[] args) 
    {  
     int m=Integer.parseInt(args[0]); 
     int factorial=Factorial.getFactorial(m); 
     System.out.printf("factorial of %d is %d\n", m, factorial); 
    } 
} 

很多simplier,不是嗎?

相關問題