2010-11-19 110 views
8
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); 

} 
} 

当我运行这段代码我发现错误,说非静态变量名称不能从静态上下文非静态变量名称不能从静态上下文中引用

回答

10

这是被引用,因为变量名和相册不存在于主程序中,因为它是静态的,这意味着它不能访问实例级别的成员。您将需要歌手类的一个实例,像这样:

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

} 

} 

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

+0

'... + s.name); ... + s.album);' – khachik 2010-11-19 16:01:57

+0

顺便说一句,上面的代码将编译并运行良好,如果名称是私有的,因为'main'也属于'Singer'。 – khachik 2010-11-19 16:05:04

0

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

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

private static String name; 
private static String album; 
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); 
} 
+0

当我编写这段代码时,没有发生错误,但是当我运行这段代码时,给出了一个错误,就像线程“main”java.lang.NoClassDefFoundError中的异常:Singer – 2010-11-19 16:32:02

0

要扩展更多的克里斯的回答,您可以在技术上有歌手类作为你的内存可以支持多个实例,但只有永远一个主要功能运行的实例。这意味着试图从静态函数访问这些变量意味着它不知道应该访问哪个变量的实例,因此是错误。

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

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对象的实例成静态对象,保证的Thuis被访问前它是正确实例。

相关问题