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

} 
} 

Quand je lance ce code je trouve une erreur qui dit que le nom variable non statique ne peut pas être référencé à partir d'un contexte statiquenom de la variable non statique ne peut pas être référencé à partir d'un contexte statique

Répondre

10

C'est parce que le nom des variables et L'album n'existe pas dans la procédure principale, car il est statique, ce qui signifie qu'il ne peut pas accéder aux membres de niveau instance. Vous aurez besoin d'une instance de la classe Singer, comme ceci:

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

Cependant, à moins que vous déclarez vos membres nom/album avec un modificateur d'accès public, le code ci-dessus ne parviendra pas à compiler. J'ai recommandé d'écrire un getter pour chaque membre (getName(), getAlbum(), etc), afin de bénéficier de l'encapsulation. Comme ceci:

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

} 

} 

Une autre alternative serait de déclarer le nom et l'album comme statique, alors vous pouvez les référencer dans la façon dont vous avez initialement prévu.

+0

'... + s.nom); ... + s.album); ' – khachik

+0

BTW, le code ci-dessus va compiler et fonctionner correctement, si le nom est privé puisque' main' appartient aussi à 'Singer'. – khachik

0

Une option est ce que Chris Hutchinson a mentionné. L'autre est de les déclarer statiques.

principal est une méthode statique. Donc le nom et l'album doivent être déclarés comme statiques.

private static String name; 
private static String album; 
1

Main est une méthode statique. Les variables d'instance (variables définies dans la classe mais non marquées comme statiques) ne sont pas accessibles à partir d'une méthode statique sans référencer une instance de la classe.

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

quand j'ai respecté ce code aucune erreur ne s'est produite mais quand je cours ce code une erreur est donnée qui indique comme Exception dans le fil "principal" java.lang.NoClassDefFoundError: Chanteur –

0

Pour développer davantage sur la réponse de Chris, vous pouvez techniquement avoir autant de cas de la classe Singer que votre mémoire peut prendre en charge, mais il n'y a jamais qu'un seul exemple de la course principale de la fonction. Cela signifie que tenter d'accéder à ces variables à partir de la fonction statique signifie qu'elle n'a aucune idée de l'instance de la variable à laquelle elle devrait accéder, d'où l'erreur.

Vous pouvez rendre les variables locales à la fonction principale, mais cela irait probablement à l'encontre de l'objectif du programme, puisque la logique voudrait qu'il y ait plus d'un chanteur (très probablement). Un meilleur plan d'attaque serait de créer une classe générique qui héberge la fonction principale, puis de créer une classe Singer à l'intérieur de celle-ci (ou ailleurs) et instancier X instances de cette classe dans votre fonction principale et partir de là.

2

Un membre ou une classe non statique doit être instancié pour exister. Ensuite, l'accès à un membre ou à un objet non statique à partir d'un membre statique ne garantit pas que ce membre ou objet est instancié, alors l'accès à celui-ci est impossible.

Vous devrez créer une instance de votre objet non statique dans votre contexte statique pour le créer.

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

De cette façon, vous incluez le instanciation de l'objet Singer dans un objet statique, thuis assurant qu'il est instancié correctement avant qu'il ne soit accessible.

Questions connexes