No enclosing instance of type is accessible

Résolu
domxaline -  
 domxaline -
Bonjour,
en compilant mon prg,j'ai eu cette erreur, veuillez m'aidez svp:

"No enclosing instance of type Personnage is accessible. Must qualify the allocation with an enclosing instance of type Personnage
(e.g. x.new A() where x is an instance of Personnage)."

public abstract class Personnage 
{
 public void seDeplacer()
 {
  System.out.println("Je me déplace à pied.");
 }
 
 public  void combattre()
 {
  System.out.println("Je ne combat pas!");
 } 
 public class Guerrier extends Personnage
 {
  public void combattre()
  {
   System.out.println("Fusil,Pistolet,Couteau! Tous ce que tu veux!");
  }
  
 } 
 public class Medecin extends Personnage
 {
  public void combattre()
  {
   System.out.println("Vive le scalpel!");
  }
  
  public void soigner()
  {
   System.out.println("Je soigne les blessures.");
  }
 } 
 public class Civil extends Personnage
 {
  public void combattre()
  {
   System.out.println("Je ne combat pas!");
  }
  public void seDeplacer()
  {
   System.out.println("Je me déplace à pied.");
  }
 } 
 public class Chirurgien extends Personnage
 {
  public void combattre()
  {
   System.out.println("Je ne combat pas!");
  }
  public void seDeplacer()
  {
   System.out.println("Je me déplace à pied.");
  }
  public void soigner()
  {
   System.out.println("Je fais des opérations.");
  }
 } 
 public class Sniper extends Personnage
 {
  public void combattre()
  {
   System.out.println("Je me sers de mon fusil à lunette!");
  }
  public void seDeplacer()
  {
   System.out.println("Je me déplace à pied.");
  }
 } 
 public static void main(String[]args)
 {
  Personnage[]tPers=
  {new Guerrier(),new Chirurgien(),new Civil(),new Sniper(), new Medecin()};
  for(Personnage p:tPers)
  {
   System.out.println("\nInstance de "+p.getClass().getName());
   System.out.println("******************************************************");
   p.combattre();
   p.seDeplacer();
  }
 } 
}

9 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Le problème c'est que tu as fait

    public class A
    {
         public class B
         {
         }
    }
    
    B b = new B();

    Or cela n'est pas possible, car les objets de B doivent dépendre des objets de A.

    Il faudrait faire :

    A a = new A();
    B b = a.new B();

    Or dans ton cas c'est impossible car A est une classe abstraite ! Il faudrait donc utiliser une implémentation de A, mais les seules implémentations que tu as c'est B...

    Première solution, tu considères que la classe B est static, elle ne dépend donc plus des objets de A mais de la classe, il n'est donc plus nécessaire d'instancier un objet A.

    public class A
    {
         public static class B
         {
         }
    }
    
    A.B b = new A.B();

    Deuxième solution, qui est à mon avis la meilleure dans ton cas, tu ne fais pas de classes internes, mais tu mets chaque classe dans son propre fichier.

    public class A
    {
    }
    
    public class B
    {
    }
    
    B b = new B();
    6