Java方法帮助

Java方法帮助,java,methods,non-static,Java,Methods,Non Static,可能重复: 好的,我正在为一门课做一个项目。。简单音乐库。现在我遇到了一些问题,主要的问题是非静态方法不能从静态上下文引用 这里有一个函数 public void addSong() { Scanner scan = new Scanner(System.in); Song temp = new Song(); int index = countFileLines(Main.databaseFile); index = index + 2; temp.i

可能重复:

好的,我正在为一门课做一个项目。。简单音乐库。现在我遇到了一些问题,主要的问题是非静态方法不能从静态上下文引用

这里有一个函数

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是静态的。有点讽刺

非常感谢您的帮助

如果要将其称为LibraryFunctions.addSong,则需要具有签名public static void addSong

更多信息: 只有静态方法可以在不先实例化类的情况下调用。

如果要将其作为LibraryFunctions.addSong调用,则需要具有签名public static void addSong

更多信息:
只有静态方法可以在不先实例化类的情况下调用。

遵循以下简单规则:

如果是静态方法,请使用ClassName.methodName调用它 如果它是非静态方法,请使用classInstance.methodName调用它
遵循以下简单规则:

如果是静态方法,请使用ClassName.methodName调用它 如果它是非静态方法,请使用classInstance.methodName调用它 您也可以尝试:

LibraryFunctions lf = new LibraryFunctions();
lf.addSong();
您也可以尝试:

LibraryFunctions lf = new LibraryFunctions();
lf.addSong();

你有两个选择:

如果可能,将addSong更改为静态,并通过其静态成员引用Song。 创建LibraryFunctions的新实例,然后使用非静态方法addSong
你有两个选择:

如果可能,将addSong更改为静态,并通过其静态成员引用Song。 创建LibraryFunctions的新实例,然后使用非静态方法addSong
我认为你的类歌曲是一个非静态嵌套类?e、 g

class LibraryFunctions {

    class Song {
       // ...
    }

}

如果是这样,您可以将其设置为静态嵌套类,或者将Song类提升为单独的类

我认为您的类歌曲是一个非静态嵌套类?e、 g

class LibraryFunctions {

    class Song {
       // ...
    }

}

如果是这样,您可以将其设置为静态嵌套类,或者将Song类提升为单独的类

在结构方面,我是否可以建议将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());
    }
}
最后,我会把这首课歌放在音乐图书馆之外,这样你以后可以重复使用它


另一个额外的好处是,您可以使MusicLibrary实现可序列化,并将库保存到文件中。此外,您还可以在音乐库中放置一组音乐库,并设置播放列表。各种选项。

在结构方面,我可以建议将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());
    }
}
最后,我会把这首课歌放在音乐图书馆之外,这样你以后可以重复使用它


另一个额外的好处是,您可以使MusicLibrary实现可序列化,并将库保存到文件中。此外,您还可以在音乐库中放置一组音乐库,并设置播放列表。各种各样的选择。

虽然我有很好的建议,但我相信这就是op所遵循的。我认为op的问题与处理嵌套类的经验不足有关,静态/非静态嵌套类之间的差异是他两个错误的唯一解释。虽然我认为op遵循的是好的建议。我认为op的问题与处理嵌套类的经验不足有关,静态/非静态嵌套类之间的差异是他两个错误的唯一解释。他尝试了,但又出现了一个错误。他尝试了,但又出现了一个错误。