非静态方法无法从静态上下文中引用错误

76

我有一个名为Media的类,其中有一个名为setLoanItem的方法:

public void setLoanItem(String loan) {
    this.onloan = loan;
}

我正试图以以下方式从名为GUI的类中调用此方法:

public void loanItem() {
    Media.setLoanItem("Yes");
}

但我遇到了错误:

在静态上下文中无法引用非静态方法setLoanItem(java.lang.String)

我只是想从GUI类中改变Media类中的变量onloan为"Yes"。

我已经看过其他有相同错误信息的话题,但是没有搞定!


6
你应该为这个问题接受一个答案。 - NateW
2
请注意,Dup-hammer使用者,“非静态方法无法引用…”和“非静态变量无法引用…”是不同的,需要不同的答案。谢谢。 - Stephen C
4个回答

75

实例方法需要从实例中调用。你的setLoanItem方法是一个实例方法(它没有修饰符static),它需要这样才能正常工作(因为它在被调用的实例上设置了一个值(this))。

在调用该方法之前,你需要先创建类的一个实例:

Media media = new Media();
media.setLoanItem("Yes");

(顺便说一下,最好使用布尔值而不是包含“Yes”的字符串。)


当我这样做的时候,我会收到一个空指针异常...您认为问题是什么?如果需要任何代码,请告诉我。谢谢!(已经困在这里3个半小时了!) - Ruchir Baronia
@Ruchir:请参见https://dev59.com/GnVC5IYBdhLWcg3wqzLV - Nathan Hughes

12

setLoanItem是一个实例方法,意味着你需要Media类的一个实例才能调用它。你试图在Media类型本身上调用它。

你可能想要查阅一些基础的面向对象教程,了解静态/实例成员的工作原理。


2

setLoanItem() 不是一个静态方法,它是一个实例方法,这意味着它属于该类的特定实例而不是该类本身。

实际上,你没有指定要在哪个媒体对象上调用该方法,你只指定了类名。可能有成千上万个媒体对象,编译器无法知道你想要哪一个,因此相应地生成错误。

你可能想要传入一个媒体对象来调用该方法:

public void loanItem(Media m) {
    m.setLoanItem("Yes");
}

0

您需要正确地将静态数据与实例数据分开。在您的代码中,onLoansetLoanItem()是实例成员。如果您想引用/调用它们,必须通过实例来进行。因此,您可以选择

public void loanItem() {
    this.media.setLoanItem("Yes");
}

或者

public void loanItem(Media object) {
    object.setLoanItem("Yes");
}

根据您想要如何传递该实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接