2012-08-09 57 views
0

我想我誤解的東西,如果是的話,我需要幫助..Java抽象類(這個關鍵字)

比方說,我有以下兩類:

public abstract class Abstraction() { 
    protected int number = 0; 
    public void printNumber() { 
     System.out.println(this.number); 
     System.out.println(getNumber()); 
    } 
    public int getNumber() { 
     return this.number(); 
    } 
} 

public class Reality extends Abstraction { 
    int number = 1; 
    public Reality() { 
     this.printNumber(); 
    } 
} 

// some other class 
new Reality(); 

什麼宜輸出是?我得到0,0(這裏的代碼有點複雜但仍然是相同的問題)。 我怎樣才能得到輸出爲1,1?

回答

9

RealitynumberAbstraction類覆蓋number。因此,Abstraction班級仍將自己的number值視爲0

一個解決辦法是:

public class Reality extends Abstraction { 
    public Reality() { 
     number = 1; 
     this.printNumber(); 
    } 
} 

因爲你numberAbstraction是受保護的,你可以在你的Reality類訪問它。


另一個例子是在一個方法中的參數:

private int number; 

public void myMethod(int number){ 
    number = 2; 
} 

private int number字段將不會被設置,取而代之的是,參數number將被設定爲2


最後,在thissuper關鍵字詞,請參閱類的編輯:

public abstract class Abstraction() { 
    protected int number = 0; 
    public void printNumber() { 
     System.out.println(this.number); 
     System.out.println(getNumber()); 
    } 
    public int getNumber() { 
     return this.number(); 
    } 
} 

public class Reality extends Abstraction { 
    int number = 1; 
    public Reality() { 
     System.out.println(number); //Will print 1 
     System.out.println(this.number); //Will print 1 
     System.out.println(super.number); //Will print 0 
    } 
} 
1

您在Reality創建本地變量,但printNumber()方法指的成員變量仍然爲0.

如果您不創建本地變量,但您使用的字段是這樣的:

number = 1; 

它會好的。

如果你有問題的理解字段,你總是可以參考官方文檔可以在這裏找到:Oracle java docs

1

您可以創建抽象類的setter方法:

public void setNumber(int value) { 
this.number = value; 
} 

他們的方式你試圖達到這個目標是行不通的,因爲這個變量不會超越超類的那個。

我希望這有助於!

-1
public class Reality extends Abstraction { 
    int number = 1; 
    public Reality() { 
     this.printNumber(); 
    } 
} 

上面的代碼number是和實例變量Reality類的超級類的調用方法。在超類,因爲它與0

如果你想獲得的number子類變量值初始化printNumber()方法將打印的number 0值,你必須通過價值方法參數如下:

public Reality(int num) { 
    this.printNumber(); 
}