web-dev-qa-db-ja.com

「静的コンテキストから非静的メソッドを参照できません」エラー

Mediaという名前のメソッドを持つsetLoanItemという名前のクラスがあります。

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

次の方法で、GUIという名前のクラスからこのメソッドを呼び出そうとしています。

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

しかし、私はエラーが発生しています

非静的メソッドsetLoanItem(Java.lang.String)は静的コンテキストから参照できません

onloanクラスの変数MediaGUIクラスの "Yes"に変更しようとしています。

私は同じエラーメッセージで他のトピックを見ましたが、クリックはありません!

67
Daniel Mckay

インスタンスメソッドは、インスタンスから呼び出す必要があります。 setLoanItemメソッドはインスタンスメソッド(修飾子staticを持たない)で、機能するために必要です(呼び出されるインスタンスに値を設定しているため(this))。

メソッドを呼び出す前に、クラスのインスタンスを作成する必要があります。

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

(ところで、「Yes」を含む文字列の代わりにブール値を使用する方が良いでしょう。)

72
Nathan Hughes

setLoanItemはインスタンスメソッドです。つまり、呼び出すにはMediaクラスのインスタンスが必要です。 Mediaタイプ自体で呼び出しようとしています。

静的/インスタンスメンバがどのように機能するかを確認するために、いくつかの基本的なオブジェクト指向のチュートリアルを調べてください。

11
Joe Enos

setLoanItem()は静的メソッドではなく、インスタンスメソッドです。つまり、そのクラス自体ではなく、そのクラスの特定のインスタンスに属します。

基本的に、whatメソッドを呼び出すメディアオブジェクトを指定しておらず、クラス名のみを指定しています。数千のメディアオブジェクトが存在する可能性があり、コンパイラはあなたが何を意味したかを知る方法がないため、それに応じてエラーを生成します。

おそらく、メソッドを呼び出すメディアオブジェクトを渡す必要があります。

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

インスタンスデータから静的データを正しく分離する必要があります。コードでは、onLoansetLoanItem()はインスタンスメンバーです。それらを参照/呼び出したい場合は、インスタンスを介して行う必要があります。だからあなたはどちらかが欲しい

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

または

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

そのインスタンスをどのように渡したいかに応じて。

0
OrangeDog