web-dev-qa-db-fra.com

Un tableau est-il un type primitif ou un objet (ou autre chose entièrement)?

La question est essentiellement explicite. Je n'ai pas été en mesure de trouver une API pour les tableaux (à part cela tableaux , mais cela définit simplement un tas de fonctions d'assistance statiques pour traiter les tableaux réels). S'il n'y a pas de classe pour cela, cela semble suggérer qu'un tableau ne peut pas être un Object.

Cependant, le fait qu'un tableau ait des champs publics comme length et des méthodes qu'il peut invoquer comme .equals() et .clone() semblent suggérer (très fortement) l'opposé complet.

Quelle est l'explication de l'étrange présentation et du comportement des tableaux primitifs?

Comme note, j'ai essayé d'utiliser la fonctionnalité Eclipse "Open Implementation" sur la méthode .clone() d'un tableau tout à l'heure, en espérant que je serais en mesure de voir où et comment cette méthode a été définie (car elle dit int [] l'a remplacé par Object), mais cela a en fait provoqué le gel et le plantage de l'ensemble de mon Eclipse ...

52
asteri

Il existe une classe pour chaque type de tableau, il existe donc une classe pour int[], il y a une classe pour Foo[]. Ces classes sont créées par JVM. Vous pouvez y accéder par int[].class, Foo[].class. La super classe directe de ces classes est Object.class

public static void main(String[] args)
{
    test(int[].class);
    test(String[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}

Il existe également une règle de sous-typage au moment de la compilation, si A est un sous-type de B, A[] est un sous-type de B[].

60
irreputable

Java Language Specification devrait vous donner une idée:

La superclasse directe d'un type tableau est Object.

Chaque type de tableau implémente les interfaces Cloneable et Java.io.Serializable.

De plus :

Un objet est une instance de classe ou un tableau.

Les tableaux ne sont donc pas des instances et vous n'avez donc pas besoin d'un constructeur pour les créer. À la place, vous utilisez Expressions de création de tablea .

27
Baz

Voir le code ci-dessous. Il compile: -

    int[] arr = new int[2];
    System.out.println(arr.toString());

Maintenant, sur n'importe quel type primitif, vous ne pouvez pas appeler une méthode (toString()) définie dans la classe Object (Ou, n'importe quelle méthode d'ailleurs). Ainsi, un tableau est essentiellement un Object. .

OK, c'est parti: -

À partir de JLS Section 4. : -

Il existe quatre types de types de référence: les types de classe (§8), les types d'interface (§9), les variables de type (§4.4) et les types de tableau (§10).

Et, Section 1 : -

Dans le langage de programmation Java Java, les tableaux sont des objets (§4.3.1), sont créés dynamiquement et peuvent être affectés à des variables de type Object (§4.3.2). Toutes les méthodes de la classe Object peut être invoqué sur un tableau.

Donc, à partir de la première citation, Array n'est pas réellement une classe .. C'est un autre type .. Mais, essentiellement, les tableaux sont des objets, mais pas de Class, mais ils sont de Array type .. Ce ne sont donc pas des instances d'une classe, et peuvent être des objets de array sont définis pour être créés de cette façon ..

14
Rohit Jain

Si court et simple, oui <Type> [] est un type de Object. Il s'étend directement de Object tel que je le comprends. Il y a toutes les méthodes Object dessus, toString(), hashCode(), ... Plus une variable exposée spéciale appelée length. La classe Java.util.Arrays est une classe utilitaire pour traiter les types de tableaux. C'est un peu déroutant lorsque vous ajoutez au désordre des choses comme: int[] n'hérite pas de Object[]. De plus, contrairement aux autres types Object, il n'y a pas de constructeur pour les types de tableau. Ils respectent le mot clé new mais c'est généralement à allouer pour la taille. C'est un peu bizarre, mais juste une de ces bizarreries linguistiques.

Pour répondre à la question, oui, c'est un objet.

7
Greg Giacovelli

Un tableau est un objet conteneur qui contient un nombre fixe de valeurs d'un seul type.

Voir http://docs.Oracle.com/javase/tutorial/Java/nutsandbolts/arrays.html

3
Aleksandr M

Seuls ces plusieurs types primitifs dans Java comme nous le savons. Fondamentalement, nous avons encore plusieurs étapes pour créer un tableau, comme déclarer, construire ou initialiser si nécessaire, et cela signifie que tableau est un objet en effet.

En approfondissant, les types primitifs pourraient être stockés en mémoire avec les valeurs d'origine mais l'objet est une adresse (référence). Nous pouvons donc imaginer un paradoxe, comment pourrions-nous stocker les valeurs d'origine dans la mémoire si le tableau est de type primitif? Je pense la même chose que String, mais String est un objet final afin que vous puissiez construire un objet d'une manière simple, String s = "s", comme un type primitif.

0
Eric