2014-01-10 66 views
3

我有一個用於獲取日期的Java類。我想知道如何在不改變它的情況下訪問這個類。 (我的代碼,在德國,但它只是一對夫婦的話)使用來自其他類的函數而不修改它(對非靜態方法的靜態引用)

這裏是我無法改變的類:

import java.util.Calendar; 


public class Datum { 
    private int tag; 
    private int monat; 
    private int jahr; 

    /** 
    * Standard Datum 1.1.1970 
    */ 
    public Datum() { 
     this.tag = 1; 
     this.monat = 1; 
     this.jahr = 1970; 
    } 

    /** 
    * 
    * @param tag : tag > 0 und tag <= 31 
    * @param monat : monat > 0 und monat <= 12 
    * @param jahr : jahr beliebig 
    **/ 
    public Datum(int tag, int monat, int jahr) { 
     assert(tag > 0 && tag <= 31); 
     assert(monat > 0 && monat <= 12); 

     this.tag = tag; 
     this.monat = monat; 
     this.jahr = jahr; 
    } 

    public int getTag() { 
     return tag; 
    } 
    public void setTag(int tag) { 
     this.tag = tag; 
    } 
    public int getMonat() { 
     return monat; 
    } 
    public void setMonat(int monat) { 
     this.monat = monat; 
    } 
    public int getJahr() { 
     return jahr; 
    } 
    public void setJahr(int jahr) { 
     this.jahr = jahr; 
    } 

    public static Datum heute(){ 
     Calendar c = Calendar.getInstance(); 
     return new Datum(c.get(Calendar.DAY_OF_MONTH),(c.get(Calendar.MONTH)+1),c.get(Calendar.YEAR)); 
    } 


} 

這裏是我試圖讓當前日期:

public class Aufgabe3 { 

    public static void main(String[] args) { 
     Datum.heute(); 
     System.out.println(Datum.getTag()); 


    } 

} 

當我嘗試運行它說該代碼「不能使靜態參考非靜態方法getTag()從類型基準」。如何在不更改類Datum的情況下訪問Date?

+2

的System.out.println(Datum.heute()上創建一個實例。 getTag()); – Alexander

回答

0

它是因爲getTag()不是一個靜態方法。

試試這個

Datum dt = Datum.heute(); 
System.out.println(dt.getTag()); 
0

getTag()方法也不是一成不變的,所以你不能調用/調用該方法無一物,這就是爲什麼你得到這個錯誤。

你可以做的是一個變量分配給由Datum.heute()返回的對象,然後調用getTag()該對象的

你應該做的是這樣的:

Datum d = Datum.heute(); 
System.out.println(d.getTag()); 
0

這行代碼導致問題:

System.out.println(Datum.getTag());

getTag()方法是非靜態的,不能夠直接在main方法,而無需創建的Datum對象引用。

解決方案:

System.out.println(Datum.heute().getTag()); 
0

heute()方法是static,因此,使用得當,但調用getTag()你需要使用的對象從heute()方法返回。

Datum date = Datum.heute(); 
System.out.println(date.getTag()); 
0

如果你想打印今天的日期,你可以

public static void main(String[] args) { 
    System.out.println(Datum.heute().getTag()); 
} 

Datum.heute()是返回一個Datum(對象)的靜態(類)方法在其上,在轉,可以撥打非靜態Datum方法。說得通? 乾杯,

0

你基準類方法getTag()是實例方法,而你正在嘗試使用類名稱,因爲對象創建後實例方法實例,只有靜態成員類加載後實例化,這是不可能調用它。

所以,你必須創建您的基準類的對象調用getTag()方法:

Datum d = Datum.heute();; 
System.out.println(d.getTag()); 
0

您可以創建類基準的目的是獲取非靜態訪問:

public class Aufgabe3 { 

    public static void main(String[] args) { 

     Datum datum = new Datum() 
     System.out.println(datum.getTag()); 
    } 
} 
0

作爲你的一個對象Datum class像這樣在main方法中。 Datum datum = new Datum(); 然後嘗試使用datum.getTag();

注: - 這僅僅是因爲你已經宣佈所有的變量非靜態的,你不能在不直接使用類名對象訪問它們(當你正在做的事情,因爲他們不聲明爲static )

0

從異常Cannot make a static reference to the non-static method getTag() from the type Datum的行中自我說,你不能直接通過類名訪問非靜態方法(如直接通過類名訪問任何靜態方法),要訪問需要引用的非靜態方法/該類的對象。

使用該對象創建類Datum的對象和訪問方法getTag()

public static void main(String[] args) { 
    Datum obj = Datum.heute(); 
    System.out.println(obj.getTag()); 
} 

這可以幫助你。

1

我試着通過解釋你的代碼實際上做了什麼來回答這個問題。

通過執行Datum.heute();你對Datum類的靜態方法一個heute()調用。靜態方法獨立於實際實例,即該類的對象。

heute()返回Datum的一個實例,但不會將其存儲在任何位置。

然後在您的第二行中嘗試致電Datum.getTag()。由於您調用類Datum而不是對象(例如someDatumObject.getTag()),因此java編譯器會嘗試查找靜態方法。

所以解決您的Aufgabe 3,你需要:

  • 通過heute()
  • 調用getTag()該對象
相關問題