1

重複の可能性:
Java の静的メソッド

わかりましたので、私が取っているクラスのプロジェクトに取り組んでいます..単純な音楽ライブラリ。現在、いくつかの問題が発生しています。主な問題は、「静的コンテキストから非静的メソッドを参照できません」というメッセージが表示されることです。

ここに私が持っている機能があります

public void addSong() {
    Scanner scan = new Scanner(System.in);
    Song temp = new Song();
    int index = countFileLines(Main.databaseFile);
    index = index + 2;
    temp.index = index;
    System.out.print("Enter the artist name: ");
    temp.artist.append(scan.next());
}

これは、LibraryFunctions という名前のクラス ファイルにあります。したがって、 LibraryFunctions.addSong(); でアクセスできます。

これをメインのJavaファイルで実行しようとすると、エラーが発生します。エラーが発生する理由はわかっていますが、どうすればよいですか? addSong() を静的関数にすると、Song temp = new Song() が静的であるというエラーがスローされます。ちょっと皮肉。

これについて多くの助けをいただければ幸いです!

4

6 に答える 6

3

次の簡単なルールに従ってください。

  1. staticメソッドの場合は、ClassName.methodName()
  2. staticメソッド以外の場合は、classInstance.methodName()
于 2010-03-16T15:40:43.497 に答える
1

と呼びたい場合LibraryFunctions.addSong()は、署名が必要public static void addSong()です。

詳細:
最初にクラスをインスタンス化せずに呼び出すことができるのは、静的メソッドのみです。

于 2010-03-16T15:40:19.497 に答える
1

次のことも試すことができます。

LibraryFunctions lf = new LibraryFunctions();
lf.addSong();
于 2010-03-16T15:43:11.290 に答える
1

実際には 2 つのオプションがあります。

  1. 静的に変更addSong()し、可能な場合はその静的メンバーを介して Song を参照します。
  2. の新しいインスタンスを作成しLibraryFunctions、非静的メソッドを使用しますaddSong()
于 2010-03-16T15:46:22.350 に答える
1

あなたのクラス Song は静的ではないネストされたクラスだと思いますか? 例えば

class LibraryFunctions {

    class Song {
       // ...
    }

}

その場合は、静的なネストされたクラスにするか、Song クラスを別のクラスに持ち上げることができます。

于 2010-03-16T15:47:00.007 に答える
0

構造的には、LibraryFunctions クラス ファイルを MusicLibrary クラスにすることをお勧めします。そうすれば、メイン アプリケーション コードで、コードが実行されるたびに MusicLibrary をインスタンス化できます。また、静的関数とインスタンス関数を簡単に分離できるようになり、おそらく現在の問題を解決できます。

public class MusicManager {

    public static void main(String[] args) {
        MusicLibrary myMusic = new MusicLibrary();
        myMusic.addSong();
        // other stuff
    }
}

次に、MusicLibrary:

public class MusicLibrary {

    public MusicLibrary() {
    }

    public void addSong() {
        Scanner scan = new Scanner(System.in);
        Song temp = new Song();
        int index = countFileLines(Main.databaseFile);
        index = index + 2;
        temp.index = index;
        System.out.print("Enter the artist name: ");
        temp.artist.append(scan.next());
    }
}

最後に、クラス Song を MusicLibrary の外に置いて、後で再利用できるようにします。

これによるもう 1 つの利点は、MusicLibrary に Serializable を実装させ、ライブラリをファイルに保存できることです。さらに、MusicLibrary 内に MusicLibrary の配列を配置して、プレイリストを持つことができます。あらゆる種類のオプション。

于 2010-03-16T15:56:56.517 に答える