2012-06-27 96 views
0

我是一名Java初學者,我使用PHP,C++和Lua,並且從來沒有遇到過這個問題,我只爲了運動的緣故做了兩個類FactoMyFacto,第一個確實找到了階乘,第二個應該通過增加而不是通過乘法來找到階乘。不要責怪我愚蠢和毫無意義的代碼,我只是測試並試圖獲得Java的竅門。java覆蓋不工作

主營:

public class HelloWorld { 
public static void main(String[] args) { 

    Facto fc = new Facto(5); 
    fc.calc(); 
    System.out.println(fc.get()); 

    MyFacto mfc = new MyFacto(5); 
    mfc.calc(); 
    System.out.println(mfc.get()); 

} 
} 

Facto.java:

public class Facto { 
private int i; 
private int res; 

public Facto(int i) { 
    this.i = i; 
} 

public void set(int i) { 
    this.i = i; 
} 

public int get() { 
    return this.res; 
} 

public void calc() { 
    this.res = this.run(this.i); 
} 

private int run(int x) { 
    int temp = 0; 
    if(x>0) { 
     temp = x + this.run(x-1); 
    } 
    return temp; 
} 
} 

MyFacto.java:

public class MyFacto extends Facto { 
public MyFacto(int i) { 
    super(i); 
} 

private int run(int x) { 
    int temp = 0; 
    if(x>0) { 
     temp = x * this.run(x-1); 
    } 
    return temp; 
} 
} 

我想結果應該是15和120,但我得到15 15.爲什麼會發生?這與calc()方法沒有被覆蓋有什麼關係,它使用Facto類的run()方法?我怎樣才能解決這個問題或者什麼是正確的方式來重寫這樣的事情?

+2

在兩個類中將'private int run()'更改爲'protected int run()'。 –

+0

@GregKopff究竟在'Facto'類還是'MyFacto'中?我改變了他們兩個,結果是15和0. –

+1

,因爲0 *任何= 0.即你的覆蓋現在正常工作,工作邏輯。=) –

回答

5

您遇到問題的原因歸結於member access visibility

一言以蔽之:

  • public允許任何 Java類實地看/功能,只要它可以到達。
  • <package>或者沒有明顯的修飾符,允許任何Java對象(但不是子類)看到字段/函數,只要它們在同一個目錄或包中。
  • protected允許聲明的類和所有其他子類訪問該字段/函數以及同一目錄/包中的任何類。
  • private允許只有聲明的類來訪問該字段/函數。
+1

謝謝!不知何故,我忽視了我在私密性方面的要求,因爲我看到它是公開的代碼,哦,深夜編程!謝謝你的解釋! –

3

要展開什麼@Makoto說,你遇到了一個問題,因爲Factocalc()方法不能訪問的MyFactorun()的方法,所以它使用它自己的run()方法。將它們更改爲protected而不是private應該可以做到。

此外,您應該學會使用的東西是@Override註釋。把它放在任何你壓倒一切的方法之上是個好習慣。這樣,如果你拼錯某些東西,或參數不匹配,你會得到一個警告。此外,它還會向您和/或讀者說明。例如:

MyFacto.java#運行:

@Override 
protected int run(int x) { 
    int temp = 0; 
    if(x>0) { 
     temp = x * this.run(x-1); 
    } 
    return temp; 
} 

好運與Java!

+0

我沒有意識到你已經完成了,當我張貼,很高興現在一切都好。 :) – lachy2901

+0

然而,你的評論是有幫助的,我試着用'@ Override'註釋,但有一個錯誤'MyFacto類型的方法run(int)必須覆蓋或實現一個超類型方法',找不到它真的意味着我將它擦除,然後我將從現在開始使用它。除了可讀性和在IDE中獲取錯誤之外,是否還有其他理由使用'@ Override'註釋? –

+0

@Vlakarados:「@ Override」的要點是準確地捕捉到你所面臨的問題 - 當你不是的時候,你認爲你重寫了一種方法。 –