2011-10-28 20 views
8

La salida del código siguiente es 123 porque substring toma de beginIndex a EndIndex - 1. Sin embargo, me sorprende cómo char aquí se entiende como 3 (int) porque substring tomar dos ints . ¿Cuál es el concepto detrás de esto?Char Pasando en un método con un parámetro int

String x = "12345"; 
char a = 3; 
x = x.substring(0, a); 
System.out.println(x); 

Respuesta

12

Esto va todo el camino de vuelta a C, donde char es en esencia un estrecho tipo entero y obtiene implícitamente convertidos a int siempre que sea necesario.

En Java, esto se conoce técnicamente como una "conversión primitiva de ampliación", y está cubierto en section 5.1.2 of the JLS.

+0

1 ..Todo se reduce a no pensar en un "char" como una letra o personaje, sino en una pieza de datos que la computadora puede asignar a una letra o personaje. Luego, para facilitar este proceso, hemos hecho algunos accesos directos para permitirnos asignar directamente letras o caracteres a 'char's (como' char c = 'x'; 'solo significa" Un dato representado por la variable c es el valor que se asigna al carácter 'x'. "La variable 'c' no es más una letra que cualquier otra información en el sistema.) – corsiKa

0

por lo que la declaración de función de subcadena se parece a una subcadena (int startIndex, int endIndex). Ahora, cuando pase char, se promociona automáticamente a entero (endIndex) y, por lo tanto, se trata como int.

0

Consulte la sección 5.1.2, donde se tratan las conversiones de ampliación.

0

Esto se conoce como fundición implícita. Lo mismo ocurre si asigna un valor int a un doble. ejemplo Quick

double d = 1; 

1 es una int pero se convierte implícitamente a double (1.0).

3

Otros ya explicaron por qué funciona, pero tenga en cuenta que es una mala práctica usar variables char para los índices, ya que tienen una semántica asociada diferente y, por lo tanto, es confuso usar un carácter como índice.

Use caracteres solo para almacenar datos de caracteres y probablemente sea mejor: trate de evitar el carácter completamente, ya que ni siquiera son lo suficientemente anchos para almacenar cada carácter (consulte Unicode y discusión del punto de código). Use int para almacenar puntos de código de personaje en su lugar.

0

En char a = 3;, se podría pensar en él como el almacenamiento de 0011, el valor binario de 3. El carbón '3' no está siendo almacenado en realidad: Si ha intentado el tratamiento es un char, que no puedes tener 3. Pero si lo hizo

char a = '3';

Ahora se está almacenando el carbón 3, un valor ASCII de 51 años, y si se trató de usarlo como en int, se llega a 51.

0

Técnicamente, esto es porque char es un subtipo de int.

Para determinar si substring(int,int) es aplicable al argumento (int,char), primero tratamos 15.12.2.2 Phase 1: Identify Matching Arity Methods Applicable by Subtyping, necesitamos comprobar si char es un subtipo de int. Per 4.10.1 Subtyping among Primitive Types, lo es.

Entonces, para asignar el argumento char al parámetro int, por 15.12.4.5 Create Frame, Synchronize, Transfer Control, aplicamos 5.3 Method Invocation Conversion, que convierte a charint, por 5.1.2 Widening Primitive Conversion

Cuestiones relacionadas