uso una tipos que new llamar instanciar hacer hace constructores como comando clase java new-operator

una - tipos de constructores en java



¿Qué hace la palabra clave `new`? (9)

Estoy siguiendo un tutorial de Java en línea, tratando de aprender el idioma, y ​​está saltando entre dos semánticas para usar arrays.

long results[] = new long[3]; results[0] = 1; results[1] = 2; results[2] = 3;

y:

long results[] = {1, 2, 3};

El tutorial nunca mencionó realmente por qué cambió entre los dos, así que busqué un poco sobre el tema. Mi entendimiento actual es que el new operador está creando un objeto del tipo "array of longs". Lo que no entiendo es por qué quiero eso y cuáles son las ramificaciones de eso.

  • ¿Existen ciertos métodos específicos de "matriz" que no funcionarán en una matriz a menos que sea un "objeto de matriz"?
  • ¿Hay algo que no pueda hacer con un "objeto de matriz" que pueda hacer con una matriz normal?
  • ¿La VM de Java tiene que limpiar los objetos inicializados con el new operador que normalmente no tendría que hacer?

Vengo de C, por lo que mi terminología de Java puede no ser correcta aquí, así que solicite una aclaración si algo no es comprensible.


De JLS#Chapter 10. Arrays

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 se pueden invocar en una matriz.

A partir del 10.3. Array Creation 10.3. Array Creation

Una matriz se crea mediante una expresión de creación de matriz (§15.10) o un inicializador de matriz (§10.6)

A partir del 15.10. Array Creation Expressions 15.10. Array Creation Expressions

Una expresión de creación de matriz crea un objeto que es una nueva matriz cuyos elementos son del tipo especificado por PrimitiveType o ClassOrInterfaceType .

A partir del 10.6. Array Initializers 10.6. Array Initializers

Un inicializador de matriz se puede especificar en una declaración (§8.3, §9.3, §14.4), o como parte de una expresión de creación de matriz (§15.10), para crear una matriz y proporcionar algunos valores iniciales.

Ambos inicializan la matriz, la diferencia es la segunda, se inicializa con algunos valores.


En Java, todas las matrices y objetos se asignan en el montón, por lo que en cierto sentido, todas las matrices son "objetos de matriz". Las únicas cosas que se asignan en la pila en Java son las referencias a objetos y los primitivos. Todo lo demás es un objeto que se define y asigna en el montón, incluidas las matrices, independientemente de la sintaxis que utilice para declararlo. (Sus dos ejemplos son equivalentes en el resultado final, consulte JLS §10.3 y sus secciones vinculadas para obtener más información sobre cómo se asignan y asignan realmente cada uno).

Esto es contrario a C / C ++, donde tiene un control explícito sobre la asignación de pila y pila.

Tenga en cuenta que Java es muy rápido cuando se trata de la asignación / desasignación de objetos a corto plazo. Es altamente eficiente debido a su recolector de basura basado en la generación. Así que para responder a sus preguntas:

¿Existen ciertos métodos específicos de "matriz" que no funcionarán en una matriz a menos que sea un "objeto de matriz"? ¿Hay algo que no pueda hacer con un "objeto de matriz" que pueda hacer con una matriz normal?

No existe una matriz que no sea un objeto, entonces no. Sin embargo, hay métodos que no funcionan en matrices primitivas. Un método que toma un Object[] no aceptará un long[] sin primero convertirlo en Long[] . Esto se debe a algunos detalles de implementación de autoboxing en Java 5 y superiores.

¿La VM de Java tiene que limpiar los objetos inicializados con el new operador que normalmente no tendría que hacer?

¿Algo asignado con lo new debe eventualmente ser recogido en la basura, así que en términos de hacer algo que normalmente no haría? No. Sin embargo, tenga en cuenta que en C / C ++, asignar una matriz usando malloc / new significa que también tiene que free / delete [] , lo cual es algo que no tiene que hacer en Java, ya que reclamará la matriz por usted. .

Tenga en cuenta que si su long[] se declara en un método y nunca lo almacena en una referencia fuera de su método, se marcará automáticamente para la recolección de basura al final de la llamada al método. El recolector de basura esperará a reclamar su espacio hasta que lo necesite, pero usted no tiene que hacer ninguna reclamación a través de delete [] (o delete y destructores de objetos).

Edición: algunas referencias según lo prometido:


En ambos casos creas un objeto.

En primera versión:

long results[] = new long[3]; results[0] = 1; results[1] = 2; results[2] = 3;

usted dice en primera línea que el tamaño de la matriz es 3. Luego, se ponen valores en la matriz.

En la segunda versión:

long results[] = {1, 2, 3};

Usted crea la misma matriz y la inicializa en la misma línea. Java calcula que has dado 3 argumentos y hace que el new long[3] sin Tu ayuda :)


La new palabra clave en Java crea un nuevo objeto. En este caso está creando una matriz ... que es un objeto.

Esas dos formas son equivalentes. El segundo es solo una abreviación conveniente para el primero. Es el azúcar sintáctico .

¿Existen ciertos métodos específicos de "matriz" que no funcionarán en una matriz a menos que sea un "objeto de matriz"?

Todas las matrices son objetos. Período.

¿Hay algo que no pueda hacer con un "objeto de matriz" que pueda hacer con una matriz normal?

Véase más arriba.

¿La VM de Java tiene que limpiar los objetos inicializados con el nuevo operador que normalmente no tendría que hacer?

No. No hay diferencia entre los objetos creados de diferentes maneras en lo que respecta a la JVM.


La palabra clave ''nuevo'' crea una matriz. Ahora, dependiendo de qué tipo de datos es la matriz para los valores dentro de ella varían. Si declara la matriz como un número entero y usa la palabra clave ''nuevo'', contendrá los valores 0 a menos que cambie los valores internos. Con una cadena contendrá el valor ''nulo''. En cada espacio.


Las dos formas de creación que has mostrado son equivalentes. Ambos son "objetos de matriz": recuerde, todo en Java (con la excepción de los tipos numéricos básicos como int , double , etc.) son Objetos. El segundo es simplemente abreviado para el primero, en gran medida en la forma en que C tiene un atajo similar para las matrices de enteros asignados a la pila.


Los dos son idénticos en términos del comportamiento de la matriz creada. Todas las matrices son técnicamente objetos en java; Estas son solo dos formas diferentes de inicializarlas. También es posible combinar los dos como tal:

long[] results = new long[]{1,2,3};


Los dos son iguales. La segunda opción es realizar la creación implícita de un objeto de matriz, es solo para conveniencia del usuario.


Los siguientes dos fragmentos de código son iguales en el nivel de compilación. Escribo una clase de demostración como:

public class NewArray { public static void main(String[] args) { long results[] = new long[3]; } }

y

public class NewArray { public static void main(String[] args) { long results[] = {0,0,0}; } }

La salida de ''javap -c NewArray'' es exactamente la misma:

public static void main(java.lang.String[]); Code: 0: iconst_3 1: newarray long 3: astore_1 4: return }

resultados largos [] = nuevo largo [] {1,2,3}; y resultados largos [] = {1,2,3}; son exactamente lo mismo también.

Entonces, aunque a veces no estás usando una nueva palabra clave, la compilación los considerará iguales.