## Implementación de Métodos

Similarmente a la implementación de una clase, la implementación de un método consiste en dos partes, la declaración y el cuerpo del método.

    declaracióndeMétodo {
            cuerpodeMétodo
    }

### La Declaración de Método

> Una declaración de método proporciona mucha información sobre el método al compilador, al sistema en tiempo de ejecución y a otras clases y objetos. Junto con el nombre del método, la declaración lleva información como el tipo de retorno del método, el número y el tipo de los argumentos necesarios, y qué otras clases y objetos pueden llamar al método.

> Los únicos elementos necesarios una declaración de método son el nombre y el tipo de retorno del método. Por ejemplo, el código siguiente declara un método llamado estaVacio() en la clase Pila que devuelve un valor booleano (true o false):

>     class Pila {
>         . . .
>         boolean estaVacio() {
>             . . .
>         }
>     }

### Devolver un Valor desde un Método

> Java necesita que un método declare el tipo de dato del valor que devuelve. Si un método no devuelve ningún valor, debe ser declarado para devolver void (nulo).

> Los métodos pueden devolver tipos de datos primitivos o tipos de datos de referencia. El método estaVacio() de la clase Pila devuelve un tipo de dato primitivo, un valor booleano:

>     class Pila {
>         static final int PILA_VACIA = -1;
>         Object[] stackelements;
>         int topelement = PILA_VACIA;
>         . . .
>         boolean estaVacio() {
>             if (topelement == PILA_VACIA)
>                 return true;
>             else
>                 return false;
>         }
>     }

> Sin embargo, el método pop de la clase PILA devuelve un tipo de dato de referencia: un objeto.

>     class Pila {
>         static final int PILA_VACIA = -1;
>         Object[] stackelements;
>         int topelement = PILA_VACIA;
>         . . .
>         Object pop() {
>             if (topelement == PILA_VACIA)
>                 return null;
>             else {
>                 return stackelements[topelement--];
>             }
>         }
>     }

> Los métodos utilizan el operador return para devolver un valor. Todo método que no sea declarado como void debe contener una sentencia return.

> El tipo de dato del valor devuelto por la sentencia return debe corresponder con el tipo de dato que el método tiene que devolver; no se puede devolver un objeto desde un método que fue declarado para devolver un entero.

> Cuando se devuelva un objeto, el tipo de dato del objeto devuelto debe ser una subclase o la clase exacta indicada. Cuando se devuelva un tipo interface, el objeto retornado debe implementar el interface especificado.

### Un Nombre de Método

> Un nombre de método puede ser cualquier indentificador legal en Java. Existen tres casos especiales a tener en cuenta con los nombres de métodos:
> 1. Java soporta la sobrecarga de métodos, por eso varios métodos pueden compartir el mismo nombre. Por ejemplo, supon que se ha escrito una clase que puede proporcionar varios tipos de datos (cadenas, enteros, etc...) en un área de dibujo. Se podría escribir un método que supiera como tratar a cada tipo de dato. En otros lenguajes, se tendría que pensar un nombre distinto para cada uno de los métodos. dibujaCadena(), dibujaEntero, etc... En Java, se puede utilizar el mismo nombre para todos los métodos pasándole un tipo de parámetro diferente a cada uno de los métodos. Entonces en la clase de dibujo, se podrán declarar tres métodos llamados draw<() y que cada uno aceptara un tipo de parámetro diferente:

>        class DibujodeDatos {
>            void draw(String s) {
>                . . .
>            }
>            void draw(int i) {
>                . . .
>            }
>            void draw(float f) {
>                . . .
>            }
>        }

>    Nota: La información que hay dentro de los paréntesis de la declaración son los argumentos del método. Los argumentos se cubren en la siguiente página: Pasar Información a un Método.

>    Los métodos son diferenciados por el compilador basándose en el número y tipo de sus argumentos. Así draw(String s)y draw(int i) son métodos distintos y únicos. No se puede declarar un método con la misma firma: draw(String s)y draw(String t) son idénticos y darán un error del compilador.

>    Habrás observado que los métodos sobrecargados deben devolver el mismo tipo de dato, por eso void draw(String s) y int draw(String t) declarados en la misma clase producirán un error en tiempo de compilación.

> 2. Todo método cuyo nombre sea igual que el de su clase es un constructor y tiene una tarea especial que realizar. Los constructores se utilizan para inicializar un objeto nuevo del tipo de la clase. Los constructores sólo pueden ser llamados con el operador new. Para aprender cómo escribir un constructor, puedes ver Escribir un Método Constructor.

> 3. Una clase puede sobreescribir un método de sus superclases. El método que sobreescribe debe tener el mismo, nombre, tipo de retorno y lista de parámetros que el método al que ha sobreescrito. Sobreescribir Métodos te enseñará como sobreescribir los métodos de una superclase.

### Caractersiticas Avanzadas de la Declaración de Métodos

> Junto con los dos elementos necesarios, una declaración de método puede contener otros elementos. Estos elementos declaran los argumentos aceptados por el método, si el método es un método de clase, etc...

> Juntándolo todo, una declaración de método se parecería a esto:

>     [especificadordeAcceso] [static] [abstract] [final] [native] [synchronized]
>     tipodeRetorno nombredelMétodo ([listadeparámetros]) [throws listadeExcepciones]

> Cada uno de estos elementos de una declaración se cubre en alguna parte de este tutorial.

Ozito