martes, 30 de octubre de 2012

jueves, 25 de octubre de 2012

Crear un objeto en Java

Como hemos visto anteriormente, las clases son los modelos abstractos de los objetos, y los objetos son instancias de las clases. Para poder generar un objeto en Java, primero debemos tener construida su clase.

Supongamos que tenemos la Clase "Perro" y que queremos generar un nuevo objeto, recordemos que es en el objeto donde podemos definir los datos del Perro, así es que generaremos un objeto de tipo Perro y le pondremos nombre y raza.

Para construir el objeto, debemos invocar al constructor de la clase Perro.

En Java, puede haber uno o más constructores, dependiendo de qué datos le queramos poner, pero si nosotros no escribimos un constructor, Java genera automáticamente uno, sin datos de entrada.

Supongamos que el constructor de nuestra clase Perro es el siguiente

public Perro(String n, String r){
     nombre = n;
     raza = r;
}

Este constructor debe estar dentro de la clase Perro.

En este ejemplo, nuestro constructor nos está solicitando como parámetros dos String's (n, r) y estos, los asigna a las variables "nombre" y "raza" que deben estar anteriormente declaradas en la clase Perro, o de lo contrario, el programa no compilará.

Hay dos maneras de generar un nuevo objeto, y son las siguientes:

Perro perrito1;perrito1 = new Perro("Firulais", "Salchicha");


Perro perrito1 = new Perro("Firulais", "Salchicha");

En esta instrucción decimos que queremos un objeto perrito1 de tipo Perro, al mismo tiempo que declaramos perrito1, le asignamos un valor, este valor, será el nuevo objeto que crearemos con la instrucción new. Como observamos, al escribir Perro("Firulais", "Salchicha"); estamos colocando los String's que nos solicita el constructor, estos deben ir entre comillas siempre.

Una vez que esa instrucción se ejecuta, el objeto perrito1 puede llevar a cabo los métodos que tenga declarados la clase Perro.

Intenta generar un objeto perrito2 que tenga por nombre "Pulgas" y de raza "Chihuahua".




Fuente:
POO con Java, una introducción usando BlueJ

lunes, 22 de octubre de 2012

Objetos y Clases

Cuando escribes un programa de computación en un lenguaje orientado a objetos, estás creando en tu computadora un modelo de alguna parte del mundo real. Las partes con que se construye el modelo provienen de los objetos que aparecen en el dominio del problema. Estos objetos deben estar representados en el modelo computacional que se está creando.

Los objetos pueden ser organizados en categorías y una clase describe, en forma abstracta, todos los objetos de un tipo particular.

Podemos aclarar estas nociones abstractas mediante un ejemplo.

Supón que deseas modelar una simulación de tráfico. Un tipo de entidad con la que tendrás que trabajar es autos. ¿Qué es un auto en nuestro contexto?, ¿Es una clase o es un objeto? Algunas preguntas nos ayudarán a tomar una decisión.
  • ¿De qué color es un auto?
  • ¿Cuán rápido puede correr?
  • ¿Dónde está en este momento?


Observarás que no podemos responder estas preguntas a menos que hablemos de un auto específico. La razón es que, en este contexto, la palabra "auto" refiere a la clase auto, puesto que estamos hablando de los autos en general y no de uno en particular.

Si digo "Mi viejo auto rojo se encuentra estacionado en el garaje de la casa", podemos responder todas las preguntas anteriores: este auto es rojo, no marcha demasiado rápido y está en mi garaje. Ahora estoy hablando de un objeto, un ejemplo particular de un auto.

Generalmente, cuando nos referimos a un objeto en particular, hablamos de una instancia. De aquí en adelante usaremos regularmente el término "Instancia". Instancia es casi un sinónimo de objeto. Nos referimos a objetos como instancias cuando queremos enfatizar que son de una clase en particular (como por ejemplo, cuando decimos "este objeto es una instancia de la clase auto").



Fuente:
POO con Java, una introducción usando BlueJ

miércoles, 10 de octubre de 2012

Ventajas y desventajas de la Programación Orientada a Objetos


A continuación presentamos las ventajas y desventajas de la Programación Orientada a Objetos (POO).

Ventajas:
  • Reusabilidad. Cuando hemos diseñado adecuadamente las clases, se pueden usar en distintas partes del programa y en numerosos proyectos.
  • Mantenibilidad. Debido a las sencillez para abstraer el problema, los programas orientados a objetos son más sencillos de leer y comprender, pues nos permiten ocultar detalles de implementación dejando visibles sólo aquellos detalles más relevantes.
  • Modificabilidad. La facilidad de añadir, suprimir o modificar nuevos objetos nos permite hacer modificaciones de una forma muy sencilla.
  • Fiabilidad. Al dividir el problema en partes más pequeñas podemos probarlas de manera independiente y aislar mucho más fácilmente los posibles errores que puedan surgir.
Desventajas:
  • Cambio en la forma de pensar de la programación tradicional a la orientada a objetos.
  • La ejecución de programas orientados a objetos es más lenta.
  • La necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y entrenamiento.

miércoles, 3 de octubre de 2012

Variables en Java

Para todos nosotros es más fácil memorizar un nombre, que una serie de dígitos, por ejemplo:
Supongamos que estás registrado en una escuela y tu ID es: 11239401245, y tu nombre es "Juan", es más fácil recordar Juan que todos los dígitos del ID.
En Java, se les denomina VARIABLES a esos nombres que nos ayudarán a referirnos a una dirección de la memoria, así, en vez de tener que escribir que almacene cierto valor en determinado lugar en la memoria, solo declaramos una variable con un nombre y Java le asigna una posición en la memoria.

Supongamos que en la memoria, tenemos almacenados los siguientes datos:

  • En la posición 39991 tengo almacenado el valor 4
  • En la posición 21234 tengo almacenado el valor 2
Para sumarlas tendría que decir:
Suma el valor de la posición 39991 más el valor de la posición 21234 y guárdalo en la posición 39421

Resulta mucho más fácil ponerle nombre a estas direcciones, y así decir:

n1 + n2 = n3

Cómo declarar una variable en Java

Antes de poder usar las variables tenemos que declararlas e inicializarlas.

Para declarar una variable en Java debemos seguir la siguiente estructura:
<modificador de alcance>  <tipo>  identificador;
El modificador de alcance puede ser de varios tipos como: public y private.
Como ya sabemos, el modificador de alcance determinará la visibilidad de la variable, y se recomienda que todos los atributos sean privados, con un método público opcional para acceder a él.

Todas las variables deben ser de algún tipo, ya sean primitivos (predefinidos por Java) o creados por el propio programador.

El identificador es el nombre que llevará la variable, y debe cumplir ciertas reglas para ser válido, estas reglas son las mismas que los identificadores de las clases y métodos.

Un ejemplo de una declaración de una variable de nombre "miVariable1" de tipo entero (int) y de alcance privado:
private int miVariable1;
 Si queremos declarar muchas variables del mismo tipo, en vez de hacer una nueva línea para cada una de ellas, las podemos declarar de esta manera:
private int miVariable1, miVariable2, miVariable3;

Inicialización de las Variables en Java 

Se le denomina inicialización al momento de asignarle un valor a las variables, esto se puede realizar desde su declaración o en otro momento, si se quiere realizar desde su declaración, a esta se le debe agregar el operador "=" y el valor que se desea asignar.
Por ejemplo:
private int miVariable1 = 3;
Si queremos inicializar la variable en otro momento, simplemente la debemos declarar al principio, y la inicialización la podemos colocar donde queramos, una vez que ya está declarada la variable, para inicializarla solo debemos escribir su identificador, el operador "=" y el valor que queremos asignar.
Por ejemplo:
miVariable2 = 6;

Tipos de datos primitivos de Java


-boolean
Almacena valores que pueden ser verdaderos o falsos.
Ocupa 1-bit y el valor por defecto es false.

-char
Almacena un caracter.
Los caracteres son de 16 bits y están codificados en Unicode 1.1.5

-byte
Almacena enteros de 8 bits con signo, es decir, número entre menos (dos a la séptima) y dos a la octava.
La representación interna es en complemento a 2.

-short
Almacena enteros de 16 bits con signo.
La representación interna es en complemento a 2.

-int
Almacena enteros de 32 bits con signo.
La representación interna es en complemento a 2.

-long
Almacena enteros de 64 bits con signo.
La representación interna es en complemento a 2.

-float
Almacena numeros reales con decimales de 32 bit con coma móvil.

-double
Almacena reales de 32 bit con coma móvil.

lunes, 1 de octubre de 2012

La importancia de la abstracción en Java

La abstracción es un proceso mental de todos los humanos, a diferencia de los animales, nosotros podemos generar ideas en nuestra mente a un nivel específico o un nivel abstracto, por ejemplo:
¿Qué se viene a tu mente cuando te digo "Perro"?
 Tal vez imaginaste un perro grande, blanco; o tal vez uno pequeño, café, cada mente piensa distinto, no todos imaginamos el mismo perro, pero lo que sí está claro es que todos imaginamos un animal de cuatro patas, con cola, con dos ojos; es decir, con las características generales de un perro.

Al obtener esta idea general de un perro podemos obtener un modelo abstracto de los objetos, lo cual será muy importante en la programación orientada a objetos.

Al modelar la clase "Perro" podemos definir como atributos:

  • Raza
  • Edad
  • Color
Solo por mencionar algunos.
Y podemos definir como sus métodos:

  • Ladrar
  • Mover la cola
  • Comer
Estos atributos y métodos son generales, pero al momento de implementarlos, cada Perro tendrá diferentes "valores" y actuará diferente, no todos ladran igual, ni comen igual.

Intenta modelar la clase "Computadora", imagina sus atributos y métodos.

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.