En Java solemos hacer:
Class myObject = new Class(); porque la new palabra clave devuelve una dirección.
Pero, ¿por qué podemos hacer esto?:
String myString = "Hello"; como si String fuera un primitivo?
Le pregunté esto a mi maestro y me respondió que es porque lo que está entre comillas es equivalente a una dirección, pero no está seguro. ¿Puedes confirmar?
¿Está "Hola" almacenado en una variable de instancia de la clase String?
...como si
Stringfuera un primitivo?
Como señala Jon en un comentario , "tiene una forma literal" != "es un tipo primitivo". :-) Las cadenas tienen una forma literal en Java porque la especificación define una para ellas . String sigue siendo un tipo de objeto.
Algunos lenguajes tienen otros tipos de objetos que también tienen formas literales (JavaScript, por ejemplo, tiene formas literales para expresiones regulares, matrices y objetos que no son matrices [su forma literal para cadenas en realidad define lo que llama una primitiva de cadena en lugar de un objeto de cadena — JavaScript tiene versiones de cadenas tanto primitivas como de objetos] ). Creo que las cadenas son las únicas en Java (aparte de null , que es el literal para "sin objeto"), aunque, por supuesto, hay inicializadores de matriz, que son similares pero no exactamente iguales a los literales.
¡El hecho de que pueda usar una expresión literal no significa que la expresión resulte en un tipo primitivo! Eso es simplemente un concepto erróneo de su parte.
Verás:
Integer[] numbers = { 1, 2, 3 };también es un literal (bueno, "casi", ya que solo puede usarlo para este tipo de declaraciones de inicio de matriz); ¡pero no es un tipo primitivo!
Y para preguntar el por qué en su pregunta: lo más probable es que simplemente sea por conveniencia. Cuando se creó Java, estaba destinado a ser "mejor" que el C y el C++ de aquellos días. Y adivinen qué: tratar con cadenas era bastante molesto y propenso a errores en esos lenguajes.
En ese sentido: ¡introducir literales de cadena podría verse como un punto de venta único para diferenciar a Java de su competencia!
Otras respuestas son bastante buenas. Algunos puntos específicos:
Le pregunté esto a mi maestro y me respondió que es porque lo que está entre comillas es equivalente a una dirección, pero no está seguro. ¿Puedes confirmar?
Sí. El esta en lo correcto. Como han señalado otros, una cadena literal, es decir, una secuencia de caracteres Unicode válida encerrada dentro de un par de "s" es reconocida por la especificación del lenguaje Java. Cuando el compilador de Java (el programa javac ) encuentra tal literal (por ejemplo, "Hello" ) en su archivo fuente de Java, lo toma literalmente y lo coloca en una sección específica dentro del archivo de clase compilado. Esta sección se llama conjunto de constantes de tiempo de ejecución . Luego crea una instrucción particular llamada ldc que coloca en el archivo de clase donde se compila El código para su inicialización está almacenado. Por ejemplo, el cuerpo del método main en el siguiente código fuente de Java:
public class StringAsPrimitive { public static void main(String[] args) { String s = "Hello"; } }se compila a:
0: ldc #2 // String Hello 2: astore_1 3: return (No hay magia aquí. Simplemente compile su código usando el programa javac y vea el archivo de clase usando el programa javap . Incluso puede ver el contenido del archivo .class usando un visor hexadecimal y verá String Hello literalmente ).
Luego, la JVM interpreta este código cuando le pide al programa java que ejecute este archivo de clase.
La instrucción ldc para la JVM se documenta aquí . Esto es lo que hace la JVM cuando interpreta #2 que es una referencia a la ubicación real donde se almacena la cadena literal "Hello" en la memoria de la computadora (RAM):
De lo contrario, si la entrada del conjunto de constantes en tiempo de ejecución es una referencia a una instancia de la clase String que representa un literal de cadena (§5.1), entonces se inserta una referencia a esa instancia, valor, en la pila de operandos.
Entonces, lo que dijo tu maestro resulta ser correcto, aunque no lo decimos exactamente de esa manera. En Java, hay dos tipos de tipos: primitivos y de referencia . Entonces, sería más apropiado decir que el valor del literal String es una referencia (y no una dirección).
¿Está "Hola" almacenado en una variable de instancia de la clase String?
No. La variable de cadena inicializada en un literal de cadena podría ser cualquier cosa, una variable static o de clase, una variable de instancia o una variable local (mi código anterior). Se almacena en el archivo de clase: StringAsPrimitive.class y luego está disponible para la JVM en una ubicación de memoria particular. Esto sucede cuando la JVM carga la clase.