2010-03-18 18 views
18

Siempre decimos que la sobrecarga de métodos es polimorfismo estático y que la anulación es un polimorfismo en tiempo de ejecución. ¿Qué queremos decir con estático aquí? ¿La llamada a un método se resolvió al compilar el código? Entonces, ¿cuál es la diferencia entre llamar al método normal y llamar a un método final? ¿Cuál está vinculado en tiempo de compilación?sobrecarga y sobrecarga de Java

Respuesta

10

Tiene razón: las llamadas a métodos sobrecargados se realizan en tiempo de compilación. Es por eso que es estática.

Las llamadas a métodos anulados se realizan en tiempo de ejecución, según el tipo en el que se invoca el método.

On virtual methods wikipedia says:

En Java, todos los métodos no estáticos son por defecto "funciones virtuales." Solo los métodos marcados con la palabra clave final no son virtuales.

final métodos no se pueden anular, por lo que se realizan estáticamente.

Imagínese el método:

public String analyze(Interface i) { 
    i.analyze(); 
    return i.getAnalysisDetails(); 
} 

el compilador no puede sobrecargar este método para todas las implementaciones de Interface que posiblemente se pueden pasar a ella.

+0

¿Los métodos finales realmente se manejan de manera diferente en el tiempo de ejecución? ¿O la finalidad solo se aplica en tiempo de compilación? – Thilo

+1

Otro aspecto interesante es que solo una parte del envío de métodos para métodos reemplazados se lleva a cabo en tiempo de ejecución: en tiempo de compilación, se establece la firma exacta del método, independientemente de los tipos de valores de parámetro en tiempo de ejecución. El único envío que ocurre en el tiempo de ejecución está en el tipo del objeto cuyo método se está invocando. – Thilo

+0

@Thilo No estoy del todo seguro de cómo se manejan los métodos finales en tiempo de ejecución. Debe estar escrito en la especificación (que soy un poco flojo para buscar ahora) – Bozho

5

No creo que pueda llamar la sobrecarga de ningún tipo de polimorfismo. Los métodos sobrecargados están vinculados en tiempo de compilación, lo que impide llamarlo polimorfismo.

El polimorfismo se refiere a la vinculación dinámica de un método a su llamada cuando se utiliza una referencia de clase base para un objeto de clase derivado. Sobrescribir los métodos es la forma de implementar este comportamiento polimórfico.

+1

No - "polimorfismo" es * cualquier * mecanismo por el cual se implementa un comportamiento diferente según los tipos. Si el envío ocurre en tiempo de ejecución o tiempo de compilación es completamente irrelevante para la definición de polimorfismo. Para su información, en contextos donde se necesita una clasificación adicional, la sobrecarga generalmente se llama "polimorfismo ad-hoc". –

19

La sobrecarga de métodos significa hacer múltiples versiones de una función basada en las entradas. Por ejemplo:

public Double doSomething(Double x) { ... } 
public Object doSomething(Object y) { ... } 

La elección del método a llamar se realiza en tiempo de compilación. Por ejemplo:

Double obj1 = new Double(); 
doSomething(obj1); // calls the Double version 

Object obj2 = new Object(); 
doSomething(obj2); // calls the Object version 

Object obj3 = new Double(); 
doSomething(obj3); // calls the Object version because the compilers see the 
        // type as Object 
        // This makes more sense when you consider something like 

public void myMethod(Object o) { 
    doSomething(o); 
} 
myMethod(new Double(5)); 
// inside the call to myMethod, it sees only that it has an Object 
// it can't tell that it's a Double at compile time 

el reemplazo de métodos significa definir una nueva versión del método por una subclase del original

class Parent { 
    public void myMethod() { ... } 
} 
class Child extends Parent { 
    @Override 
    public void myMethod() { ... } 
} 

Parent p = new Parent(); 
p.myMethod(); // calls Parent's myMethod 

Child c = new Child(); 
c.myMethod(); // calls Child's myMethod 

Parent pc = new Child(); 
pc.myMethod(); // call's Child's myMethod because the type is checked at runtime 
       // rather than compile time 

Espero que ayude

1

estoy de acuerdo con Rachel, porque en K & B book se menciona directamente que sobrecarga no pertenece al polimorfismo en el capítulo 2 (orientación del objeto). Pero en muchos lugares encontré que la sobrecarga significa polimorfismo estático porque es tiempo de compilación y anulación significa polimorfismo dinámico porque es tiempo de ejecución.

Pero una cosa interesante es en un libro de C++ (Programación orientada a objetos en C++ - Robert Lafore) también se menciona directamente que la sobrecarga significa polimorfismo estático. Pero una cosa más es que hay Java y C++ ambos son dos lenguajes de programación diferentes y tienen diferentes técnicas de manipulación de objetos, entonces ¿puede ser que el polimorfismo difiera en C++ y Java?

0

Definición simple: la sobrecarga de métodos se refiere a la noción de tener dos o más métodos (funciones) en la misma clase con el mismo nombre pero diferentes argumentos.

Mientras que la anulación de método significa tener dos métodos con los mismos argumentos, pero una implementación diferente. Uno de ellos existiría en la clase Parent (clase base) mientras que otro estará en la clase derivada (Child Class). Para esto se requiere la anotación Override.

Comprobar esto: Click here for a detailed example

0

Propiedad El exceso de carga Anulación

nombres de los métodos --------------> debe ser el mismo ------ ---------- debe ser el mismo

Tipos Arg ------------------> debe ser diferente (al menos arg)

Método Firma

Tipo de retorno

privada, estático, Final

modificador de acceso

try/catch

método de resolución

5

1) sobrecarga de métodos se utiliza para aumentar la legibilidad del programa . La anulación de método se utiliza para proporcionar la implementación específica del método que ya proporciona su superclase.

2) La sobrecarga del método se realiza dentro de la clase. La anulación de método ocurre en dos clases que tienen una relación IS-A (herencia).

3) En caso de sobrecarga de método, el parámetro debe ser diferente. En caso de anulación de método, el parámetro debe ser el mismo.

4) La sobrecarga de métodos es el ejemplo del polimorfismo en tiempo de compilación. Anulación de método es el ejemplo de polimorfismo de tiempo de ejecución.

5) En Java, la sobrecarga del método no se puede realizar cambiando únicamente el tipo de devolución del método. El tipo de devolución puede ser igual o diferente en la sobrecarga del método. Pero debes tener que cambiar el parámetro. El tipo de devolución debe ser igual o covariante en la anulación de método.

0

La sobrecarga de métodos se refiere a la noción de tener dos o más métodos en la misma clase con el mismo nombre pero diferentes argumentos.

Anulación de método significa tener dos métodos con los mismos argumentos, pero diferentes implementaciones. Uno de ellos existiría en la clase principal, mientras que otro estaría en la clase derivada o secundaria. La anotación @Override, aunque no es necesaria, puede ser útil para forzar la anulación correcta de un método en tiempo de compilación.

1

Método de sobrecarga simplemente significa proporcionar dos métodos separados en una clase con el mismo nombre pero diferentes argumentos, mientras que el tipo de retorno de método puede o no ser diferente, lo que nos permite reutilizar el mismo nombre de método.

Sin embargo, ambos métodos son diferentes por lo tanto puede ser resuelta por el compilador en tiempo de compilación que es por lo que también se conoce como Tiempo de Compilación polimorfismo o estático polimorfismo

el reemplazo de métodos medios que definen un método en el clase hija que ya está definida en la clase principal con la misma firma de método, es decir, el mismo nombre, argumentos y tipo de devolución.

Mammal mammal = new Cat(); 
System.out.println(mammal.speak()); 

En el compilador de línea de mammal.speak() dice que el método del tipo de referencia Mammalspeak() está recibiendo llamadas, por lo que para compilador de esta llamada es Mammal.speak().

Pero en el tiempo de ejecución, JVM sabe claramente que la referencia mammal contiene la referencia del objeto Cat, por lo que para JVM esta llamada es Cat.speak().

Debido llamada al método se está resuelta en tiempo de ejecución de JVM es por eso que también se conoce como polimorfismo de tiempo de ejecución y método dinámico de Despacho.

diferencia entre la sobrecarga de métodos y el reemplazo de métodos

Difference Between Method Overloading and Method Overriding

Para más detalles, se puede leer Everything About Method Overloading Vs Method Overriding.