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 lf = new LibraryFunctions();
lf.addSong();
于 2010-03-16T15:43:11.290 回答
1

那么你真的有两个选择:

  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 回答
1

如果你想调用它LibraryFunctions.addSong(),它需要有签名public static void addSong()

更多信息:
只能调用静态方法,而无需先实例化一个类。

于 2010-03-16T15:40:19.497 回答
0

在结构上,我可以建议将LibraryFunctions 类文件转换为MusicLibrary 类吗?这样,在您的主应用程序代码中,您可以在每次代码运行时实例化一个 MusicLibrary。它还将使分离静态函数和实例函数变得更加容易,这可能会立即解决您的问题。

public class MusicManager {

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

然后音乐库:

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 之外,以便您以后可以重用它。

这样做的另一个好处是您可以使 MusicLibrary 实现 Serializable 并将库保存到文件中。另外,您可以在 MusicLibrary 中放置一系列 MusicLibraries 并拥有播放列表。各种选择。

于 2010-03-16T15:56:56.517 回答