{"id":1751,"date":"2018-02-04T19:00:21","date_gmt":"2018-02-05T00:00:21","guid":{"rendered":"https:\/\/manualjavaoracle.wordpress.com\/?p=1751"},"modified":"2018-03-06T13:26:20","modified_gmt":"2018-03-06T18:26:20","slug":"sobrecarga-de-metodos","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=1751","title":{"rendered":"Sobrecarga de m\u00e9todos"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\" wp-image-1862 alignnone\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java22-300x134.png\" alt=\"\" width=\"279\" height=\"124\" srcset=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java22-300x134.png 300w, https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java22.png 302w\" sizes=\"(max-width: 279px) 100vw, 279px\" \/><\/p>\n<p><span style=\"color: #000000;\">Java permite declarar m\u00e9todos con el mismo nombre en la misma clase, siempre y cuando tengan distintos conjuntos de par\u00e1metros (determinados en base al n\u00famero, tipos y orden de los par\u00e1metros). A esto se le conoce como sobrecarga de m\u00e9todos. Cuando se hace una llamada a un m\u00e9todo sobrecargado, el compilador de Java selecciona el m\u00e9todo apropiado mediante un an\u00e1lisis del n\u00famero, tipos y orden de los par\u00e1metros en la llamada. Por lo general, la sobrecarga de m\u00e9todos se utiliza para crear varios m\u00e9todos con el mismo nombre que realicen la misma tarea o tareas similares, pero con distintos tipos o distintos n\u00fameros de par\u00e1metros.<\/span><!--more--><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class SobrecargaMetodos {<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public static int cuadrado(int numero){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return numero*numero;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public static float cuadrado(float numero){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return numero*numero;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public static double cuadrado(double numero){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return numero*numero;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public static void main(String[] args) {<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 int x=4;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 float y=3.5f;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 double z=13;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00abEl cuadrado de \u00ab+x+\u00bb es: \u00bb + cuadrado(x));<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00abEl cuadrado de \u00ab+y+\u00bb es: \u00bb + cuadrado(y));<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 System.out.println(\u00abEl cuadrado de \u00ab+z+\u00bb es: \u00bb + cuadrado(z));<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<h2><strong><span style=\"color: #000000;\">\u00bfC\u00f3mo se diferencian los m\u00e9todos sobrecargados entre s\u00ed?<\/span><\/strong><\/h2>\n<p><span style=\"color: #000000;\">El compilador diferencia los m\u00e9todos sobrecargados en base a su firma: una combinaci\u00f3n del nombre del m\u00e9todo y del n\u00famero, tipos y orden de sus par\u00e1metros.\u00a0<span style=\"color: #000000;\">Si el compilador s\u00f3lo se fijara en los nombres de los m\u00e9todos durante la compilaci\u00f3n. De manera interna, el compilador utiliza nombres de m\u00e9todos m\u00e1s largos que incluyen el nombre del m\u00e9todo original, el tipo de cada par\u00e1metro y el orden exacto de los par\u00e1metros para determinar si los m\u00e9todos en una clase son \u00fanicos en esa clase.<\/span><\/span><\/p>\n<p><span style=\"color: #000000;\">Por ejemplo, en el ejemplo anterior el compilador podr\u00eda utilizar el nombre l\u00f3gico \u00abcuadrado de int\u00bb para el m\u00e9todo cuadrado que especifica un par\u00e1metro int, y el m\u00e9todo \u00abcuadrado de double\u00bb para el m\u00e9todo cuadrado que especifica un par\u00e1metro double (los nombres reales que utiliza el compilador son m\u00e1s complicados). <\/span><\/p>\n<p><span style=\"color: #000000;\">Si la declaraci\u00f3n de m\u00e9todo1 empieza as\u00ed:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0void metodo1(int a, float b)<\/span><\/p>\n<p><span style=\"color: #000000;\">entonces el compilador podr\u00eda usar el nombre l\u00f3gico \u00abm\u00e9todo1 de int y float\u00bb. Si los par\u00e1metros se especificaran as\u00ed:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0void metodo1(float a, int b)<\/span><\/p>\n<p><span style=\"color: #000000;\">entonces el compilador podr\u00eda usar el nombre l\u00f3gico \u00abm\u00e9todo1 de float e int\u00bb. Observe que el orden de los tipos de los par\u00e1metros es importante; el compilador considera que los dos encabezados anteriores de m\u00e9todo1 son distintos.<\/span><\/p>\n<h2><span style=\"color: #000000;\"><strong>Tipos de valores de retorno de los m\u00e9todos sobrecargados<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">Al hablar sobre los nombres l\u00f3gicos de los m\u00e9todos que utiliza el compilador, no mencionamos los tipos de valores de retorno de los m\u00e9todos. Esto se debe a que las llamadas a los m\u00e9todos no pueden diferenciarse en base al tipo de valor de retorno. El programa del ejemplo ilustra los errores que genera el compilador cuando dos m\u00e9todos tienen la misma firma, pero distintos tipos de valores de retorno. Los m\u00e9todos sobrecargados pueden tener tipos de valor de retorno diferentes si los m\u00e9todos tienen distintas listas de par\u00e1metros. Adem\u00e1s, los m\u00e9todos sobrecargados no necesitan tener el mismo n\u00famero de par\u00e1metros.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public class ErrorSobrecargaMetodos {<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0\/\/ declaraci\u00f3n del m\u00e9todo cuadrado con argumento int<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public int cuadrado(int x){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return x*x;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0\/\/ la segunda declaraci\u00f3n del m\u00e9todo cuadrado con<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0\/\/ con argumento int produce un error de compilaci\u00f3n,<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0\/\/ aun cuando los tipos de valores de retorno son distintos<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0public double cuadrado(int y){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return y*y;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0}<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\"><strong>Salida &#8211; ErrorSobrecargaMetodos (run)<\/strong><\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0run:<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0java.lang.ExceptionInInitializerError<\/span><br \/>\n<span style=\"color: #000000;\"><strong>\u00a0 \u00a0 \u00a0 \u00a0Caused by: java.lang.RuntimeException: Uncompilable source code &#8211; method cuadrado(int) is already\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0defined in class prueba.ErrorSobrecargaMetodos<\/strong><\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Nota<\/strong><\/span><\/h3>\n<ul>\n<li><span style=\"color: #000000;\">Las declaraciones de m\u00e9todos sobrecargados con firmas id\u00e9nticas producen errores de compilaci\u00f3n, aun si los tipos de valores de retorno son distintos.<\/span><\/li>\n<li><span style=\"color: #000000;\">Declarar m\u00e9todos sobrecargados con listas de par\u00e1metros id\u00e9nticas es un error de compilaci\u00f3n, sin importar que los tipos de los valores de retorno sean distintos.<\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Java permite declarar m\u00e9todos con el mismo nombre en la misma clase, siempre y cuando tengan distintos conjuntos de par\u00e1metros (determinados en base al n\u00famero, tipos y orden de los par\u00e1metros). A esto se le conoce como sobrecarga de m\u00e9todos. Cuando se hace una llamada a un m\u00e9todo sobrecargado, el compilador de Java selecciona el &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=1751\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1862,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"_links":{"self":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/1751"}],"collection":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1751"}],"version-history":[{"count":17,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/1751\/revisions"}],"predecessor-version":[{"id":2709,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/1751\/revisions\/2709"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/1862"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}