Un tableau est-il un objet en java


93

En java, nous pouvons déclarer un tableau comme

String[] array = new String[10]; 
int size = array.length; 

Cela signifie-t-il que le tableau lui-même est un objet? Parce qu'en C ++, un tableau n'est qu'un pointeur et n'a aucune méthode.


5
Non, en C ++, un tableau est un tableau et non pas un tableau.
Kerrek SB

42
if (array instanceof Object) System.out.println("Yes!")
skaffman

6
Oh, et en C ++, les tableaux et les pointeurs sont des objets.
R. Martinho Fernandes

2
@ R.MartinhoFernandes Tous les tableaux C ++ sont en effet des objets C ++, mais il existe des pointeurs C ++ qui ne sont pas des objets C ++, à savoir tous les pointeurs qui sont le résultat de l'évaluation d'une rvalue. Les exemples incluent &x, p+iet new int(42).
fredoverflow

1
@skaffman Le message n'est pas strictement nécessaire, car il ne se compilerait pas autrement.
shmosel

Réponses:



60

Oui; la spécification du langage Java écrit :

Dans le langage de programmation 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 peuvent être appelées sur un tableau.


Si tableau est un objet, cela ne signifie-t-il pas qu'il s'agit d'une instance d'une classe? Si oui, puis-je prolonger cette classe?
One Two Three

9
Non, ce n'est pas le cas: la spécification Java écrit : "Un objet est une instance de classe ou un tableau. Une instance de classe est explicitement créée par une expression de création d'instance de classe (§15.9). Un tableau est explicitement créé par une expression de création de tableau. (§15.10). ". Et non, vous ne pouvez pas étendre un tableau, car la clause extend doit comporter un ClassType.
meriton

36

Eh bien, demandons à Java!

public class HelloWorld
{
  public static void main(String[] args)
  {
    System.out.println(args instanceof Object);
    int[] someIntegers = new int[] {42};
    System.out.println(someIntegers instanceof Object);
  }
}

Production:

true
true

1
Vous pouvez également déclarer int[] someIntegers = {42};, au même résultat.
Holger

7

Oui, c'est un objet en Java.

Notez également que lorsque vous le faites, array.lengthvous n'appelez aucune méthode mais vous accédez simplement au lengthchamp du tableau . Il existe de nombreuses méthodes statiques dans la classe Arrays .


3

Il serait important de noter que les tableaux en Java ont leurs propres codes d'octets qu'ils ne partagent pas avec les objets. Ce sont certainement des objets, mais ils sont traités légèrement différemment au bas niveau.


2

Je dirais que la réponse est oui, même si je pourrais ajouter que, à proprement parler, un tableau est également un objet en C ++. À partir du §1.8 [intro.object] de la norme actuelle (FDIS):

Un objet est une région de stockage.



1

Chaque tableau en java est un objet ex int [] a = new int [2]; Donc, new est utilisé pour créer un objet et comme c'est un objet, nous pouvons vérifier le nom de la classe en utilisant simplement a.getClass (). GetName ();


1
  1. Un tableau n'est pas une instance d'une classe répertoriée dans l'arborescence des classes, cependant chaque tableau est un objet et hérite directement de java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. La classe java.util.Arraysest une classe d'assistance et les tableaux ne sont pas des instances de cette classe.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. La classe java.lang.reflect.Arrayest une classe d'assistance et les tableaux ne sont pas des instances de cette classe.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Les tableaux héritent de tous les membres de java.lang.Object

  2. Les tableaux remplacent la méthode clone()héritée de Object.

  3. Les tableaux implémentent le champ length, qui contient le nombre de composants du tableau. la longueur peut être positive ou nulle. C'est publicet final.

  4. Les tableaux implémentent les interfaces Cloneableet java.io.Serializable.

8a. Les tableaux sont pris en charge par Class<T>. Vous pouvez récupérer l' Class<T>instance à partir d'une instance de tableau

(new int[2]).getClass()

ou à partir d'un type de tableau

int[].class

8b. Une instance de classe de réflexion unique (c'est-à-dire une instance de java.lang.Class<T>) est créée pour chaque type de tableau différent dans votre code. Exemples

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Pour répéter: les tableaux sont des objets mais ne sont des instances d'aucune classe dans l'arborescence des classes.

RÉFÉRENCES

À partir de la spécification Java Section 4.3.1 Objets

  • Un objet est une instance de classe ou un tableau.

  • Une instance de classe est explicitement créée par une expression de création d'instance de classe.

  • Un tableau est créé explicitement par une expression de création de tableau.

de java.util.Arrays

  • Cette classe contient diverses méthodes pour manipuler les tableaux (comme le tri et la recherche)

de java.lang.reflect.Array

  • La classe Array fournit des méthodes statiques pour créer et accéder dynamiquement à des tableaux Java.

De la section 10.1 Objets

  • La superclasse directe d'un type de tableau est Object.

  • Chaque type de tableau implémente les interfaces Cloneableet java.io.Serializable.

À partir de la section 10.7 Membres du groupe

Les membres d'un type de tableau sont tous les suivants:

  • Le champ final public length, qui contient le nombre de composants du tableau. la longueur peut être positive ou nulle.

  • La méthode publique clone, qui remplace la méthode du même nom dans la classe Objectet ne lève aucune exception vérifiée. Le type de retour de la cloneméthode d'un type tableau T[]est T[].

  • Un clone d'un tableau multidimensionnel est peu profond, c'est-à-dire qu'il ne crée qu'un seul nouveau tableau. Les sous-tableaux sont partagés.

  • Tous les membres hérités de la classe Object; la seule méthode d'Object qui n'est pas héritée est sa méthode de clonage.


1

Les tableaux de n'importe quoi sont des objets. On peut appeler des méthodes telles que equals, hashcodeetc:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

On ne peut pas appeler de méthodes sur un type natif.


0

Observez ci-dessous l'extrait de code et la sortie.

public class Tester {
int a[];
public static void main(String[] args) {
    System.out.println(new Tester().a);// null
    System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}

}

clairement le tableau a est traité comme un objet.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.