Question

Pourquoi ce code fonctionne-t-il?

public class Final {
    public final int[][] arr = new int[2][];
    Final(){
        arr[0] = new int[4];
        arr[0] = new int[5];
        arr[1] = new int[4];
        }
    public static void main(String[] args) {
        Final fi = new Final();
        System.out.println(fi.arr[0].length);
        System.out.println(fi.arr[1].length);
    }
}

alors que ce qui suit ne pas travailler (ce qui est correct comme je le suppose).

public class Final {
    public final int[] arr;
    Final(){
        arr = new int[4];
        arr = new int[5];
        }
    public static void main(String[] args) {
        Final fi = new Final();
        System.out.println(fi.arr.length);
    }
}

Quand est le final Déclaration "Kicking In"?

Était-ce utile?

La solution

La final Le mot-clé indique que la valeur de la variable ne changera pas une fois qu'elle sera initialisée. Cela a le plus de sens pour les primitives, où final int = 5; signifie qu'il ne peut pas être réaffecté 6.

Pour les variables de référence, cela signifie qu'il ne peut pas être réaffecté à une autre référence, car la valeur est la référence à un objet. Mais cela ne vous empêche pas de modifier le Contenu du tableau. Cela vous empêche de faire une autre affectation à la variable de référence. C'est pourquoi le deuxième morceau de code ne fonctionne pas - vous lui attribuez un autre objet une fois qu'il a déjà été attribué pour la première fois.

Autres conseils

Vous ne modifiez pas le panier, mais plutôt les pommes à l'intérieur.

L'instance de int[][] Ne change jamais, juste le contenu à l'intérieur.

Le fait que arr est marqué final signifie juste que tu ne peux pas faire arr référence à une valeur différente. Vous êtes toujours entièrement libre de modifier le contenu du tableau.

Cela signifie donc que cela n'est pas autorisé:

arr = new int[4];
arr = new int[5]; //Reassigning a final variable that's already initialized- bad!

Mais c'est bien:

 arr[0] = new int[4]; 
 arr[0] = new int[5];
 arr[1] = new int[4]; //We haven't changed the array that arr is pointing to

Les tableaux sont des objets en java. Les variables d'objet sont en fait des références à un objet. Les variables finales ou les champs finaux sont des références qui ne peuvent pas pointer vers un autre objet après initialisation. L'objet référencé lui-même peut être modifié. Vous devez distinguer la référence et l'objet référencé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top