【问题标题】:"Non-static method cannot be referenced from a static context" error“不能从静态上下文引用非静态方法”错误
【发布时间】:2011-06-22 18:29:07
【问题描述】:

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

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

我正在尝试通过以下方式从名为 GUI 的类中调用此方法:

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

但我得到了错误

不能从静态上下文引用非静态方法 setLoanItem(java.lang.String)

我只是想将Media 类中的变量onloan 更改为GUI 类中的“是”。

我查看了具有相同错误消息的其他主题,但没有点击!

【问题讨论】:

  • 你应该接受这个答案。
  • 双锤使用者请注意"非静态方法不能被引用...""非静态变量不能被引用...”是不同的,需要不同的答案。谢谢。

标签: java compiler-errors static


【解决方案1】:

需要从实例调用实例方法。您的setLoanItem 方法是一个实例方法(它没有修饰符static),它需要它才能起作用(因为它正在为调用它的实例设置一个值(this) )。

你需要先创建一个类的实例,然后才能调用它的方法:

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

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

【讨论】:

  • 我在执行此操作时出现空指针异常...您认为问题是什么?如果您需要任何代码,请告诉我。谢谢! (现在已经坚持了 3 个半小时!)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    本质上,您没有指定什么媒体对象要调用该方法,您只指定了类名。可能有数以千计的媒体对象,而编译器无法知道您的意思是什么,因此它会相应地生成错误。

    您可能希望传入一个媒体对象来调用该方法:

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

    【讨论】:

      【解决方案4】:

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

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

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

      取决于您希望如何传递该实例。

      【讨论】:

        猜你喜欢
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多