2014-10-29 27 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

相关问题