无法从静态上下文引用非静态变量名称

时间:2010-11-19 15:57:15

标签: java

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);

 }
}

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

5 个答案:

答案 0 :(得分:10)

这是因为变量名和专辑在主过程中不存在,因为它是静态的,这意味着它无法访问实例级成员。你需要一个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);
}

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

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());

 }

}

另一种选择是将名称和专辑声明为静态,然后您可以按照原定的方式引用它们。

答案 1 :(得分:2)

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

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

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对象的实例化包含到静态对象中,以确保在访问它之前对其进行实例化。

答案 2 :(得分:1)

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);
}

答案 3 :(得分:0)

克里斯哈钦森提到的一个选择。另一个是将它们声明为静态。

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

private static String name;
private static String album;

答案 4 :(得分:0)

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

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