2010-12-08 7 views
5

sobrecarga, por ejemplo, tengo esta clase:Java. Método

public class Col { 

static void test(int a) 
    { 
     System.out.println("int"); 
    } 
    public static void main(String args[]) 
    { 
     Col.test(12); //1 

     Col.test((byte)12); //2 

     Col.test((long)100); //3 

    } 
} 

y ahora me intresting cómo algoritmo de trabajo este código. Creo que esto pasos:

1 línea - todo el método de llamada correcta con int param, perfecto.

2 líneas - método de llamada con byte param ... oooops. ¿qué hacer? ¿Java intenta ampliar el byte a int? ¿Es verdad?

3 método de llamada de línea con parámetro largo ... otra vez ooops. ¿qué hacer? convertir largo a int java no puede, porque la pérdida de precisión. ¿Es prueba? Y en resultado - Excepción.

De lo que añadir:

public static void test(Object a) 
    { 
     System.out.println("Object"); 
    } 

y si una llamada:

Col.test((long)100); 

los correctos, no es una excepción es así, cuál es la relación entre el tipo primitivo de largo y objeto?

+0

bien, gracias, hombres! – user471011

Respuesta

7

Sí, hay una conversión implícita de byte a int, pero sin conversión implícita de long a int (debido a la probabilidad de pérdida de información).

En el tercer caso, está utilizando autoboxing que convertirá un (tipo primitivo) long a un (tipo de clase) Long.

Usted puede observar que cambiando el cuerpo de test para:

public static void test(Object a) 
{ 
    System.out.println(a.getClass()); 
} 

Será luego imprimir class java.lang.Long.

+0

+1 - una de las 2 respuestas de 5 que abordan ambos grupos de preguntas. –

2
public static void test(Object obj) { 
     if (obj instanceof Integer) { 
      System.out.println("Integer"); 
     } else if (obj instanceof Double) { 
      System.out.println("Double"); 
     } else if (obj instanceof Float) { 
      System.out.println("Float"); 
     } else if (obj instanceof Long) { 
      System.out.println("Long"); 
     } 
    } 
2

Todas las primitivas Java tienen los correspondientes "tipos" en caja que son clases reales. En tu ejemplo, long tiene una clase correspondiente Long. Esta clase se extiende desde Object.

Lo que ha experimentado es boxeo y desembalaje.

2

Es una característica introducida en Java 5. Se llama Autoboxing. En este, un tipo primitivo se convierte en Objeto (en su caso largo a Largo). Consulte this link para obtener detalles sobre Autoboxing.

4

Su primer ejemplo muestra la conversión de tipos primitivos. El segundo muestra boxeo y unboxing, que es, en resumen, una conversión conveniente entre el tipo primitivo (como long) y sus clases contenedoras (java.lang.Long en este caso).

La sobrecarga está aplicando métodos que tienen el nombre mismo pero con diferentes parámetros . Aquí tenemos dos métodos

static void test(int a){} 
static void test(Object a){} 

y llamamos con test((long) 100).No se puede llamar al primer método, porque la JVM no reducirá un long a un int sin conversión explícita. Pero la JVM (versión 1.5+) puede convertir el valor long en Long (autoboxing) y test(Long.valueOf((long) 100)) es una buena coincidencia para el segundo método.

+0

Entonces, ¿por qué la prueba de vacío estático (int a) y la prueba de vacío estática (Objeto a) no son un ejemplo de sobrecarga? –

+0

@Adriaan - tienes razón - si realmente agregó el otro método de prueba al mismo archivo (no solo cambió la firma del método existente), entonces lo sobrecargó. Pero su pregunta no tiene como objetivo los aspectos de sobrecarga, sino que cubre la conversión de tipo y el autoboxeo. –

+0

sí, tal vez sea cierto, pero en el código tenemos sobrecarga, en el código de resultado tenemos dos métodos test (int a) y test (Object a), entonces, como dices - mismo nombre, y diferentes params. – user471011

3

Esto se debe a la característica de auto-boxing. En realidad, has promovido la primitiva a larga y al llamar al método de prueba automáticamente está buscando su tipo equivalente por lo tanto está llamando a prueba (Objeto a). Puedes ver como este Col.test (nuevo Entero (12)); también llamada prueba (Objeto a) .También puede consultar este enlace Determining if an Object is of primitive type