martes, 2 de junio de 2015

Estructura básica de una clase en Java

Empezaremos diciendo que en Java una clase debe de proveer los atributos y métodos necesarios que un objeto requerirá para interactuar con otros, así que es fundamental saber configurar correctamente las clases.

Veamos a continuación como declaramos una clase:

public class NombreDeLaClase{}

A continuación vamos a tratar de describir cada una de las palabras escritas anteriormente por ejemplo, la palabra "public" manifiesta que la proyección de la clase será público, no quiere decir "publicar clase" esto quiere decir que tendrás acceso a dicha clase, desde cualquier parte del código sin ningún tipo de complicaciones. Después de 'public class' anotamos el identificador de la clase. Se sugiere elegir un identificador abstracto a la clase, para facilitar la comprensión del código.

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

Las llaves { } son utilizadas en Java para agrupar porciones de código determinados, por eso es que todo el contenido de la clase que estemos haciendo debe estar entre sus respectivas llaves.

En seguida mostraremos un ejemplo muy sencillo de una clase, la cual describiremos detallando cada línea (Los números que se muestran en la columna de la izquierda están puestos en este ejemplo para detallar 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

private String nombre;

Deben de quedar indicados todos los atributos al inicio de la clase, como se muestra la línea anterior manifiesta un atributo de alcance privado (private), el atributo es de tipo String (cadena de caracteres); y el identificador del atributo es: nombre. Se ha indicado que los identificadores deben cumplir con ciertas reglas, por lo que es aconsejable que los identificadores de los atributos inicien con minúscula.

La líneas 3 y 4 es semejante a la línea 2 por lo que no se describirá en detalle, pues lo único que cambia es el identificador. Pero veamos la línea 4 que es diferente a las anteriores:

private int edad;

Como se puede notar también es un atributo privado. Pero veamos porque son privados. Existe un principio en la programación orientada a objetos la cual es el encapsulamiento donde su función es proteger los atributos, esto es que está impedido el acceso a ellos directamente, y para que podamos llegar a ellos debemos establecer interfaces hacia estos datos. 
Notemos una de las diferencias de esta línea con la anterior, si nos damos cuenta el modelo de atributo es diferente, ya que int su atributo es de entero (dígitos).

La línea siguiente está vacía, pero no necesariamente tiene que ser así, Java es tan dinámico que los saltos y espacios de línea son semejantes o sea que en Java da lo mismo que quede un salto de línea o un espacio que desees, de esta manera se puede realizar más atractivo el código que se esté realizando así que hay que emplearlos.



Constructores


Las clases pueden implementar un método especial llamado constructor. Un constructor es un procedimiento que inicia un objeto inmediatamente después de su creación. De esta forma nos evitamos el tener que iniciar las variables claramente para su iniciación.
El constructor tiene exactamente el mismo nombre de la clase que lo implementa; no puede haber ninguna otra manera que comparta su nombre con el de su clase. Una vez definido, se llamará automáticamente al constructor al crear un objeto de esa clase (al utilizar el operador new).
El constructor no devuelve ningún tipo, ni siquiera void. Su misión es iniciar todo estado interno de un objeto (sus atributos), haciendo que el objeto sea utilizable inmediatamente; reservando memoria para sus atributos, iniciando sus valores.
En sí la función de un constructor nos sirve para crear las instancias de las clases (los objetos), el cual  puede solicitar datos para asignarlos a las variables/atributos que sean necesarias.
El constructor debe de ser indispensablemente público para poder tener acceso a éste y de esa manera poder establecer los objetos. Examinémoslo:

public  Persona(String n, String a, int e){

Se pone el identificador, que para los constructores debe de ser textualmente igual al identificador de la Clase, por eso el identificador de este constructor es: Persona.

            Observe que existe una serie de datos dentro de unos paréntesis              (String n, String a, int e)     que llamaremos parámetros cuya función es la de 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). Es importante que los parámetros vayan separados por comas,  y determinar el tipo de dato que deseamos nos sea dado, y un identificador temporal que nos ayudará mientras el constructor esté siendo ejecutado.
           
            Notemos que al final de la línea existe una llave que indica la apertura del bloque de código que comprenderá el constructor.  {

En las líneas 7, 8 y 9 se realizan acciones similares.

Nombre = n; apellido = a;  edad = e;

            Se aconseja que dentro del constructor se inicien 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 destacar, que todas las sentencias en Java deben terminar con punto y coma (;) pues como mencionamos anteriormente, Java no toma en cuenta los saltos de línea, por lo que es necesario especificar en dónde termina una instrucción.

Por último hablemos de la línea 10 donde solamente observamos la llave que cierra el bloque de código correspondiente al constructor.   }


MÉTODOS

Un atributo es una característica de la clase. Por ejemplo:

Clase Cliente.

Atributos: nombre, apellido.

En java se crean los atributos de la siguiente forma:

Tipo de dato nombreAtributo. Ejemplo.

String nombre, String Apellido.

El atributo debe tener una forma de asignar valor y de obtener valor. Como se muestra en seguida:

AsignarNombre(), ObtieneNombre()

AsignarApellido(), ObteneApellido()

Eso es lo único que hace el atributo, asignar un valor u obtenerlo.

Ahora veamos que Un método por su parte. Es un conjunto de sentencias que hacen algo específico en la clase. Por ejemplo:

Insertar cliente();

Para definir un método en Java:

Ámbito TipoDeDato NombreMetodo().

Public void insertaCliente()

El cuerpo del método hace cosas con los atributos, los inserta en una base de datos, los muestra por pantalla, los pasa a otro método para ser procesados y demás.

Los métodos son como pequeños programas que pertenecen a una misma clase,

Resumiendo lo anterior diríamos que:

Atributo o propiedad: son las características de las clases.

Los métodos: Las instrucciones que manejan los atributos o propiedades.


Volvamos a nuestro ejemplo de clase, que 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);}

Nos volvemos a encontrar con la palabra public, que ya se explicó anteriormente por lo cual ya se sabe lo que significa; pero lo que aún no sabemos es que significa la palabra  void.

Empecemos diciendo que 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 público 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);

Pero ¿para qué nos 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 posteriormente.

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


Métodos que retornan un dato.

Un método puede retornar un dato:

15   public int  getEdad(){
16         return edad;
17   }

Cuando un método retorna un dato en vez de indicar la palabra clave void previo al nombre del método indicamos el tipo de dato que retorna. Luego dentro del algoritmo en el momento que queremos que finalice el mismo y retorne el dato empleamos la palabra clave return con el valor respectivo.


TIPOS DE DATOS EN JAVA

Un dato siempre lleva asociado un tipo de dato, que determina el conjunto de valores que puede tomar.
En Java toda la información que maneja un programa está representada por dos tipos principales de datos:

a.     Datos de tipo básico o primitivo.
b.     Referencias a objetos.

Los tipos de datos básicos o primitivos no son objetos y se pueden utilizar directamente en un programa sin necesidad de crear objetos de este tipo. La biblioteca Java proporciona clases asociadas a estos tipos que proporcionan métodos que facilitan su manejo.



Los tipos de datos primitivos que soporta Java son:
  

Tipo de dato
Representación
Tamaño (Bytes)
Rango de Valores
Valor por defecto
Clase Asociada
byte
Numérico Entero con signo
1
-128 a 127
0
Byte
short
Numérico Entero con signo
2
-32768 a 32767
0
Short
int
Numérico Entero con signo
4
-2147483648 a 2147483647
0
Integer
long
Numérico Entero con signo
8
-9223372036854775808 a 9223372036854775807
0
Long
float
Numérico en Coma flotante de precisión simple Norma IEEE 754
4
± 3.4x10-38 a ± 3.4x1038
0.0
Float
double
Numérico en Coma flotante de precisión doble Norma IEEE 754
8
± 1.8x10-308 a ± 1.8x10308
0.0
Double
char
Carácter Unicode
2
\u0000 a \uFFFF
\u0000
Character
boolean
Dato lógico
-
true ó false
false
Boolean
void
-
-
-
-
Void


DATOS NUMÉRICOS ENTEROS

En Java los representan los tipos: byte, short, int, long.
El tipo de dato numérico entero es un subconjunto finito de los números enteros del mundo real. Pueden ser positivos o negativos.

Ejemplo de declaración de variables enteras:
int a;
byte n1, n2;
short x;


DATOS NUMÉRICOS REALES

En Java los representan los tipos: float, double.

El tipo de dato numérico real es un subconjunto finito de los números reales. Siempre llevan un punto decimal y también pueden ser positivos o negativos. Los números reales tienen una parte entera y una parte decimal.

Por ejemplo: 0.08   -54.0001
Ejemplo de declaración de variables reales:
float peso;
double longitud;
float altura = 2.5F;
double area = 1.7E4; // equivale a 1.7 * 104
double z = .123; //si la parte entera es 0 se puede omitir


DATOS DE TIPO CARÁCTER

En Java se representa con el tipo char.

Un dato de tipo carácter se utiliza para representar un carácter dentro del rango \u0000 a \uFFFF (números desde 0 hasta 65535) en Unicode.
En realidad un dato de tipo char contiene un número entero dentro del rango anterior que representa un carácter.
En Java se utiliza el código Unicode para la representación de caracteres. Este código actualmente representa los caracteres de la mayoría de idiomas escritos en todo el mundo.

Los 127 primeros caracteres de Unicode corresponden al código ASCII.

El código UNICODE proporciona una única representación numérica para cada símbolo, independientemente del ordenador, el programa o el lenguaje de programación que se use.
La codificación Unicode se ha transformado en un estándar adoptado por las principales empresas de hardware y software. Java utiliza la codificación Unicode.

Ejemplo de declaración de variables de tipo carácter:
char car;
char letra1 = 'z';
char letra = '\u0061'; //código unicode del carácter ‘a’


DATOS DE TIPO LÓGICO
Se representan con el tipo boolean.
Los datos de este tipo sólo pueden contener dos valores: true (verdadero) ó false (falso).

Ejemplo de declaración de variables lógicas:
boolean primero;
boolean par = false;
Los tipos de datos lógicos son también conocidos como booleanos en honor del matemático inglés George Bool, que desarrolló la teoría conocida como álgebra de bool que fue la base para la representación de los circuitos lógicos.

IDENTIFICADORES JAVA


Los identificadores son los nombres que el programador asigna a variables, constantes, clases, métodos, paquetes, etc. de un programa.

Características de un identificador Java:

J  Están formados por letras y dígitos.
J  No pueden empezar por un dígito.
J  No pueden contener ninguno de los caracteres especiales vistos en una entrada anterior.
J  No puede ser una palabra reservada de Java. Las palabras reservadas en Java son todas las que aparecen en el punto siguiente.


Ejemplo de identificadores válidos:

Edad      nombre     _Precio     
$cantidad       PrecioVentaPublico

Ejemplo de identificadores no válidos:
4num      z#      “Edad”

Java diferencia mayúsculas y minúsculas, por lo tanto, nombre y Nombre son identificadores diferentes.



PALABRAS RESERVADAS DE JAVA

Las palabras reservadas son identificadores predefinidos que tienen un significado para el compilador y por tanto no pueden usarse como identificadores creados por el usuario en los programas.

Las palabras reservadas en Java ordenadas alfabéticamente son las siguientes:


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


Sintaxis del lenguaje

El lenguaje se basa en pensar que hay en el mundo real objetos y esos objetos tienen un tipo, o clase. Por ello el lenguaje se basa en clases, que describen como son los objetos. Por ejemplo, el lenguaje tiene una clase que describe ficheros, una que describe cadenas de texto, o bien nosotros podemos crear clases, como por ejemplo la clase Persona que describe los datos que interesan de una persona.

Por ello siempre para comenzar a trabajar con un programa java hay que crear una clase:

         public class TablaMultiplicar{
         }
        
Además se deben de cumplir las siguientes características:

Ø  La clase se debe de llamar exactamente igual que el fichero que la contiene.
Ø  La clase que se llama igual que el fichero debe de estar precedida de la palabra public.
Ø  Cuando se intenta ejecutar una clase java la máquina virtual lo que hace es llamar a un método especial llamado main que debe de estar dentro de la clase a ejecutar:

         public class TablaMultiplicar{
              public static void main(String arg[]){
              }
         }
        
Y es dentro de la función main donde escribiremos el código que queremos que se ejecute:

         public class TablaMultiplicar{
              public static void main(String arg[]){
                    int numero = Integer.parseInt(arg[0]);
                    for(int i = 1 ; i<=10 ; i++){
                         System.out.println(""+numero+" * "+i+" = "+(i*numero));
                    }
              }
         }



ESTRUCTURAS DE CONTROL EN JAVA


Las estructuras de control determinan la secuencia de ejecución de las sentencias de un programa.
Las estructuras de control se dividen en tres categorías:

  •  Secuencial
  •  Condicional o Selectiva
  •  Iterativa o Repetitiva.

ESTRUCTURA SECUENCIAL

El orden en que se ejecutan por defecto las sentencias de un programa es secuencial. Esto significa que las sentencias se ejecutan en secuencia, una después de otra, en el orden en que aparecen escritas dentro del programa.
La estructura secuencial está formada por una sucesión de instrucciones que se ejecutan en orden una a continuación de la otra.
Cada una de las instrucciones están separadas por el carácter punto y coma (;).
Las instrucciones se suelen agrupar en bloques.
El bloque de sentencias se define por el carácter llave de apertura ({) para marcar el inicio del mismo, y el carácter llave de cierre (}) para marcar el final.
Ejemplo:
{
instrucción 1;
instrucción 2;
instrucción 3;
}
En Java si el bloque de sentencias está constituido por una única sentencia no es obligatorio el uso de las llaves de apertura y cierre ({ }), aunque sí recomendable.


ESTRUCTURA CONDICIONAL, ALTERNATIVA O SELECTIVA

La estructura condicional determina si se ejecutan unas instrucciones u otras según se cumpla o no una determinada condición.
En java la estructura condicional se implementa mediante:

  • Instrucción if.
  • Instrucción switch.
  • Operador condicional ? :

INSTRUCCION if

Puede ser del tipo:

  • Condicional simple: if
  • Condicional doble: if ... else ...
  • Condicional múltiple: if .. else if ..

La condición debe ser una expresión booleana es decir debe dar como resultado un valor booleano (true ó false).

Condicional simple: se evalúa la condición y si ésta se cumple se ejecuta una determinada acción o grupo de acciones. En caso contrario se saltan dicho grupo de acciones.
         if(expresión_booleana){
            instrucción 1
            instrucción 2
            .......
         }
Si el bloque de instrucciones tiene una sola instrucción no es necesario escribir las llaves { } aunque para evitar confusiones se recomienda escribir las llaves siempre.


Condicional doble:
Se evalúa la condición y si ésta se cumple se ejecuta una determinada instrucción o grupo de instrucciones. Si no se cumple se ejecuta otra instrucción o grupo de instrucciones.

           if(expresión booleana){
              instrucciones 1
           }
           else{
                  instrucciones 2
           }


Condicional múltiple:

Se obtiene anidando sentencias if ... else. Permite construir estructuras de selección más complejas.
if (expresion_booleana1)
instruccion1;
else if (expresion_booleana2)
instruccion2;
       else
instruccion3;
Cada else se corresponde con el if más próximo que no haya sido emparejado.
Una vez que se ejecuta un bloque de instrucciones, la ejecución continúa en la siguiente instrucción que aparezca después de las sentencias if .. else anidadas.


ESTRUCTURA ITERATIVA O REPETITIVA

Permiten ejecutar de forma repetida un bloque específico de instrucciones.
Las instrucciones se repiten mientras o hasta que se cumpla una determinada condición. Esta condición se conoce como condición de salida.
Tipos de estructuras repetitivas:
-               ciclo while
-               ciclo do – while
-               ciclo for


CICLO WHILE

Las instrucciones se repiten mientras la condición sea cierta. La condición se comprueba al principio del bucle por lo que las acciones se pueden ejecutar 0 ó más veces.

La ejecución de un bucle while sigue los siguientes pasos:

1)     Se evalúa la condición.
2)     Si el resultado es false las instrucciones no se ejecutan y el programa sigue ejecutándose por la siguiente instrucción a continuación del while.
3)     Si el resultado es true se ejecutan las instrucciones y se vuelve al paso 1

CICLO DO – WHILE

Las instrucciones se ejecutan mientras la condición sea cierta.
La condición se comprueba al final del bucle por lo que el bloque de instrucciones se ejecutarán al menos una vez. Esta es la diferencia fundamental con la instrucción while. Las instrucciones de un bucle while es posible que no se ejecuten si la condición inicialmente es falsa.
La ejecución de un bucle do - while sigue los siguientes pasos:
1)     Se ejecutan las instrucciones a partir de do{
2)     Se evalúa la condición.
3)     Si el resultado es false el programa sigue ejecutándose por la siguiente instrucción a continuación del while.
4)     Si el resultado es true se vuelve al paso 1

5)  DO WHILE (Condición)
6)        (Bloque de sentencias)
7)     LOOP


CICLO FOR

            Hace que una instrucción o bloque de instrucciones se repitan un número determinado de veces mientras se cumpla la condición.
La estructura general de una instrucción for en Java es la siguiente:

for(inicialización; condición; incremento/decremento){
instrucción 1;
...........
instrucción N;
}
A continuación de la palabra for y entre paréntesis debe haber siempre tres zonas separadas por punto y coma:


  • zona de inicialización.
  • zona de condición
  • zona de incremento ó decremento.

Si en alguna ocasión no es necesario escribir alguna de ellas se pueden dejar en blanco, pero los dos puntos y coma deben aparecer.
Inicialización es la parte en la que la variable o variables de control del bucle toman su valor inicial. Puede haber una o más instrucciones en la inicialización, separadas por comas. La inicialización se realiza solo una vez.
Condición es una expresión booleana que hace que se ejecute la sentencia o bloque de sentencias mientras que dicha expresión sea cierta. Generalmente en la condición se compara la variable de control con un valor límite.
Incremento/decremento es una expresión que decrementa o incrementa la variable de control del bucle.

La ejecución de un bucle for sigue los siguientes pasos:

1)     Se inicializa la variable o variables de control (inicialización)
2)     Se evalúa la condición.
3)     Si la condición es cierta se ejecutan las instrucciones. Si es falsa, finaliza la ejecución del bucle y continúa el programa en la siguiente instrucción después del for.
4)     Se actualiza la variable o variables de control (incremento/decremento)
5)     Se vuelve al punto 2.


BUCLES INFINITOS EN JAVA

Java permite la posibilidad de construir bucles infinitos, los cuales se ejecutarán indefinidamente, a no ser que provoquemos su interrupción. Tres ejemplos:

for(;;){
    instrucciones
}
for(;true;){
     instrucciones
}
while(true){
        instrucciones
}


BUCLES ANIDADOS

Bucles anidados son aquellos que incluyen instrucciones for, while o do-while unas dentro de otras.
Debemos tener en cuenta que las variables de control que utilicemos deben ser distintas.
Los anidamientos de estructuras tienen que ser correctos, es decir, que una estructura anidada dentro de otra lo debe estar totalmente.

 Opinión personal:

Hay mucho que decir sobre la programación en Java y es muy interesante cada vez que se va descubriendo todas sus propiedades y las funciones que cada una de ellas representa. Para ello es necesario analizar cada uno de los conceptos y estudiarlos detenidamente, además de ejercitarlos diariamente para así tener el suficiente conocimiento para ser un buen programador. Realmente dedicando su debido tiempo se van aclarando las dudas y todo empieza a ser un poco más fácil. Esto me recuerda que Roma no se hizo en un día, pero con perseverancia, paciencia, y algunas otras cosas más todo se puede lograr.