¿Es una matriz un objeto en java?

93

En java podemos declarar una matriz como

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

¿Significa esto que la matriz en sí es un objeto? Porque en C ++ una matriz es solo un puntero y no tiene ningún método.

Mike G
fuente
5
No, en C ++ una matriz es una matriz y no no una matriz.
Kerrek SB
42
if (array instanceof Object) System.out.println("Yes!")
skaffman
6
Ah, y en C ++, tanto las matrices como los punteros son objetos.
R. Martinho Fernandes
2
@ R.MartinhoFernandes Todas las matrices de C ++ son objetos de C ++ de hecho, pero hay punteros de C ++ que no son objetos de C ++, es decir, todos los punteros que son el resultado de evaluar un rvalue. Los ejemplos incluyen &x, p+iy new int(42).
fredoverflow
1
@skaffman El mensaje no es estrictamente necesario, ya que no se compilaría de otra manera.
shmosel

Respuestas:

197

Si.

La sección 4.3.1 de la especificación del lenguaje Java comienza con:

Un objeto es una instancia de clase o una matriz.

Pablo
fuente
4
Hasta ahora siempre asumí que un objeto era sinónimo de instancia de clase y que las matrices eran una característica especial del lenguaje o algo así.
Ruben9922
Aquí se proporciona una explicación detallada: geeksforgeeks.org/array-primitive-type-object-java
garnet
60

Si; la especificación del lenguaje Java escribe :

En el lenguaje de programación Java, las matrices son objetos (§4.3.1), se crean dinámicamente y pueden asignarse a variables de tipo Objeto (§4.3.2). Todos los métodos de la clase Object pueden invocarse en una matriz.

meriton
fuente
Si la matriz es un objeto, ¿no significa eso que es una instancia de una clase? Si es así, ¿puedo extender esa clase?
One Two Three
9
No, no lo hace: La especificación de Java escribe : "Un objeto es una instancia de clase o una matriz. Una instancia de clase se crea explícitamente mediante una expresión de creación de instancia de clase (§15.9). Una matriz se crea explícitamente mediante una expresión de creación de matriz (§15.10). ". Y no, no puede extender una matriz, porque la cláusula extiende debe incluir un ClassType.
meriton
36

Bueno, ¡preguntemos a 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);
  }
}

Salida:

true
true
nasukkin
fuente
1
También puede declarar int[] someIntegers = {42};, al mismo resultado.
Holger
7

Sí, es un objeto en Java.

También tenga en cuenta que cuando lo hace array.lengthno está invocando ningún método, sino simplemente accediendo al lengthcampo de la matriz . Hay muchos métodos estáticos en la clase Arrays .

Marsellus Wallace
fuente
3

Sería importante tener en cuenta que las matrices en Java tienen sus propios códigos de bytes que no comparten con los objetos. Ciertamente son Objetos, pero se manejan de manera ligeramente diferente en el nivel bajo.

ed209
fuente
2

Yo diría que la respuesta es sí, aunque podría agregar que, estrictamente hablando, una matriz también es un objeto en C ++. De §1.8 [intro.object] del estándar actual (FDIS):

Un objeto es una región de almacenamiento.

Björn Pollex
fuente
1

Cada arreglo en java es un objeto ex int [] a = new int [2]; Entonces, new se usa para crear un objeto y, como es un objeto, podemos verificar el nombre de la clase simplemente usando a.getClass (). GetName ();

Manoj Mohanty
fuente
1
  1. Una matriz no es una instancia de ninguna clase enumerada en el árbol de clases, sin embargo, cada matriz es un objeto y hereda directamente de java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
  1. La clase java.util.Arrayses una clase auxiliar y las matrices no son instancias de esta clase.
(new int[1]) instanceof java.util.Arrays    // -> compile error
  1. La clase java.lang.reflect.Arrayes una clase auxiliar y las matrices no son instancias de esta clase.
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
  1. Las matrices heredan todos los miembros de java.lang.Object

  2. Las matrices anulan el método clone()heredado Object.

  3. Las matrices implementan el campo length, que contiene el número de componentes de la matriz. la longitud puede ser positiva o cero. Es publicy final.

  4. Las matrices implementan las interfaces Cloneabley java.io.Serializable.

8a. Las matrices son compatibles con Class<T>. Puede recuperar la Class<T>instancia de una instancia de matriz

(new int[2]).getClass()

o de un tipo de matriz

int[].class

8b. Se java.lang.Class<T>crea una instancia de clase de reflexión única (es decir, una instancia de ) para cada tipo de matriz diferente en su código. Ejemplos

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
  1. Para repetir: las matrices son objetos pero no son instancias de ninguna clase en el árbol de clases.

REFERENCIAS

De la especificación Java Sección 4.3.1 Objetos

  • Un objeto es una instancia de clase o una matriz.

  • Una instancia de clase se crea explícitamente mediante una expresión de creación de instancia de clase.

  • Una matriz se crea explícitamente mediante una expresión de creación de matriz.

De java.util.Arrays

  • Esta clase contiene varios métodos para manipular matrices (como ordenar y buscar)

De java.lang.reflect.Array

  • La clase Array proporciona métodos estáticos para crear y acceder dinámicamente a matrices Java.

De la Sección 10.1 Objetos

  • La superclase directa de un tipo de matriz es Object.

  • Cada tipo de matriz implementa las interfaces Cloneabley java.io.Serializable.

De Sección 10.7 Miembros de la matriz

Los miembros de un tipo de matriz son todos los siguientes:

  • El campo final público length, que contiene el número de componentes de la matriz. la longitud puede ser positiva o cero.

  • El método público clone, que anula el método del mismo nombre en la clase Objecty no arroja excepciones marcadas. El tipo de retorno del clonemétodo de un tipo de matriz T[]es T[].

  • Un clon de una matriz multidimensional es poco profundo, es decir, crea solo una nueva matriz. Los subarreglos se comparten.

  • Todos los miembros heredados de la clase Object; el único método de Object que no se hereda es su método de clonación.

RFS
fuente
1

Las matrices de cualquier cosa son objetos. Uno puede llamar a métodos como equals, hashcodeetc:

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

No se pueden llamar métodos en un tipo nativo.

fastcodejava
fuente
0

Observe el siguiente fragmento de código y la salida.

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)
}

}

claramente la matriz a se trata como un objeto.

Vishnu Dahatonde
fuente