非静态变量名称不能从静态上下文引用

class Singer { String name; String album; public Singer(){ name="Whitney Houson"; album="Latest Releases"; } public static void main(String[] args) { System.out.println("Name of the singer is "+name); System.out.println("Album Information stored for "+album); } } 

当我运行此代码时,我发现错误,表示无法从静态上下文引用非静态变量名称

那是因为变量名和专辑在主过程中不存在,因为它是静态的,这意味着它无法访问实例级成员。 你需要一个Singer类的实例,如下所示:

 public static void main(String[] args) { Singer s = new Singer(); System.out.println("Name of the singer is " + s.name); System.out.println("Album information stored for " + s.album); } 

但是,除非您使用公共访问修饰符声明您的名称/专辑成员,否则上述代码将无法编译。 我建议为每个成员编写一个getter(getName(),getAlbum()等),以便从封装中受益。 喜欢这个:

 class Singer { private String name; private String album; public Singer() { this.name = "Whitney Houston"; this.album = "Latest Releases"; } public String getName() { return this.name; } public String getAlbum() { return this.album; } public static void main(String[] args) { Singer s = new Singer(); System.out.println("Name of the singer is " + s.getName()); System.out.println("Album information stored for " + s.getAlbum()); } } 

另一种方法是将名称和专辑声明为静态,然后您可以按照最初的预期方式引用它们。

需要实例化非静态成员或类才能存在。 然后,从静态成员访问非静态成员或对象并不能保证实例化该成员或对象,因此无法访问它。

您需要在静态上下文中创建非静态对象的实例才能实现它。

 class Singer { String name; String album; // You will need the following to make your code compile, // and the call to these getters within your 'main' function. public getName() { return name; } public getAlbum() { return album; } public Singer() { name="Whitney Houson"; album="Latest Releases"; } } public static void main(String[] args) { Singer singer = new Singer(); System.out.println("Name of the singer is " + singer.getName()); System.out.println("Album Information stored for " + singer.getAlbum()); } 

这样,您可以将Singer对象的实例化包含到静态对象中,以确保在访问之前对其进行正确实例化。

Main是一种静态方法。 如果没有引用类的实例,则无法从静态方法访问实例变量(在类中定义但未标记为静态的变量)。

 public static void main(String[] args) { Singer singer = new Singer(); System.out.println("Name of the singer is " + singer.name); System.out.println("Album Information stored for " + singer.album); } 

一个选择是Chris Hutchinson提到的。 另一个是将它们声明为静态。

main是一种静态方法。 因此名称和专辑必须声明为静态。

 private static String name; private static String album; 

为了进一步扩展Chris的答案,你可以在技术上拥有尽可能多的Singer类实例,因为你的内存可以支持,但只有一个主函数的实例在运行。 这意味着尝试从静态函数访问这些变量意味着它不知道它应该访问哪个变量实例,因此错误。

您可以将变量设置为main函数的局部变量,但这可能会破坏程序的目的,因为逻辑会指示可能有多个歌手(最有可能)。 更好的攻击计划是创建一个包含main函数的generics类,然后在其中(或其他地方)创建一个Singer类,并在main函数中实例化该类的X实例并从那里开始。