lunes, 10 de agosto de 2015

MÉTODOS EN JAVA

Un método en Java es un conjunto de instrucciones definidas dentro de una clase, que realizan una determinada tarea y a las que podemos invocar mediante un nombre.
  
Algunos métodos que hemos utilizado hasta ahora:
– Math.pow()
– Math.sqrt()
– Character.isDigit()
- System.out.println();

Cuando se llama a un método, la ejecución del programa pasa al método y cuando éste acaba, la ejecución continúa a partir del punto donde se produjo la llamada.
Utilizando métodos:
-  Podemos construir programas modulares.
-  Se consigue la reutilización de código. En lugar de escribir el mismo código repetido cuando se necesite, por ejemplo para validar una fecha, se hace una llamada al método que lo realiza.
En Java un método siempre pertenece a una clase.
Todo programa java tiene un método llamado main. Este método es el punto de entrada al programa y también el punto de salida.
1. ESTRUCTURA GENERAL DE UN MÉTODO JAVA 
La estructura general de un método Java es la siguiente:
[especificadores] tipoDevuelto nombreMetodo([lista parámetros]) [throws listaExcepciones]
{
    // instrucciones
   [return valor;]
}
Los elementos que aparecen entre corchetes son opcionales.

especificadores (opcional): determinan el tipo de acceso al método. Se verán en detalle más adelante.

tipoDevuelto: indica el tipo del valor que devuelve el método. En Java es imprescindible que en la declaración de un método, se indique el tipo de dato que ha de devolver. El dato se devuelve mediante la instrucción return. Si el método no devuelve ningún valor este tipo será void.
nombreMetodo: es el nombre que se le da al método. Para crearlo hay que seguir las mismas normas que para crear nombres de variables.
Lista de parámetros (opcional): después del nombre del método y siempre entre paréntesis puede aparecer una lista de parámetros (también llamados argumentos) separados por comas. Estos parámetros son los datos de entrada que recibe el método para operar con ellos. Un método puede recibir cero o más argumentos. Se debe especificar para cada argumento su tipo. Los paréntesis son obligatorios aunque estén vacíos.
throws listaExcepciones (opcional): indica las excepciones que puede generar y manipular el método.
return: se utiliza para devolver un valor. La palabra clave return va seguida de una expresión que será evaluada para saber el valor de retorno. Esta expresión puede ser compleja o puede ser simplemente el nombre de un objeto, una variable de tipo primitivo o una constante.
El tipo del valor de retorno debe coincidir con el tipoDevuelto que se ha indicado en la declaración del método.
Si el método no devuelve nada (tipoDevuelto = void) la instrucción return es opcional.
Un método puede devolver un tipo primitivo, un array, un String o un objeto.
Un método tiene un único punto de inicio, representado por la llave de inicio {. La ejecución de un método termina cuando se llega a la llave final } o cuando se ejecuta la instrucción return.
La instrucción return puede aparecer en cualquier lugar dentro del método, no tiene que estar necesariamente al final.
2. IMPLEMENTACIÓN DE MÉTODOS EN JAVA
Pasos para implementar un método:
1.     Describir lo que el método debe hacer
2.     Determinar las entradas del método
3.     Determinar los tipos de las entradas
4.     Determinar el tipo del valor retornado
5.     Escribir las instrucciones que forman el cuerpo del método
6.     Prueba del método: diseñar distintos casos de prueba
Ejemplo de método: método que suma dos números enteros.
import java.util.*;
public class Metodos1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int numero1, numero2, resultado;
        System.out.print("Introduce primer número: ");
        numero1 = sc.nextInt();
        System.out.print("Introduce segundo número: ");
        numero2 = sc.nextInt();
        resultado = sumar(numero1, numero2);
        System.out.println("Suma: " + resultado);
    }
    public static int sumar(int a, int b){
           int c;
           c = a + b;
           return c;
    }
}
El método se llama sumar y recibe dos números enteros a y b.  En la llamada al método los valores de las variables numero1 y numero2 se copian en las variables a y b. El método suma los dos números y guarda el resultado en c. Finalmente devuelve mediante la instrucción return la suma calculada.
Ejemplo de programa Java que contiene un método con varios return:
Programa que lee por teclado un año y calcula y muestra si es bisiesto. Para realizar el cálculo utiliza un método llamado esBisiesto.

package bisiesto;
import java.util.*;
public class Bisiesto {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int año;
        System.out.print("Introduce año: ");
        año = sc.nextInt();
        if(esBisiesto(año))  //llamada al método
           System.out.println("Bisiesto");
        else
           System.out.println("No es bisiesto");
    }
    /**
     * método que calcula si un año es o no bisiesto
     */    
    public static boolean esBisiesto(int a){   
        if(a%4==0 && a%100!=0 || a%400==0)
           return true;
        else
           return false;
    }
}

En la llamada al método bisiesto, el valor de la variable año se copia en la variable a y el método trabaja con esta variable. El valor true ó false devuelto por return pasa a ser el valor de la condición.

miércoles, 29 de julio de 2015

CLASES Y OBJETOS

LOS OBJETOS
El elemento fundamental de la POO es, como su nombre indica, el objeto. Podemos definir un objeto como un conjunto complejo de datos y programas que poseen estructura y forman parte de una organización. En este caso las estructuras de datos y los algoritmos usados para manipularlas están encapsulados en una idea común llamada objeto.

Esta definición especifica dos propiedades características de los objetos:

*En primer lugar, un objeto no es un dato simple, sino que contiene en su interior cierto numero de componentes bien estructurados.

*En segundo lugar, cada objeto no es un ente aislado, sino que forma parte de una organización jerárquica o de otro tipo.


LAS CLASES
En el punto anterior hemos definido de que trata un objeto; pero en realidad el concepto mas adecuado a la hora de definir las características de los objetos de nuestro sistema es el concepto de clase. Una clase es la descripción de una familia de objetos que tienen la misma estructura (atributos) y el mismo comportamiento (métodos). En el caso que estamos siguiendo tendríamos la clase Circulo en el que se definirían los atributos y los métodos que
definen cualquier circulo. Cada ejemplar de circulo sera un objeto (o instancia) de la clase círculo en los que cada uno tendría sus propias coordenadas (su centro y su radio), y todos compartirían los mismos métodos.

De esta forma se organizan los conocimientos que tenemos del sistema; las clases son el patrón habitual que proporcionan los lenguajes orientados a objetos para definir la implementación
de los objetos. Por ejemplo, supongamos que en nuestro sistema detectamos la necesidad de tener empleados, por tanto definimos las características comunes de todo empleado en un pseudo-código orientado a objetos:

Clase Empleado {
Atributos
DNI: Cadena;
NRP: Cadena;
Nombre: Cadena;
Dirección: Cadena;
AñoEntrada: Integer;
AñoNacimiento: Integer;
Complementos: Real;

Métodos
:
:
Integer AñosEmpresa();
:
:
Integer Edad();
:
:
Real Sueldo(Real Extras);
:
:
}

Todos los objetos son instancias de una clase, es decir, ejemplares o ejemplos concretos de la clase. Como vemos, la clase lo define todo, es una entidad auto-contenida en cuanto que contiene todo lo necesario para definir la estructura o los datos (atributos) que cada objeto tendrá y la manera de manejarse esos objetos a través de los métodos.

Dada la clase anterior, podremos crear (ya veremos como) los empleados (objetos, instancias de la clase, ejemplares, etc..) que necesite de los que tendré una referencia, es decir, una variable que apunte a ese empleado. Ası podre tener la referencia emp1 que coincide con el empleado con DNI 00001, con NRP 2345, de nombre Jose García, etc... Si quiero obtener el sueldo de este empleado tendré que invocar al método correspondiente en el objeto que lo
representa a través de la referencia de la siguiente forma:

emp1.Sueldo(136000);

Esta invocación tendrá como contrapartida la ejecución del método Sueldo en el objeto especificado y no en otro.
Recordando lo comentado en el apartado anterior, y siendo mas formales en la definición, cada clase posee una doble componente:

Una componente estática, los datos, que son campos con nombres, que poseen ciertos valores. Estos campos caracterizan el estado del objeto. A los campos les llamaremos usualmente atributos.
Una componente dinámica, los procedimientos o funciones, llamados métodos, que representan el comportamiento común de los objetos que pertenecen a la misma clase.

Los métodos son los encargados de manipular los campos de los objetos (ademas, es una practica muy mala el modificar atributos de forma directa: rompe la encapsulacion y la ocultación de la información) y caracterizan las acciones que se pueden realizar sobre los mismos. Esta componente dinámica forma la llamada interfaz de la clase, y suministra la única forma de acceso a los objetos. Para efectuar una operación asociada con un objeto, se debe mencionar el objeto implicado, que llamaremos el receptor del mensaje, el método a activar, y los argumentos sobre los que se aplica. En cuanto a los métodos conviene comentar que no todos tienen por que ser accesibles desde el exterior a cualquier usuario; puede que existan métodos que solo sean visibles para
un grupo concreto de clases o solo para la clase en la que se definen. Una visión sencilla de un objeto es la combinación de estado y comportamiento. El estado se describe mediante los atributos, en tanto que el comportamiento se caracteriza por los métodos.

ORIENTACIÓN A OBJETOS


La orientación a objetos promete mejoras de amplio alcance en la forma de diseño, desarrollo y mantenimiento del software ofreciendo una solución a largo plazo a los problemas y preocupaciones que han existido desde el comienzo en el desarrollo de software:

*La falta de potabilidad del código y su escasa reusabilidad.
*Código que es difícil de modificar.
*Ciclos de desarrollo largos.
*Técnicas de codificación no intuitivas.

Un lenguaje orientado a objetos ataca estos problemas. Tiene tres características básicas:
debe estar basado en objetos, basado en clases y capaz de tener herencia de clases. Muchos lenguajes cumplen uno o dos de estos puntos; muchos menos cumplen los tres. La barrera mas difícil de sortear es usualmente la herencia. El concepto de programación orientada a objetos (POO) no es nuevo, lenguajes clásicos como SmallTalk se basan en ella.
Dado que la POO se basa en la idea natural de la existencia de un mundo lleno de objetos y que la resolución del problema se realiza en términos de objetos, un lenguaje se dice que
esta basado en objetos si soporta objetos como una característica fundamental del mismo.
No debemos confundir que este basado en objetos con que sea orientado a objetos: para que sea orientado a objetos al margen que este basado en objetos, necesita tener clases y relaciones de herencia entre ellas.