web-dev-qa-db-fra.com

champs finaux statiques privés

Je voudrais juste clarifier ceci. Quelle est la différence entre -

private static int STUDENT_AGE = 18; 

et

private static final int STUDENT_AGE = 18; 

dans le domaine?

Jon Skeet a expliqué comme "pas du tout lié à un cas particulier", ok je pense que je le comprends. Alors que fait exactement dans ce cas final?

Le code ci-dessous ne fonctionne pas, car l'âge de l'élève est défini comme final statique? Cela signifie-t-il que l'âge par défaut ne peut pas être écrasé? alors est-il possible de créer le constructeur qui spécifie un âge autre que celui par défaut?

private String myName;
private String myAddress;
private int myYearEnrolled;
private String myGender; 
private static final int STUDENT_AGE = 18; 

public Student(String name, String address, int year, String gender) {
    myName = name;
    myAddress = address;
    myYearEnrolled = year;
    myGender = gender; 
}

   public Student(int age)
{
     STUDENT_AGE = age; 
}
10
user1721548

Une fois qu'une variable est déclarée final, sa valeur ne peut plus être modifiée ultérieurement. Dans l'exemple de code que vous avez fourni, une constante est déclarée pour définir l'âge d'un étudiant pour une activité particulière. Cela pourrait signifier qu'il y aura une condition dans laquelle, pour certaines activités, l'âge de l'élève sera comparé à cette constante. Si l’âge de l’élève est supérieur à 18 ans, alors seulement il sera autorisé à poursuivre ou non.

6
Sumit Desai

static signifie "pas du tout lié à une instance particulière" - final signifie que vous ne pouvez pas modifier cette valeur après l'initialisation et que cette valeur must doit être initialisée.

La combinaison de final et static vous permet de créer des constantes. Ceci n’est plus recommandé de manière publique (totalement acceptable pour les nombres magiques, par exemple, dans un contexte privé) car il n’est pas typé. Utilisez Enum post Java 1.5 ou créez vos propres répertoires typesafe antérieurs à Java 1.5 comme suggéré dans Joshua Blochs Effective Java et this question.

Remarque: en lisant cela environ un an plus tard, je pense avoir besoin d'insister sur le fait qu'il n'y a aucun problème avec les champs public static final en général, mais que les constantes nommées doivent être implémentées avec enums ou un autre type alternatif sûr.

21
atamanroman
 private static final int STUDENT_AGE = 18;

C'est une déclaration constante. Vous ne pouvez pas changer la valeur.

private static int STUDENT_AGE = 18;

C'est une déclaration statique mais pas constante. La valeur peut être changée.

3

Pour dire simplement, le modificateur final signifie sa FINALE. vous ne pouvez pas changer la valeur une fois définie.

Et pour répondre à vos besoins, si vous souhaitez fournir l’âge par défaut si rien n’est fourni, supprimez simplement le dernier modificateur de la variable STUDENT_AGE. exactement ce que @Quoi a dit

1
Rohini Kumar

Les variables final ne peuvent être initialisées qu'une seule fois.

1
JonH

Le modificateur final sur un champ signifie que la valeur du champ ne peut pas être modifiée une fois initialisée.

De ce fait, vous ne pouvez pas définir STUDENT_AGE = age; à moins que ce ne soit non final.

1
Vulcan

Les variables final static ne peuvent être initialisées qu'une seule fois, mais pas nécessairement au moment de la déclaration. Mais une fois initialisée, sa valeur ne peut plus être modifiée. Vous pouvez donc initialiser votre variable final static au moment de la déclaration ou en bloc statique.

private static final int STUDENT_AGE = 20;

ou

private static final int STUDENT_AGE;
static {
      STUDENT_AGE = 20;
}

Désormais, une variable static (également appelée variable class) n'est spécifique à aucune instance. Il est partagé entre toutes les instances de cette classe.

Voir cette façon, les variables Static sont chargées en mémoire lorsque la classe est chargée pour la première fois .. C'est pourquoi elle est partagée par toutes les instances. Ainsi, toute modification de variable statique par une instance sera répercutée sur toutes les autres instances de cette classe (oui, vous avez bien lu. Vous pouvez accéder aux variables static via la variable d'instance de la classe également .. Mais le compilateur est finalement préoccupé classe seulement)

0
Rohit Jain