66 votes

Pourquoi accéder au champ statique de manière statique?

 public enum MyUnits
{
    MILLSECONDS(1, "milliseconds"), SECONDS(2, "seconds"),MINUTES(3,"minutes"), HOURS(4, "hours");

    private MyUnits(int quantity, String units)
    {
        this.quantity = quantity;
        this.units = units;
    }

    private int quantity;
    private  String units;

 public String toString() 
 {
    return (quantity + " " + units);
 }

 public static void main(String[] args) 
 {
    for (MyUnits m : MyUnits.values())
    {
        System.out.println(m.MILLSECONDS);
        System.out.println(m.SECONDS);
        System.out.println(m.MINUTES);
        System.out.println(m.HOURS);
    }
 }
}
 

Cela fait référence à post ..wasnt capable de répondre ou de commenter à tout ainsi créé un nouveau. Pourquoi mes

 System.out.println(m.MILLSECONDS);
 

donner des avertissements-Le champ statique MyUnits.MILLSECONDS doit être accédé de manière statique? Merci.

110voto

Chris Thompson Points 18375

Parce que lorsque vous accédez à un champ statique, vous devez le faire sur la classe (ou dans ce cas, l'enum). Comme dans

MyUnits.MILLISECONDS;

Pas sur une instance comme en

m.MILLISECONDS;

Edit Pour répondre à la question du pourquoi: En Java, lorsque vous déclarez quelque chose comme static, vous dites que c'est un membre de la classe, pas de l'objet (donc pourquoi il n'y a qu'un seul). Par conséquent, il ne fait pas de sens pour l'accès sur l'objet, parce que celle-membre de données est associé à la classe.

74voto

Peter Walser Points 5112

Il y a en fait une bonne raison:
Le non-statique d'accès ne fonctionne pas toujours, pour des raisons d'ambiguïté.

Supposons que nous avons deux classes, A et B, ce dernier étant une sous-classe de A, avec les champs statiques avec le même nom:

public class A {
    public static String VALUE = "Aaa";
}

public class B extends A {
    public static String VALUE = "Bbb";
}

Accès Direct à la variable statique:

A.VALUE (="Aaa")
B.VALUE (="Bbb")

Un accès Indirect à l'aide d'un exemple (il donne un avertissement du compilateur que la VALEUR doit être statique accessible):

new B().VALUE (="Bbb")

Pour l'instant, donc bon, le compilateur ne peut pas deviner quelle variable statique à utiliser, l'un sur la super-classe est en quelque sorte plus loin, me semble logique.

Maintenant, au point où il devient délicat: les Interfaces peuvent également avoir des variables statiques.

public interface C {
    public static String VALUE = "Ccc";
}

public interface D {
    public static String VALUE = "Ddd";
}

Nous allons supprimer la variable statique à partir de B, et observer les situations suivantes:

  • B implements C, D
  • B extends A implements C
  • B extends A implements C, D
  • B extends A implements CA implements D
  • B extends A implements CC extends D
  • ...

L'énoncé new B().VALUE est maintenant ambigu, car le compilateur ne peut pas décider quelle variable statique a été signifié. Et c'est exactement la raison pour laquelle les variables statiques doivent être accessibles de manière statique.

0voto

Vivek Vermani Points 1093

Méthode statique accessible à l'aide de l'objet de référence offre une utilisation très limitée, et par conséquent, ce message d'alerte est générée par le compilateur

  1. Méthode statique ne peut pas accéder aux variables d'instance et ne peut donc pas modifier l'état de l'objet.

  2. Méthode statique à son tour ne peut pas appeler des méthodes d'instance.

Donc le moyen privilégié d'accéder à la méthode statique est soit en utilisant le nom de la Classe ou par l'autre méthode statique et donc le compilateur vous avertit que vous pourriez avoir fourni à cet appel par erreur.

Source - http://www.buggybread.com/2014/06/warning-static-method-test-from-type.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X