{"id":727,"date":"2019-11-13T07:47:21","date_gmt":"2019-11-13T12:17:21","guid":{"rendered":"http:\/\/gregorgonzalez.com.ve\/blog\/?p=727"},"modified":"2019-11-13T07:47:21","modified_gmt":"2019-11-13T12:17:21","slug":"parametros-por-valor-o-por-referencia-en-java","status":"publish","type":"post","link":"http:\/\/gregorgonzalez.com.ve\/blog\/parametros-por-valor-o-por-referencia-en-java\/","title":{"rendered":"Par\u00e1metros por valor o por referencia en JAVA"},"content":{"rendered":"<p>Esta duda surge desde que uno se inicia en la programaci\u00f3n y empieza a trabajar con m\u00e9todos\/funciones que requieren la manipulaci\u00f3n de datos sin tener que generar un valor de retorno.<\/p>\n<p>En otros lenguajes de programaci\u00f3n por lo general, siempre los par\u00e1metros se pasan por valor y luego existe una sintaxis especial para indicar si un par\u00e1metro va a usarse por referencia. Esto es bastante claro y se entiende sus capacidades pero en Java puede resultar confuso porque no lo especifican claramente y tiene definici\u00f3n distinta.<\/p>\n<p>En Java todo se pasa por valor, es decir que no existe el termino \u00abpasar por referencia\u00bb, aunque obtenemos algo similar cuando utilizamos objetos, realmente estamos pasando como valor es el \u00abpuntero\u00bb y no una referencia exacta como en otros lenguajes de programaci\u00f3n, se comporta similar pero no tiene la misma capacidad.<\/p>\n<p>La premisa que se acostumbra a expresar es que en Java: \u00ab<b>Los par\u00e1metros primitivos son pasados por valor y los objetos son pasados por referencia<\/b>\u00bb es incorrecta, ya que lo segundo, los objetos pasan en realidad un puntero que act\u00faa como un proxy similar a una referencia, mas no es una referencia real porque eso no existe en java.<\/p>\n<p><b>Pasar por Valor<\/b><\/p>\n<p>Entonces al pasar un primitivo (entero, string, etc) el par\u00e1metro es evaluado y se realiza una \u00abcopia\u00bb a otra localizaci\u00f3n para luego usar el valor durante la ejecuci\u00f3n. Se almacena en una parte de la memoria que es como lo realiza normalmente java y en otros lenguajes puede almacenarlos en otro lugar.<\/p>\n<p><b>Pasar por Referencia<\/b><\/p>\n<p>Para tipos de objetos (Array, objetos, etc) realmente se crea una especie de puntero y no se puede decir que sea una referencia porque se comporta diferente, entonces podemos indicar que \u00abLa referencia al objeto es pasada por valor\u00bb<\/p>\n<p>Ejemplo al cambiar un valor de un array.<\/p>\n<p>Digamos que tenemos un m\u00e9todo que se encarga de agregar un valor a un array, creamos el array en Main pero luego lo pasamos al m\u00e9todo y le agregamos un texto.<\/p>\n<pre class=\"lang:java decode:true \">public class MyClass {\r\n    public static void main(String args[]) {\r\n      String[] array = new String[1];\r\n      \r\n      cambiar(array);\r\n      System.out.println(\"El valor del array es: \" + array[0]);\r\n    }\r\n    \r\n    public static void cambiar(String[] array) {\r\n       array[0] = \"Hola Mundo\";\r\n    }\r\n}<\/pre>\n<p>Sin el m\u00e9todo \u00abcambio\u00bb el valor del array es NULL, pero con el m\u00e9todo imprimir\u00e1 \u00abHola mundo\u00bb<\/p>\n<ul>\n<li>Cualquier cambio en el contenido del Array a trav\u00e9s de esa referencia afectar\u00e1 al array original.<\/li>\n<li>Pero cambiar la referencia para apuntar a un nuevo Array no cambiar\u00e1 la referencia existente en el m\u00e9todo original.<\/li>\n<\/ul>\n<p>Ejemplo cambiando referencia:<\/p>\n<pre class=\"lang:java decode:true \">public class MyClass {\r\n    public static void main(String args[]) {\r\n        String[] array = new String[1];\r\n      \r\n        cambiarReferencia(array);\r\n        System.out.println(\"El valor del array es: \" + array[0]);\r\n    }\r\n    \r\n    public static void cambiarReferencia(String[] array) {\r\n       array = new String[1];\r\n       array[0] = \"Hola Mundo\";\r\n    }\r\n}<\/pre>\n<p>Al usar ese m\u00e9todo, no se realiza ning\u00fan cambio en el array original e imprimir\u00e1 NULL. Mientras que en otros lenguajes s\u00ed cambiar\u00eda la referencia y actualizar\u00eda el array principal, en Java no, ya que no maneja una referencia real.<\/p>\n<p>Si deseas probar este c\u00f3digo sin tener que instalar nada en tu pc, puedes realizarlo online con alg\u00fan compilador web. Por ejemplo yo uso mucho este y tambi\u00e9n tiene mas opciones para otros lenguajes de programaci\u00f3n <a href=\"https:\/\/www.jdoodle.com\/online-java-compiler\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/www.jdoodle.com\/online-java-compiler\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta duda surge desde que uno se inicia en la programaci\u00f3n y empieza a trabajar con m\u00e9todos\/funciones que requieren la manipulaci\u00f3n de datos sin tener que generar un valor de retorno. En otros lenguajes de programaci\u00f3n por lo general, siempre los par\u00e1metros se pasan por valor y luego existe una sintaxis especial para indicar si [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":688,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[227],"tags":[271,270,272,273],"_links":{"self":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/727"}],"collection":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/comments?post=727"}],"version-history":[{"count":1,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/727\/revisions"}],"predecessor-version":[{"id":728,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/posts\/727\/revisions\/728"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media\/688"}],"wp:attachment":[{"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/media?parent=727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/categories?post=727"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gregorgonzalez.com.ve\/blog\/wp-json\/wp\/v2\/tags?post=727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}