2017-09-28 3 views
0

Bonjour Je reçois actuellement l'erreur commune de "Domino.java:32: erreur: méthode non statique getValue() ne peut pas être référencée à partir d'un contexte statique" Je comprends que c'est un problème car c'est seulement une instance de la méthode getValue. Dans cette méthode compareTo, j'essaie de passer dans un certain domino et de le comparer à l'ensemble domino et de retourner un -1,0,1 en fonction de certaines comparaisons. J'ai besoin de la somme des deux côtés du domino pour les comparer, c'est pourquoi j'essayais d'obtenir domino.getValue(), à ce stade je ne suis pas sûr de savoir comment implémenter ceci. Toute suggestion ou aide serait très appréciéMéthode non statique ne peut pas être référencée à partir d'un contexte statique

public class Domino { 
    public static int side1; 
    public static int side2; 

     public Domino(int aside, int bside){ 
      side1 = aside; 
      side2 = bside ; 
     } 
     public Domino() { 
      side1 = 4; 
      side2 = 5; 
     } 

     public boolean isDouble(){ 
      if(side1 == side2) { 
       return true; 
      } 
      else { 
       return false; 
      } 
     } 
     public int getValue(){ 
      return side1 + side2; 
     } 
     public int compareTo(Domino someDomino) 
     { 
      int count = 0; 
      if(Domino.getValue() < someDomino.getValue()){ 
       count = -1; 
      }if(Domino.getValue() > someDomino.getValue()){ 
        count = 1; 
       } 
      if(Domino.getValue() == someDomino.getValue()){ 
        count = -0; 
       } 
      return count; 
     } 

     public static void main(String args[]) { 

     } 

} 
+0

En dehors de la question que vous posez A propos de la méthode compareTo (...), cela échouera car vous stockez les valeurs de chaque côté comme des variables statiques au lieu des variables d'instance. Lorsque vous créez le deuxième Domino, il écrase les valeurs que le premier a stockées - elles auront toutes la même valeur. – JonathanS

Répondre

1

Ceci est parce que vous êtes appeler les méthodes statiquement de la classe Domino dans le côté de votre méthode compareTo. Débarrassez-vous de la partie Domino. de vos appels à getValue().

public int compareTo(Domino someDomino) 
     { 
      int count = 0; 
      if(getValue() < someDomino.getValue()){ 
       count = -1; 
      }if(getValue() > someDomino.getValue()){ 
        count = 1; 
       } 
      if(getValue() == someDomino.getValue()){ 
        count = -0; 
       } 
      return count; 
     } 
1

Domino est la classe elle-même, vous devez comparer l'objet dans le paramètre (paramètre explicite) avec l'instance en cours (paramètre implicite), celui sur lequel vous appelez la méthode, il est this

public int compareTo(Domino someDomino){ 
    int count = 0; 
    if(this.getValue() < someDomino.getValue()){ 
     count = -1; 
    }else if(this.getValue() > someDomino.getValue()){ 
     count = 1; 
    } 
    return count; 
} 

C'est le même:

public int compareTo(Domino someDomino) { 
    return Integer.compare(this.getValue(), someDomino.getValue()); 
} 

également:

  • utilisation else if parce que vos tests ne peuvent pas être à la fois vrai
  • pas besoin de vérifier equality à la fin, si ce ne < et non > il est donc == et compte sera déjà equals à 0
  • IMPORTANTpublic static int side1; =>public int side1; si elles sont statiques, ils seront identiques pour CHAQUE Domino

Il une bonne pratique serait d'ajouter une interface Comparable, pour permettre le tri des Dominos dans une liste pour les ex, la méthode compareTo() sera utilisé automatiquement

public class Domino implements Comparable<Domino>{...} 
+0

Lorsque la classe est écrite, elle renvoie toujours 0 car les instances Domino stockent les valeurs en tant que variables de classe. Ça devrait être bien si side1 et side2 sont non statiques. – JonathanS

+0

@JonathanS j'ai édité juste une minute avant de commenter;) – azro