2011-03-28 14 views
7

Java no puede sobrecargar al operador, pero + funciona bien para String y Integer y algunas otras clases. ¿Cómo es esto posible?¿Por qué funciona + con cadenas en Java?

actualización:
¿Por qué funciona esto?

Integer i = 4; 
Integer p = 5; 

System.out.println(i*p); // prints 20 

Respuesta

7

+ no es un ejemplo de sobrecarga del operador. + está integrado en el lenguaje como operador de concatenación y operador de suma aritmética.

Lo que esto significa es que una persona que escribe un programa con Java no puede sobrecargar operadores, pero en lo que respecta a la gramática del lenguaje Java, + se define como una concatenación y un operador adicional.

EDITAR

Funciona para otras clases, tales como Integer y Double debido autoboxing.

Si observa el bytecode de un programa Java que realiza la concatenación de cadenas, verá que crea StringBuilder y utiliza el método append(). El compilador de Java ve el operador + y se da cuenta de que los operandos son cadenas y no tipos primitivos (como int).

Si observa el bytecode de un programa que agrega números enteros, verá que usa la instrucción iadd para realizar una suma entera. Esto se debe a que el compilador se da cuenta de que los operandos a la operación + son enteros.

En cuanto a hacer algo como Integer i = 4, el bytecode mostrará que realmente está haciendo Integer i = Integer.valueOf(4). Esto se llama autoboxing.Más tarde, cuando haces algo como i + p, donde tanto i y p son de tipo Integer, el bytecode generado mostrará que usted está haciendo i.intValue() + p.intValue(), donde los tipos de retorno de ambos métodos son int (la instrucción real de código de bytes de nuevo, es iadd)

Es por eso que + funciona Integer aunque no sean tipos primitivos reales.

+0

¡Gracias! ¿Hay alguna lista con todas las clases que soporte el autoboxing? – VextoR

+1

Autoboxing existe para 'int',' float', 'double',' boolean', 'short', y' byte' Creo. –

6

funciona para las envolturas primitivos como enteros debido autoboxing.

funciona para cuerdas, porque eso es un special case for concatenating strings:

El lenguaje Java proporciona un apoyo especial para el operador de concatenación (+), y para la conversión de otros objetos a cadenas. La concatenación de cadenas se implementa a través de la clase StringBuilder (o StringBuffer) y su método de adición. Las conversiones de cadenas se implementan a través del método toString, definido por Object y heredado por todas las clases en Java. Para obtener información adicional sobre la concatenación y conversión de cadenas, consulte Gosling, Joy y Steele, The Java Language Specification.

4

+ es una operación incorporada. Es una excepción, no una regla.

+0

gracias. Pero por qué funciona con otras clases como Integer, pls see updated question – VextoR

+0

Los operadores son simplemente analizados por el compilador cuando digieren el código fuente en Java IL. Hay instrucciones de nivel IL para sumar, restar, multiplicar, etc. que son válidas para los números. * Además *, + está codificado para trabajar con cadenas; el compilador traducirá "a" + "b" en la instrucción de nivel IL para concatenar "a" y "b". – KeithS

2

Java no permite encargo sobrecarga de operadores, pero el compilador todavía puede ser informado por el desarrollador compilador que Cadena1 + == cadena2 String1String2, y para sustituir el correcto método de concatenación de llamadas para el operador +.

2

El lenguaje Java proporciona soporte especial para el operador de concatenación de cadenas (+), y para la conversión de otros objetos a cadenas.

String s = "string 1" + "string 2"; 

Lo que en realidad es ejecutar es

(new StringBuilder()).append("string 1").append("string 2").toString() 
1

Como dijo @yan, esta es la excepción y no la regla. Las cadenas tienen un estado especial en Java. Hay una subsección completa de la especificación de lenguaje Java dedicada a + en su rol como el operador de concatenación de cadenas: §15.18.1.

En cuanto a su actualización, ese es otro caso especial. Java es a veces, dependiendo del caso, lo suficientemente inteligente como para convertir cosas que no son String s en String s cuando se necesitan String s. Uno de estos casos especiales es el que describió, donde aparecen primitivas en un lugar que necesita un String. Las primitivas se convierten primero a sus tipos de referencia — Integer, Double, & c. — y luego en String s a través del método toString().

Otro caso especial es cuando uno String y uno no String se combinan con el operador de concatenación de cadenas +, como se describe en JLS §5.4 — String Conversion.

Para completar: + en su función más común "agregar números juntos" se describe en la otra parte de §15.18, §15.18.2 — Additive Operators (+ and -) for Numeric Types.

Cuestiones relacionadas