2011-08-21 65 views
-1

我有這樣的代碼:調用方法不帶任何參數在Java中

import com.eteks.sweethome3d.SweetHome3D; 
import com.eteks.sweethome3d.model.Home; 

public class Test extends SweetHome3D { 
    public static void main(String [] args) { 
    new Test().init(args); 
    } 

    @Override 
    public Home createHome() { 
    Home home = super.createHome(); 
    // Modify home as you wish here 
    return home; 
    } 
} 

,我想通過主運行我的方法。 你知道我該怎麼做嗎?我曾嘗試過很多種方法,例如:

createHome(); 

super.createHome(); 

但它不能識別此類型。 我也試過

Test test = new Test(); 
    test.init(args); 
    test.createHome(); 

不產生任何錯誤,不過,我想是沒有這樣做。 他們勸我:「你不應該調用test.createHome();直接」

感謝提前:)


的事情是,現在它運行我的應用程序,但是當我把這個

System.out.println("method called"); 

進入我的方法,它顯示兩次... ???爲什麼?

+1

誰是「他們」?爲什麼他們建議你不要直接調用createHome()?我敢打賭,這就是爲什麼它不起作用。如果「他們」是正確的。 – chubbsondubs

+0

我使用開源應用程序(Sweethome3d),我試圖修改「他們的」代碼。而「他們」告訴我,我不應該直接將其掛上。我也嘗試過新的Test().init(args);它調用兩次方法。 – Mitsaki

+0

好吧,那麼你不需要調用該方法,那麼如果init()已經調用它。所以你應該做的只是簡單地覆蓋它,在createHome()中實現你的邏輯(確保調用super),並在main中做新的Test().init(args)。它會起作用。現在爲什麼它能夠工作,您需要更多地學習Java來理解方法重寫的工作原理。 – chubbsondubs

回答

1

在調用test.createHome()時沒有問題,它是它應該工作的方式。

爲了檢查方法是否被調用,您可以將System.out.println("method called)放入createHome()方法中。

你的問題可能在別的地方,也許在超類。

+0

實際上,它被稱爲3次,因爲它出現在控制檯中,但不是預期的結果......我如何間接運行它? – Mitsaki

+0

沒有「間接調用」這樣的東西。如果您的超類有一些方法可以初始化並返回給您一個主頁,那麼可能就是這樣,但除此之外,您正在以正確的方式進行操作。如果它被稱爲3次,這意味着你調用了三次。 – Bozho

+0

至於超類,沒有問題,因爲我使用開源程序來創建我的應用程序:( – Mitsaki

1

問題是靜態方法和實例方法之間的區別。 createHome是一個實例方法,這意味着你必須有一個該類的實例來調用該方法。這就是爲什麼你可以從你的測試變量中調用createHome(),因爲test是Test的一個實例。主要方法是一個靜態方法,它與Class Test相關聯,並且它沒有一個Test實例來調用該方法。類是與該類創建的實例不同的一塊內存。但是,通過使用static關鍵字,Class可以擁有與其關聯的方法和變量。

現在爲什麼它不起作用可能與您的代碼和它可以調用該方法的假設有關。我猜想init()方法做得相當大,並且它還沒有準備好處理對createHome()的調用,因爲系統還沒有完全啓動。看起來像一個用戶界面程序,所以可能會有一些定時和處理事件的問題。

很難知道爲什麼它沒有爲您工作沒有具體的錯誤。

+0

例如:(Test.createHome())中的異常線程「主要」 java.lang.Error的:未解決問題彙編: \t無法使靜態參考從類型測試非靜態方法createHome() \t在com.eteks.sweethome3d.Test.main(Blender.java:93) – Mitsaki

+0

正如我的答案所述,沒有方法Test.createHome(),因爲這將是一個靜態方法。顯然,從你的代碼和錯誤,沒有靜態方法createHome()。這就是那個錯誤告訴你的。這不是你展示的代碼的最後一部分的編譯輸出。不知何故,你可能在那裏有舊的編譯代碼。我建議用正確的代碼重建項目,然後重新部署。 – chubbsondubs