miércoles, 14 de septiembre de 2011

12 .- Especificadores de Acceso

Modificadores (public, protected y private)

Se trata de una palabra que antecede a la declaración de una clase, método o propiedad de clase. Hay tres posibilidades: public, protected y private. Una cuarta posibilidad es no utilizar ninguna de estas tres palabras; entonces se dice que se ha utilizado el modificador por defecto (friendly).
Los especificadores determinan el alcance de la visibilidad del elemento al que se refieren. Referidos por ejemplo a un método, pueden hacer que el método sea visible sólo para la clase que lo utiliza (private), para éstas y las heredadas (protected), para todas las clases del mismo paquete (friendly) o para cualquier clase del tipo que sea (public).

En la siguiente tabla se puede observar la visibilidad de cada especificador:




Modificadores static y final.

Un atributo de una clase se puede modificar con la palabra reservada static, con ello indicamos que el atributo no pertenece a las instancias de la clase si no a la propia clase. Que quiere decir esto?, pues que no existe una copia de ese atributo en cada uno de los objetos de la clase, si no que existe una unica copia que es compartida por todos los objetos de la clase. Por ello, a los atributos
static se les llama atributos de la clase. Una consecuencia de lo anterior es que para acceder a los atributos static de una clase no necesitamos crear una instancia de la clase, podemos acceder a
ellos a través del nombre de la clase.

De igual modo, podemos modificar los métodos de una clase con la palabra reserva static. A estos métodos se les llaman métodos de la clase, y, al igual que con los atributos static, podemos usarlos a través del nombre de la clase, sin necesidad de crear ninguna instancia de la clase. Pero existe una restricción, los métodos estáticos de una clase solo pueden acceder a atributos estáticos u otros
métodos estáticos de la clase, pero nunca a atributos o métodos que no lo sean. Ves porque? Que ocurrir a si desde un método estático y usando el nombre de la clase intentases acceder a un atributo de instancia de la clase? 
En el siguiente ejemplo de código hemos añadido un contador para saber el numero de instancias de la clase Persona que se han creado:

 package tipos ;

 public class Persona implements Contacto {
             private String nombre ;
         private String apellidos ;
         private String telefono ;
         private static nInstancias ;

 publ ic Persona ( ) {
         super ( ) ;
         iniciaAtributos( ) ;
 }

 public static int getNInstancias( ) {
         return  nInstancias ;
 }

Fjate que el metodo getNInstancias() que accede al atributo nInstancias es estático. En el siguiente ejemplo de código se est a utilizando este método estático a través del nombre de la clase y a través de una instancia concreta:



 publ ic f inal class Principal {
       private Pr i n c i p a l ( ) {
       super ( ) ;
 }

  private void e j e cu t a ( ) {
    Persona unaPersona = new Persona ( ) ;

 // Accedemos al método a través de la clase

 System.out.p r i n t l n ( " Numero de Personas Creadas : " + Persona.getNInstancias ( ) ) ;

 Persona otraPersona = new Persona ( " James " , " Bond " , " 555 123 456 " ) ;

 // Accedemos al método a través de una instancia concreta

Cuando un atributo de una clase los modificamos en su definición con la palabra reservada final, estamos indicando que ese atributo no puede cambiar de valor, por ejemplo:

 private f inal String autor = " Oscar " ;

Una vez definido, este atributo no puede cambiar de valor, si lo intentásemos cambiar el compilador nos dará un error.
Muchas veces los modificadores static y final se utilizan en combinación para definir constantes, como en el siguiente ejemplo:

 publ ic clas s Constantes {
 public static final double PI = 3 . 1 4 1 5 9 2 ;
 . . .
 g

De este modo, la constante es accesible desde cualquier otra clase (al ser public) y podemos leerla a través del nombre de la clase de este modo Constantes.PI, pero si por descuido intentamos modificarla, el compilador de Java nos dar a un error.




11.- Objetos

Objetos 

Se les llama instancias de clase. Son un elemento en sí de la clase (en el ejemplo del parchís, una ficha en concreto). Un objeto se crea utilizando el llamado constructor de la clase. El constructor es el método que permite iniciar el objeto.

Datos miembro (propiedades o atributos)

Para poder acceder a los atributos de un objeto, se utiliza esta sintaxis:

                           objeto.atributo
Por ejemplo:
                           Noria.radio;

Métodos

Los métodos se utilizan de la misma forma que los atributos, excepto porque los métodos poseen siempre paréntesis, dentro de los cuales pueden ir valores necesarios para la ejecución del método (parámetros):

                         objeto.método(argumentosDelMétodo)

Los métodos siempre tienen paréntesis (es la diferencia con las propiedades) y dentro de los paréntesis se colocan los argumentos del método. Que son los datos que necesita el método para funcionar. 
Por ejemplo:
                         MiNoria.gira(5);

Lo cual podría hacer que la Noria avance a 5 Km/h.

Herencia

En la POO tiene mucha importancia este concepto, la herencia es el mecanismo que permite crear clases basadas en otras existentes. Se dice que esas clases descienden de las primeras. Así por ejemplo, se podría crear una clase llamada vehículo cuyos métodos serían mover, parar, acelerar y frenar. Y después se podría crear una clase coche basada en la anterior que tendría esos mismos métodos (les heredaría) y además
añadiría algunos propios, por ejemplo abrirCapó o cambiarRueda.

Creación de objetos de la clase

Una vez definida la clase, se pueden utilizar objetos de la clase. Normalmente consta de dos pasos. Su declaración, y su creación. La declaración consiste en indicar que se va a utilizar un objeto de una clase determinada. Y se hace igual que cuando se declara una variable simple. 
Por ejemplo:
                            Noria noriaDePalencia;

Eso declara el objeto noriaDePalencia como objeto de tipo Noria; se supone que previamente se ha definido la clase Noria.

Para poder utilizar un objeto, hay que crearle de verdad. Eso consiste en utilizar el operador new.

 Por ejemplo:
                         noriaDePalencia = new Noria();

Al hacer esta operación el objeto reserva la memoria que necesita y se inicializa el objeto mediante su constructor. Más adelante veremos como definir el constructor.


lunes, 12 de septiembre de 2011

10.- Programación Orientada a Objetos

Se ha comentado anteriormente en este manual que Java es un lenguaje totalmente orientado a objetos. De hecho siempre hemos definido una clase pública con un método main que permite que se pueda visualizar en la pantalla el programa Java.
La gracia de la POO es que se hace que los problemas sean más sencillos, al permitir dividir el problema. Está división se hace en objetos, de forma que cada objeto funcione de forma totalmente independiente. Un objeto es un elemento del programa que posee sus propios datos y su propio funcionamiento.
Es decir un objeto está formado por datos (propiedades) y funciones que es capaz de realizar el objeto (métodos).
Antes de poder utilizar un objeto, se debe definir su clase. La clase es la definición de un tipo de objeto. Al definir una clase lo que se hace es indicar como funciona un determinado tipo de objetos. Luego, a partir de la clase, podremos crear objetos de esa clase.
Por ejemplo, si quisiéramos crear el juego del parchís en Java, una clase sería la casilla, otra las fichas, otra el dado, etc., etc. En el caso de la casilla, se definiría la clase para indicar su funcionamiento y sus propiedades, y luego se crearía tantos objetos casilla como casillas tenga el juego.
Lo mismo ocurriría con las fichas, la clase ficha definiría las propiedades de la ficha (color y posición por ejemplo) y su funcionamiento mediante sus métodos (por ejemplo un método sería mover, otro llegar a la meta, etc., etc., ), luego se crearían tantos objetos ficha, como fichas tenga el juego.

Propiedades de la POO

  • Encapsulamiento. El  mecanismo  de  herencia  permite  definir  nuevas  clases  partiendo  de  otras  ya existentes.  Las  clases  que  derivan  de  otras  heredan  automáticamente  todo  su
    comportamiento, pero además pueden introducir características particulares propias que
    las diferencian.
  • Ocultación. Hay una zona oculta al definir la clases (zona privada) que sólo es utilizada por esa clases y por alguna clase relacionada. Hay una zona pública (llamada también interfaz de la clase) que puede ser utilizada por cualquier parte del código.
  • Polimorfismo. Cada método de una clase puede tener varias definiciones distintas. En el caso del parchís: partida.empezar(4) empieza una partida para cuatro jugadores, partida.empezar(rojo, azul) empieza una partida de dos jugadores para los colores rojo y azul; estas son dos formas distintas de emplear el método empezar, que es polimórfico.
  • Herencia. Una clase puede heredar propiedades de otra.
Introducción al Concepto de Objeto

Un objeto es cualquier entidad representable en un programa informático, bien sea real (ordenador) o bien sea un concepto (transferencia). Un objeto en un sistema posee: una identidad, un estado y un comportamiento.
El estado marca las condiciones de existencia del objeto dentro del programa. Lógicamente este estado puede cambiar. Un coche puede estar parado, en marcha, estropeado, funcionando, sin gasolina, etc.
El comportamiento determina como responde el objeto ante peticiones de otros objetos. Por ejemplo un objeto conductor puede lanzar el mensaje arrancar a un coche.  El comportamiento determina qué es lo que hará el objeto. 
La identidad determina que cada objeto es único aunque tengan el mismo valor.
No existen dos objetos iguales. Lo que sí existe es dos referencias al mismo objeto.
Los objetos se manejan por referencias, existirá una referencia a un objeto. De modo que esa referencia permitirá cambiar los atributos del objeto. Incluso puede haber varias referencias al mismo objeto, de modo que si una referencia cambia el estado del objeto, el resto (lógicamente) mostrarán esos cambios.
Los objetos por valor son los que no usan referencias y usan copias de valores concretos. En Java estos objetos son los tipos simples: int, char, byte, short, long, float, double y boolean. El resto son todos objetos (incluidos los arrays y Strings).

Clases

Las clases son las plantillas para hacer objetos. Una clase sirve para definir una serie de objetos con propiedades (atributos), comportamientos (operaciones o métodos), y semántica comunes. Hay que pensar en una clase como un molde. A través de las clases se obtienen los objetos en sí.
Es decir antes de poder utilizar un objeto se debe definir la clase a la que pertenece, esa definición incluye:
  • Sus atributos. Es decir, los datos miembros de esa clase. Los datos pueden ser públicos (accesibles desde otra clase) o privados (sólo accesibles por código de su propia clase. También se las llama campos.
  • Sus métodos. Las funciones miembro de la clase. Son las acciones (u operaciones) que puede realizar la clase.
  • Código de inicialización. Para crear una clase normalmente hace falta realizar operaciones previas (es lo que se conoce como el constructor de la clase).
  • Otras clases. Dentro de una clase se pueden definir otras clases (clases internas, son consideradas como asociaciones dentro de UML).

El formato general para crear una clase en Java es:

                  [acceso] class nombreDeClase {
                   [acceso] [static] tipo atributo1;
                   [acceso] [static] tipo atributo2;
                   [acceso] [static] tipo atributo3;
                   ...
                   [access] [static] tipo método1(listaDeArgumentos) {
                   ...código del método...
                        }
                       ...
                   }

La palabra opcional static sirve para hacer que el método o la propiedad a la que precede se pueda utilizar de manera genérica (más adelante se hablará de clases genéricas), los métodos o propiedades así definidos se llaman atributos de clase y métodos de clase respectivamente. Su uso se verá más adelante. 
Ejemplo;


                   class Noria {
                        double radio;
                        void girar(int velocidad){
                       ...//definición del método
                     }
                        void parar(){...
                   }




Objetos

Se les llama instancias de clase. Son un elemento en sí de la clase (en el ejemplo del parchís, una ficha en concreto). Un objeto se crea utilizando el llamado constructor de la clase. El constructor es el método que permite iniciar el objeto. 

datos miembro (propiedades o atributos)

Para poder acceder a los atributos de un objeto, se utiliza esta sintaxis: 
          objeto.atributo

Por ejemplo:
          Noria.radio;

Métodos

Los métodos se utilizan de la misma forma que los atributos, excepto porque los métodos poseen siempre paréntesis, dentro de los cuales pueden ir valore snecesarios para la ejecución del método (parámetros):

              objeto.método(argumentosDelMétodo)

Los métodos siempre tienen paréntesis (es la diferencia con las propiedades) y dentro de los paréntesis se colocan los argumentos del método. Que son los datos que necesita el método para funcionar.
 Por ejemplo:

              MiNoria.gira(5);

Lo cual podría hacer que la Noria avance a 5 Km/h.

Herencia

En la POO tiene mucha importancia este concepto, la herencia es el mecanismo que permite crear clases basadas en otras existentes. Se dice que esas clases descienden de las primeras. Así por ejemplo, se podría crear una clase llamada vehículo cuyos métodos serían mover, parar, acelerar y frenar. Y después se podría crear una clase coche basada en la anterior que tendría esos mismos métodos (les heredaría) y además
añadiría algunos propios, por ejemplo abrirCapó o cambiarRueda.

Creación de Objetos de la Clase

Una vez definida la clase, se pueden utilizar objetos de la clase. Normalmente consta de dos pasos. Su declaración, y su creación. La declaración consiste en indicar que se va a utilizar un objeto de una clase determinada. Y se hace igual que cuando se declara una 
variable simple. Por ejemplo:

                     Noria noriaDePalencia;

Eso declara el objeto noriaDePalencia como objeto de tipo Noria; se supone que previamente se ha definido la clase Noria.


Para poder utilizar un objeto, hay que crearle de verdad. Eso consiste en utilizar el operador new. Por ejemplo:
                    noriaDePalencia = new Noria();

Al hacer esta operación el objeto reserva la memoria que necesita y se inicializa el objeto mediante su constructor. Más adelante veremos como definir el constructor.




miércoles, 7 de septiembre de 2011

9.- Clase String

Introducción


Para Java las cadenas de texto son objetos especiales. Los textos deben manejarse creando objetos de tipo String.
Ejemplo:

                          String texto1 = “¡Prueba de texto!”;

Las cadenas pueden ocupar varias líneas utilizando el operador de concatenación “+”.

                         String texto2 =”Este es un texto que ocupa “ “varias líneas, no obstante se puede “+
                         “perfectamente encadenar”;
                      
También se pueden crear objetos String sin utilizar constantes entrecomilladas, usando otros constructores:

                         char[] palabra = {‘P’,’a’,’l’,’b’,’r’,’a’};//Array de char
                         String cadena = new String(palabra);
                         byte[] datos = {97,98,99};
                         String codificada = new String (datos, “8859_1”);

En el último ejemplo la cadena codificada se crea desde un array de tipo byte que contiene números que serán interpretados como códigos Unicode. Al asignar, el valor 8859_1 indica la tabla de códigos a utilizar.
comparación entre objetos String.

Los objetos String no pueden compararse directamente con los operadores de comparación. En su lugar se deben utilizar estas expresiones:

   cadena1.equals(cadena2). El resultado es true si la cadena1 es igual a la cadena2. Ambas cadenas son variables de tipo String.

   cadena1.equalsIgnoreCase(cadena2). Como la anterior, pero en este caso no se
tienen en cuenta mayúsculas y minúsculas.

   s1.compareTo(s2). Compara ambas cadenas, considerando el orden alfabético.
Si la primera cadena es mayor en orden alfabético que la segunda devuelve 1, si son iguales devuelve 0 y si es la segunda la mayor devuelve -1. Hay que tener en cuenta que el orden no es el del alfabeto español, sino que usa la tabla ASCII, en esa tabla la letra ñ es mucho mayor que la o.

    s1.compareToIgnoreCase(s2). Igual que la anterior, sólo que además ignora
las mayúsculas (disponible desde Java 1.2)


String.valueOf


Este método pertenece no sólo a la clase String, sino a otras y siempre es un método que convierte valores de una clase a otra. En el caso de los objetos String, permite convertir valores que no son de cadena a forma de cadena.
Ejemplos:
                        String numero = String.valueOf(1234);
                        String fecha = String.valueOf(new Date());

En el ejemplo se observa que este método pertenece a la clase String directamente, no hay que utilizar el nombre del objeto creado (como se verá más adelante, es un método estático).

Métodos de las variables de las cadenas.

Son métodos que poseen las propias variables de cadena. Para utilizarlos basta con
poner el nombre del método y sus parámetros después del nombre de la variable String.

Es decir: variableString.método(argumentos)

length


Permite devolver la longitud de una cadena (el número de caracteres de la cadena):

                        String texto1=”Prueba”;
                        System.out.println(texto1.length());//Escribe 6

Concatenar cadenas

Se puede hacer de dos formas, utilizando el método concat o con el operador +.
Ejemplo:

                        String s1=”Buenos ”, s2=”días”, s3, s4;
                        s3 = s1 + s2;
                        s4 = s1.concat(s2);

charAt

Devuelve un carácter de la cadena. El carácter a devolver se indica por su posición (el primer carácter es la posición 0) Si la posición es negativa o sobrepasa el tamaño de la cadena, ocurre un error de ejecución, una excepción tipo IndexOutOfBounds- Exception.
Ejemplo:
                        String s1=”Prueba”;
                        char c1=s1.charAt(2); //c1 valdrá ‘u’

substring

Da como resultado una porción del texto de la cadena. La porción se toma desde una posición inicial hasta una posición final (sin incluir esa posición final). Si las posiciones indicadas no son válidas ocurre una excepción de tipo IndexOutOfBounds- Exception. Se empieza a contar desde la posición 0.
Ejemplo:
                       String s1=”Buenos días”;
                       String s2=s1.substring(7,10); //s2 = día


indexOf


Devuelve la primera posición en la que aparece un determinado texto en la cadena. En el caso de que la cadena buscada no se encuentre, devuelve -1. El texto a buscar puede ser char o String.
Ejemplo:

                       String s1=”Quería decirte que quiero que te vayas”;
                       System.out.println(s1.indexOf(“que”)); //Da 15

Se puede buscar desde una determinada posición. En el ejemplo anterior:

                       System.out.println(s1.indexOf(“que”,16)); //Ahora da 26

lastIndexOf

Devuelve la última posición en la que aparece un determinado texto en la cadena. Es casi idéntica a la  anterior, sólo que busca desde el final.
Ejemplo:

                       String s1=”Quería decirte que quiero que te vayas”;
                       System.out.println(s1.lastIndexOf(“que”); //Da 26

También permite comenzar a buscar desde una determinada posición.

endsWith


Devuelve true si la cadena termina con un determinado texto.
Ejemplo:
                       String s1=”Quería decirte que quiero que te vayas”;
                       System.out.println(s1.endsWith(“vayas”);     //Da true
startsWith


Devuelve true si la cadena empieza con un determinado texto.

replace


Cambia todas las apariciones de un carácter por otro en el texto que se indique y lo
almacena como resultado. El texto original no se cambia, por lo que hay que asignar el
resultado de replace a un String para almacenar el texto cambiado:

                       String s1=”Mariposa”;
                       System.out.println(s1.replace(‘a’,’e’));    //Da Meripose
                       System.out.println(s1);     //Sigue valiendo Mariposa

replaceAll

Modifica en un texto cada entrada de una cadena por otra y devuelve el resultado. El
primer parámetro es el texto que se busca (que puede ser una expresión regular), el
segundo parámetro es el texto con el que se reemplaza el buscado. La cadena original no
se modifica.


                       String s1=”Cazar armadillos”;
                       System.out.println(s1.replace(“ar”,”er”));     //Da Cazer ermedillos
                       System.out.println(s1);    //Sigue valiendo Cazar armadilos