domingo, 29 de diciembre de 2013

Tutorial Java en Linux Basico 2

Funciones

Antes de ver como crear objetos tenemos que saber como crear funciones desde nuestra clase principal,lo que serian metodos de la clase iniciadora(la que contiene el main),en esta ocasión veremos como crear funciones dentro de nuestra clase principal.

Una función es algo que nos ahorra escribir mucho código varias veces,en java una función no tiene palabra especial para iniciarla,lo que la diferencia de una variable son los paréntesis (),y el cuerpo de la función.

Para entender esto deben leer el primer tutorial.
Enlace

Una función se define así:

modificador retorno nombre(tipo parámetro) {
   // Cuerpo
}

Una función la podemos la podemos definir para que ejecute un código simplemente o para usarla como una solución que devuelva un valor,por ejemplo una función que solo se use para ejecutar su bloque podrir ser algo como imprimir en la pantalla:


1
2
3
public static void saluda(String n) {
   System.out.println("Hola"+" "+n);
}

Bien aquí vamos a explicar un poco:

En java el símbolo de mas(+) junto con Strings se usa para concatenar,aquí estamos usando static porque vamos a llamar la función saluda desde el main,y el main es static:

Un método static solo puede llamar métodos static,ya que no existe o necesita referencia,y no en viceversa un método no static si puede llamar uno static.

Así seria el main:


1
2
3
4
public static void main (String [] args) {
      String nombre = "atheyus tux";
      saluda(nombre);
}

El ejemplo completo seria asi:

Creamos un archivo llamado funciones.java:

vim hola.java

Y este es código completo:


1
2
3
4
5
6
7
8
9
public class funciones {
    public static void main (String [] args) {
        String nombre = "tu nombre";
        saluda(nombre);
    }
    public static void saluda(String name) {
        System.out.println("Hola"+" "+name);
    }
}


Compilamos:

javac funciones.java

Ejecutamos:

java funciones

Y veremos algo como esto:



Antes de continuar debo explicar que en java los comentarios se definen asi:

Comentario de una sola linea:

// Un comentario de una sola linea

Y un comentario de varias lineas:

/*
   Comentario
   de varias lineas
   en Java
*/

Tambien tenemos la comentacion para documentacion que se define asi:

/**
   @author Atheyus
   Un comentario de documentacion
   @vesion 1.0
*/

Así que ya no voy a explica como compilar y el nombre del archivo,esto ira en el código java.

Bien esa función es una función vacía,ya que no devuelve nada,podemos usar:

return;

pero no es sumamente necesario,en otro caso podríamos usar una función por retorno,por ejemplo en vez de que trabaje la String que saluda,que devuelva una String para que nosotros hagamos lo que queramos con ella,en este caso no seria void si no String,porque devolvería un String:


1
2
3
public static String saluda(String name) {
   return "Hola"+" "+name;
}


Esta función nos retorna una String,que podríamos almacenar en otra o usar directamente,por ejemplo:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
/**
   Archivo : funciones.java
   Ejecuta : javac funciones.java && java funciones
*/
public class funciones {
    public static void main (String [] args) {
        String nombre = "atheyus tux";
        String nombre_saludado = saluda(nombre); // Creamos una String a partir del retorno de nuestra funcion
        System.out.println(nombre_saludado);
    }
    public static String saluda(String name) {
       return "Hola"+" "+name;
    }
}

Bien de igual manera como si de una String normal(que si es) se tratara,podemos usar los métodos de dicho objeto,porque como en java casi todo son objetos si una función devuelve un objeto,podemos usar funciones del mismo:

Por ejemplo:

String nombre_saludado = saluda(nombre).concat(" :D");

concat es una función de String que se usa para añadir texto al que ya tiene.

En este caso al ejecutar veríamos:

Hola tu nombre :D

Sin embargo si es un tipo primitivo no podemos hacer eso:

Por ejemplo tenemos una función que nos devuelve un booleano para hacer determinada cosa:


1
2
3
4
5
6
7
private static boolean checar(int i) {
 if (i == 1) {
    return false;
 } else {
    return true;
 }
}

En el main tenemos:


1
2
3
public static void main(String[] args) {
 boolean ver = checar(1).aqui_no_hay_nada;
}

En java no existe un paso por referencia siempre lo hacemos por valor,a menos que sea un vector o una matriz o un objeto especial que se extienda de Object y no sea inmutable:

Por ejemplo tenemos esta funcion:


1
2
3
private static void cambiar(int i/* esta es una copia */) {
   i = 10;
}

Y en el main:


1
2
3
4
5
public static void main(String[] args) {
 int x = 1; // Valor 1
 cambiar(x); // Valor 1
 // Valor de x 1
}


Si queremos modificar un valor desde una función,podemos crear una variable de clase(miembro[privada]):

Antes de continuar hay que saber que en java en el método main no siempre es necesario usar metodos static,para usar métodos no static desde main debemos crear un objeto del mismo:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/**
 * Archivo Ejemplo.java
 * Ejecuta : javac Ejemplo.java && java EJemplo
 * @author Atheyus
 *
 */

public class Ejemplo {
 private int x = 10;
 
 public static void main(String[] args) {
  Ejemplo e = new Ejemplo(); // Creamos un objeto de la propia clase,x vale 10 para e
  cambiar(e); // cambiar si es static porque lo llamamos desde main
  System.out.println(e.x); // x vale 20
 }
 
 private static void cambiar(Ejemplo x/*Referencia a e*/) {
     x.x = 20; // Cambiamos el valor de x de e,usando x
 }
}

Eso es un poco tonto y un poco de mala practica,podemos usar el método cambiar desde el objeto:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * Archivo Ejemplo.java
 * Ejecuta : javac Ejemplo.java && java Ejemplo
 * @author Atheyus
 *
 */

public class Ejemplo {
 private int x = 10; // Creamos una variable miembro
 
 public static void main(String[] args) {
  Ejemplo e = new Ejemplo(); // Creamos un objeto Ejemplo
  e.cambiar(20); // Cambiamos el valor de x de e
  Ejemplo e2 = new Ejemplo(); // Creamos otro objeto de Ejemplo
  System.out.println(e.x); // Vale 20
  System.out.println(e2.x); // Vale 10
 }
 
 private void cambiar(int x) {
     this.x = x;
 }

}

this es una palabra que apunta al objeto dueño del elemento,en el caso de arriba e.

Bien como vemos se puede cambiar el valor del objeto por referencia cuando se trate de un Objeto,en su momento veremos los arrays y matrices,pero de momento solo puedo decir que los valores que no se pueden cambiar por referencia son los primitivos directamente,ya que aquí cambiamos un primitivo pero haciendo referencia al objeto no al valor en si.

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.