Cuando se escribe:
OddEven number = new OddEven();
que realmente hacen dos cosas: 1) se declara una variable de tipo number
OddEven
y 2) se asigna una referencia a una nueva instancia de la clase OddEven
. Pero como una variable puede contener cualquier subtipo de un tipo, escribir number = new OddEven();
no sería suficiente para que el compilador conozca el tipo real de la variable number
. Entonces, debes declararlo también.Java es un fuertemente tipado lenguaje, lo que significa que cada variable y cada expresión tiene un tipo que se conoce en tiempo de compilación. Es posible que desee leer el Chapter 4. Types, Values, and Variables completo de la Especificación del lenguaje Java (JLS) para obtener más información al respecto.
Ahora, cuando su escritura:
String str = "abc";
las cosas son un poco diferentes. Los caracteres entre comillas dobles, "abc"
aquí, se llaman cadena literal que ya es una referencia a una instancia de String
y siempre se refiere a la misma instancia de la clase String
. Citando la sección 3.10.5 String Literals del JLS:
Cada cadena literal es una referencia (§4.3) a una instancia (§4.3.1, §12.5) de la clase String
(§4.3.3). String
objetos tienen un valor constante. Cuerda literales-o, más generalmente, secuencias que son los valores de constantes expresiones (§15.28) -son "internados" con el fin de compartir únicas casos, utilizando el método de String.intern
.
Así, String str = "abc";
ciertamente no es convertida en String str = new String("abc");
el que absolutamente no es equivalente como he leído en algunos comentarios y respuestas. Ejecución de la clase siguiente:
public class Test {
public static void main(String[] args) {
String one = "abc";
String two = "abc";
String abc = new String("abc");
System.out.println(one == two);
System.out.println(one == abc);
}
}
Produce por debajo de la salida:
true
false
y demuestra que one
y two
son referencias a la misma instancia pero que abc
es una referencia a otro instancia (es decir, una se ha creado un objeto extra innecesario).
En realidad, el uso de new String(String)
es una forma ineficiente de construir nuevas cadenas y sólo debe ser usado para forzar una subcadena para copiar a un nuevo arreglo de caracteres subyacente, como en
String tiny = new String(monster.substring(10,20))
El ejemplo de la cadena es interesante, me pregunto si ese es el azúcar semántica del lenguaje que se está haciendo en segundo plano, convirtiendo String str = "abc"; a String str = new String ("abc"); – GrayWizardx
GrayWizardx: No. Siempre obtendrás exactamente el mismo objeto 'String' del mismo literal de cadena (incluso si el literal aparece en diferentes archivos fuente). –
Sí, pero. Tom tiene razón en que obtendrás uno y el mismo objeto 'String', pero ese es un comportamiento específico para la clase String, y solo es posible porque las cadenas son inmutables. Otro ejemplo es 'int [] arr = {10, 20, 30};'. Encuentra lo nuevo. Pero realmente hay uno, la sintaxis de inicialización es solo azúcar sintáctica para que no tenga que escribirla. –