可能重复:
Static method in 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()保持为静态时,它会向我抛出错误。有点讽刺。
对此有很多帮助!
答案 0 :(得分:3)
遵循以下简单规则:
static
方法,请使用ClassName.methodName()
static
方法,请使用classInstance.methodName()
答案 1 :(得分:1)
如果您想将其称为LibraryFunctions.addSong()
,则需要签名public static void addSong()
。
更多信息:
只能在不首先实例化类的情况下调用静态方法。
答案 2 :(得分:1)
您也可以尝试:
LibraryFunctions lf = new LibraryFunctions();
lf.addSong();
答案 3 :(得分:1)
你真的有两种选择:
addSong()
更改为静态并通过静态成员引用歌曲。LibraryFunctions
的新实例,然后使用非静态方法addSong()
答案 4 :(得分:1)
我认为你的班级歌曲是非静态嵌套类? e.g。
class LibraryFunctions {
class Song {
// ...
}
}
如果是这样,您可以将其设置为静态嵌套类,或将Song类提升为单独的类。
答案 5 :(得分: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之外,以便您以后可以重复使用。
这样做的另一个好处是,您可以使MusicLibrary实现Serializable并将库保存到文件中。另外,您可以在MusicLibrary中放置一组MusicLibraries并拥有播放列表。各种选择。