miércoles, 26 de septiembre de 2012

Estructura de una Clase en Java

Una clase en Java nos proporcionará los atributos y métodos necesarios que un objeto necesitará para interactuar con otros, por lo que es importante saber estructurar correctamente las clases.

Con la siguiente sentencia, estamos declarando una clase:

public class NombreDeLaClase{}
La palabra "public" indica que el alcance de la clase será público, no significa "publicar clase" . Después de 'public class' escribimos el identificador de la clase. Se recomienda elegir un identificador abstracto a la clase, para facilitar la comprensión del código.

Por ejemplo, si queremos modelar objetos de tipo "Persona", es recomendable que el identificador sea "Persona" y no "Juan", el identificador de la clase debe proporcionar una idea general y no una idea específica.

En Java se usan llaves { } para agrupar trozos de código determinados, es por eso que todo el contenido de la clase que estamos haciendo debe estar entre sus respectivas llaves.

A continuación presentamos un ejemplo muy sencillo de una clase, lo analizaremos línea a línea (Los números de la columna de la izquierda solo los ponemos en este ejemplo para identificar fácilmente las líneas de código, éstos no forman parte del código):

1   public class Persona{
2      private String nombre;
3      private String apellido;
4      private int edad;
5    
6      public  Persona(String n, String a, int e){
7          nombre   = n;
8          apellido = a;
9          edad     = e;
10     }
11     
12     public void saludar(){
13         System.out.println("Hola, mi nombre es " + nombre);
14     }
15     public int  getEdad(){
16         return edad;
17     }
18  }

Atributos

La primer línea ya la explicamos anteriormente, así que vayamos a la segunda línea:
private String nombre;
Es recomendable declarar todos los atributos al inicio de la clase, así es que esta línea declara un atributo de alcance privado (private), el atributo es de tipo String (cadena de caracteres); y el identificador del atributo es: nombre. Como ya hemos dicho, los identificadores deben cumplir con ciertas reglas, y es recomendable que los identificadores de los atributos inicien con minúscula. 

La tercera es prácticamente igual, simplemente cambia el identificador.

Ahora analicemos la cuarta línea:
private int edad;
Qué piensas que es ¿un método o un atributo?
Se trata de un atributo nuevamente privado, ¿por qué privado?.
Uno de los principios de la programación orientada a objetos es el encapsulamiento, y este significa resguardar los atributos para que no se pueda acceder directamente a ellos, sino que debemos crear interfaces para poder acceder a estos datos.

La primera diferencia de esta línea con la anterior es el tipo de atributo, en este caso leemos la palabra int, esto significa que edad es un atributo de enteros (dígitos).

Como puedes ver, la 5a línea está vacía, ¿tiene que ser así? por supuesto que no, Java es tan potente que los espacios y saltos de línea son semejantes, para Java es lo mismo que pongas un espacio a que pongas los saltos de línea que quieras, así es que si quieres hacer más estético tu código, aprovéchalo.

Constructor

Después de los atributos se recomienda colocar el constructor (o los constructores), si aún no te queda clara la función de un constructor, este nos sirve para crear las instancias de las clases (los objetos), y este puede solicitar datos para asignarlos a las variables/atributos que sean necesarias. Analicémoslo.
public  Persona(String n, String a, int e){
Como vemos, esta línea empieza con "public" que, como ya hemos dicho, no significa "publicar", sino que significa que el alcance o visibilidad que tendrá este constructor será público.

¿Por qué público?
Es necesario que el constructor sea público, ya que si no fuera así, no podríamos crear objetos porque no tendríamos acceso al constructor.

Después de declarar que será público colocamos el identificador, que en el caso de los constructores debe ser exactamente igual al identificador de la Clase, por eso el identificador de este constructor es: Persona.

A continuación observamos que hay una serie de datos dentro de unos paréntesis
(String n, String a, int e)
A estos les llamaremos parámetros, y su función es solicitar datos al momento de que un objeto es creado, en este caso de la clase Persona, el constructor nos está solicitando dos cadenas (n y a) y un valor entero (e).
Como vemos, al momento de escribir los parámetros debemos especificar primeramente el tipo de dato que queremos que nos den y después del tipo, un identificador temporal, que nos servirá mientras el constructor esté siendo ejecutado. Es muy importante que los parámetros vayan separados por comas.

Finalmente lo último que hay en la línea es una llave que abre el bloque de código que contendrá el constructor.
{
Las líneas 7, 8 y 9 realizan acciones similares.
nombre   = n;apellido = a;edad     = e;
Se recomienda que dentro del constructor se inicialicen las variables, es decir, que se les asignen valores. Es por eso que en estas líneas le asignamos valores a los atributos que declaramos anteriormente usando los parámetros que solicitamos.

Hay que recalcar, que todas las sentencias en Java deben terminar con punto y coma (;) ya que como ya hemos visto, Java no toma en cuenta los saltos de línea, así es que es necesario especificar en dónde termina una instrucción.

En la línea 10 solo observamos la llave que cierra el bloque de código correspondiente al constructor.
}

Métodos 

En nuestra clase, a partir de la línea 12 se encuentran 2 métodos escritos, analicemos el primero:
public void saludar(){   System.out.println("Hola, mi nombre es " + nombre);}
Nuevamente nos encontramos con la palabra public, que a estas alturas ya sabes qué significa; lo que aún no sabes qué significa es void.

Para escribir un método, después de declarar el alcance que tendrá, debemos especificar el tipo de dato que regresará el método al ser ejecutado, obviamente no todos los métodos deben regresar algún dato, algunos métodos simplemente realizan su función y no tienen que regresar algún valor, así que para estos métodos que no retornan nada es necesario escribir la palabra void.

Con lo que hemos visto ya podemos leer la declaración de este método:
"saludar" es un método publico que no retorna ningún valor y no solicita ningún parámetro.
Decimos que no solicita ningún parámetro ya que, como vimos en el constructor, los métodos también pueden recibir datos para ser usados en su trabajo, los parámetros siempre se encuentran entre paréntesis al lado del identificador, y si no se solicitarán parámetros, es necesario escribir los paréntesis vacíos ( ).

Observamos que la única sentencia que se encuentra dentro del bloque de llaves de este método es:
System.out.println("Hola, mi nombre es " + nombre);
¿Para qué sirve System.out.println( )?
Esta sentencia nos ayudará a imprimir (mostrar) en la pantalla cadenas de texto, así que la cadena que queremos mostrar, debe ir dentro de los paréntesis y entre comillas.

Así mismo, dentro de esta cadena que deseamos imprimir, podemos agregar valores de las variables simplemente colocando un + y el nombre de la variable que queremos insertar, de hecho, hasta podemos llamar a métodos que devuelvan valores que queremos imprimir, pero eso lo veremos más adelente.

Suponiendo que al momento de construir un objeto de tipo Persona se le pasaron los siguientes valores:
"Juan""Pérez"15

Al ejecutarse este método el programa debería mostrar en pantalla:
Hola, mi nombre es Juan
Ahora es tu turno, analiza el último método y trata de describir qué es lo que hace.

Fíjate muy bien, éste método contiene una instrucción return. ¿A qué se deberá?

martes, 25 de septiembre de 2012

Clases y objetos

Como hemos dicho anteriormente una clase es la abstracción de un objeto del mundo real, y nos sirve para definir los atributos y métodos que tendrán los objetos que sean creados.

Para representar las clases y los objetos usaremos la simbología UML.


Este es un diagrama de clase, como podemos ver, en la parte superior se coloca el "Identificador", es decir, el nombre que tendrá nuestra Clase.

Por regla general de Java, los identificadores deben cumplir con lo siguiente:

  1. El primer caracter debe ser una letra, ó alguno de estos símbolos: $, _. No puede ser un número.
  2. Debe estar compuesta por letras, dígitos y símbolos permitidos ($, _).
  3. No se pueden usar palabras reservadas de Java.
  4. El uso de mayúsculas y minúsculas es importante, no es lo mismo "Persona" que "persona".
Identificadores válidos:
numero
$variable1
otro$paciente
_el4alumno

Identificadores no válidos:
2alumno
/variable
valor%suma

Se recomienda usar la primera letra como mayúscula para los identificadores de clases, y para los atributos y métodos se recomienda usar iniciales en minúscula.Esto, a pesar de no ser una regla, es altamente recomendable para facilitar la comprensión del programa al momento de leer el código.

Debajo del identificador en el diagrama de clase, se colocan los atributos. El identificador de los atributos, como ya recomendamos, debería ser con inicial minúsucula, pero antes del identificador, se coloca un símbolo de alcance.

El símbolo de alcance nos permite conocer qué tipo de acceso tendrán los atributos y métodos. Para cumplir el encapsulamiento (característica de este tipo de programación), los atributos deben ser privados (-) y los métodos públicos (+), aunque está claro que no es una regla que siempre se deba cumplir, puede haber métodos privados que sean usados por otros métodos públicos; pero los atributos es altamente recomendable hacerlos privados, para mayor seguridad.

En la parte inferior del diagrama de clase, se coloca el constructor (o constructores) de la clase, más adelante estudiaremos los constructores, en pocas palabras, es un "método" que es llamado al momento de crear un objeto de esa clase.
El constructor siempre debe llevar el mismo nombre de la Clase, por lo que también se escribe con la inicial mayúscula.

Los métodos se colocan después y estos expresan las acciones que lleva a cabo la clase, pueden contener algún tipo de dato de retorno, o también datos de entrada (parámetros).

A continuación presentaremos un ejemplo de una clase y una instancia de ella (objeto).


Como podemos aperciar, la Clase solo determina el patrón del objeto, pero los atributos aún no tienen información y por lo tanto los métodos no pueden ser ejecutados.

En el objeto, los atributos ya cuentan con la información detallada que se necesita y por lo tanto ya puede interactuar tanto con otros objetos como con él mismo.


Palabras reservadas en Java

Las palabras reservadas son palabras que son utilizadas como parte de determinado lenguaje de programación, estas tienen ciertas características y funciones en el lenguaje, por lo tanto no pueden ser utilizadas en otra cosa que no sea para cumplir su función

Es importante conocer qué palabras son consideradas reservadas por Java, ya que estas palabras no las podremos usar como identificadores.

A continuación la lista de palabras reservadas en Java:

  • abstract
  • double
  • int
  • strictfp
  • boolean
  • else
  • interface
  • super
  • break
  • extends
  • long
  • switch
  • byte
  • final
  • native
  • synchronized
  • case
  • finally
  • new
  • this
  • catch
  • float
  • package
  • throw
  • char
  • for
  • private
  • throws
  • class
  • goto
  • protected
  • transient
  • const
  • if
  • public
  • try
  • continue
  • implements
  • return
  • void
  • default
  • import
  • short
  • volatile
  • do
  • instanceof
  • static
  • while

Paradigma de la Programación Orientada a Objetos

La programación orientada a objetos (POO) consiste, como su nombre lo dice, en objetos. Un objeto se compone de datos (atributos) y algoritmos (métodos).
Los atributos nos sirven para describir el estado del objeto.
Los métodos son usados por el objeto para poder interactuar con otros objetos o con él mismo.
El algoritmo puede:

  1. Cambiar el estado de un objeto
  2. Generar una salida
  3. Enviar mensajes a otros objetos.
Para entender un poco mejor el paradigma de la programación orientada a objetos pongamos un ejemplo.

Un objeto que representa una ventana contiene su propia información, como su posición, tamaño, título, etc. Si el usuario decide cerrar la ventana, el sistema envía un mensaje al objeto "Ventana" diciéndole que se cierre, entonces la Ventana ejecuta el algoritmo necesario para cerrarse y así removerse de la pantalla.
 Los objetos son lo más importante en este estilo de programación. Aquí debes pensar en objetos del mundo real, como personas, autos, casas, etc. Estos objetos tienen características que definen su estado y comportamiento.
Por ejemplo:

Las personas tienen un "estado" definido por su nombre, altura, peso, etc. Y también tienen un "comportamiento", es decir, acciones que llevan a cabo como hablar, caminar, reír, etc.
Los autos tienen un "estado" definido por su velocidad, dirección, cantidad de gasolina, etc. Y tienen un "comportamiento": acelerar, frenar, girar, etc.
En un lenguaje orientado a objetos, los objetos son modelados de la misma manera, tienen un estado, expresado mediante atributos almacenados en variables; y un comportamiento implementado con métodos.

Los métodos pueden manipular a los atributos, por ejemplo:

Los documentos en un sitio web tienen atributos (nombre, url, tipo de contenido) y comportamiento (abrir, cerrar, actualizar).

En la POO, una clase es una estructura de código que es usada para crear (construir) objetos, en la clase se definen los atributos y métodos que tendrá el objeto al ser creado (instanciado).

Usualmente una clase representa una persona, lugar, o cosa; es una abstracción de un concepto. La clase encapsula los atributos y define métodos para acceder a estos.