2014-10-29 40 views
1

我編寫了getPlugin()方法,以便能夠從另一個班級獲取主班級。試圖獲得另一個班級時的問題

public class Main extends JavaPlugin { 
    public Main getPlugin() { 
     return this; 
    } 
} 

但是,當我嘗試調用它...

public class Arena { 
    private Main plugin = Main.getPlugin(); 
} 

... Eclipse中給了我以下錯誤:

Cannot make a static reference to the non-static method getPlugin() from the type Main

我使用的都是靜態的,但靜給我問題出現在很多不同的地方,我已經看到靜態通常是一種糟糕的做事方式。導致內存泄漏和東西。

我試過使用getters和setter,但那些也需要是靜態的? 我一直在使用的代碼非常混亂,我想找到一種更簡潔的方式來訪問另一個類。

+0

靜是不是不好用。它有很多用例。靜態意味着無論您聲明爲靜態,任何類的所有實例都會共享該變量或方法。 – brso05 2014-10-29 18:22:38

+0

如果getPlugin()方法不是特定於該類的實例,則應使用Static。 – brso05 2014-10-29 18:23:25

+0

你需要了解什麼'靜態'是什麼以及何時適合使用。靜態與否,你也一定要*調用你的getPlugin()方法。 – 2014-10-29 18:26:00

回答

1

如果您想避免使用靜態方法,您需要將變量作爲參數傳遞給對象的構造函數。在您的例子,它的工作是這樣的:

public class Arena { 
    private final Main plugin; 
    public Arena(Plugin plugin) { 
     this.plugin = plugin; 
    } 
} 

然後你就可以從你的主要插件類中創建一個競技場,並在this作爲參數傳遞:

public class Main extends JavaPlugin { 
    @Override 
    public void onEnable() { 
     Arena arena = new Arena(this); 
    } 
} 
0

發生此問題的原因JavaPlugin父類中已有getPlugin()方法,因此當您執行Main.getPlugin()時,您正試圖調用非靜態方法。 另外,你自己的方法是非靜態的。

以下是我的工作方式。 您必須使用不同的名稱並將其設爲靜態。另外,您應該在onEnable()上初始化它的值。

public final class Example extends JavaPlugin { 
    private static Plugin main; 
    public static Plugin getMain() { 
     return main; 
    } 
    @Override 
    public void onEnable() { 
     main = this; 
    } 
} 
+0

我嘗試將getPlugin()更改爲其他內容,但它仍然無效。它給出了同樣的錯誤。我也嘗試初始化它 – Yupie 2014-10-29 20:11:19

+0

@Yupie你是否使它靜態? – 2014-10-30 13:37:35

+0

啊,不,我沒有,但問題解決了,我用@Afforess的方法來解決它! – Yupie 2014-10-31 14:05:24

相關問題