martes, 29 de abril de 2014

4.2 Declaración de Clases y Modificadores


CLICK AQUI PARA REGRESAR AL ÍNDICE

El siguiente código es la mas simple declaración de una clase:

class MyClass {  }

Este código compila correctamente, pero tu puedes ademas agregar modificadores antes de la declaración de la clase. Los modificadores caen en dos categorías:

  • Modificadores de Acceso: public, protected, private
  • Modificadores de No-Acceso (incluyen strictfp, final, y abstract)

1. ACCESO A UNA CLASE (CLASS ACCESS)
  • Crear un instancia de la clase B.
  • Extender la clase B (en otras palabras, convertirse en una subclase de la clase B)
  • Acceder a ciertos métodos y variables dentro de la clase B, dependiendo del acceso que tengan esas variables y métodos.

Primero veremos los Modificadores de Acceso, donde aprenderas como restringir o permitir el acceso a una clase que hayas creado. 
Los Modificadores de Acceso son un poco tramposos en Java, pues hay cuatro controles de acceso (niveles de acceso), pero solo existen tres modificadores de acceso. El cuarto nivel de control de acceso (llamado default o package access) es cuando no usas ninguno de los tres modificadores de acceso, es decir cuando dejas en blanco el modificador de acceso de la clase.

Pero tenemos que tener en cuenta que para una clase, solo se pueden usar dos modificadores de acceso, el public y el default access.

¿Que significa acceder a una clase?

     Cuando decimos que el cogido de una clase A tiene acceso a otra clase B, esto significa que la clase A        puede hacer tres de las siguientes cosas:

2. MODIFICADORES DE ACCESO PARA UNA CLASE

2.1 DEFAULT ACCESS

Una clase con default access no tiene modificadores precediéndola en su declaración. Piensa en default access como un acceso de nivel de paquete, porque una clase con default access  puede ser solo vista por clases dentro del mismo paquete.
Por ejemplo, si una clase A y una clase B están en diferentes paquetes, y la clase A tiene default access, la clase B no podrá crear instancias de la clase A, o incluso declarar una variable o retornar una tipo clase A.
Observa en siguiente fragmento de código:

package cert;      
class Beverage {  }
Ahora observa el segundo código fuente:
package exam.stuff;
import cert.Beverage;
class Tea extends Beverage {  }

Como puedes ver, la superclase (Beverage) está en un paquete diferente de la subclase (Tea). La sentencia import al principio del archivo Tea está tratando (con los dedos cruzados) de importar la clase Beverage. El archivo Beverage compila perfectamente, pero cuando se trata de compilar el archivo Tea obtenemos algo como lo siguiente:

Can’t Access class cert.Beverage. Class or interface must be public, in same package or an accesible member class.

El archivo Tea no compila porque su superclase Beverage, tiene default access y está en un paquete diferente.

2.2 PUBLIC ACCESS

Una clase declarada con la palabra reservada public le da a toda las clases de todos los paquetes , acceso a esta public class. En otras palabras, todas las clases del Universo Java (JU) tienen acceso a una public class. No se debe olvidar que para usar una clase publica en un paquete diferente de donde la public class  se encuentra, se debe de importar esta public class usando la sentencia import.

En el ejemplo de la sección anterior, nosotros podemos no querer poner la subclase en el mismo paquete que la superclase, entonces para hacer que el código funcione, necesitamos agregar la palabra reservada public delante de la declaración de la superclase (Beverage). Como se muestra:

package cert;
public class Beverage {  }

Este cambio hace que la clase Beverage pueda ser accesible por todas las clases de todos los paquetes. Y de esta forma ambos archivos compilaran perfectamente.

3. OTROS (Nonaccess) MODIFICADORES DE CLASES

Puedes modificar la declaración de una clase usando las palabras reservadas final, abstract, o strictfp. Esos modificadores son una adición a cualquier control de acceso de una clase, entonces puedes por ejemplo, declarar una clase con los modificadores public y final y no habría ninguna problema. Pero no siempre se puede combinar los Modificadores Nonacces. Puedes combinar strictfp con final, por ejemplo, pero nunca debes marcar una clase con final y abstract. Veraz por que más adelante.

No necesitas conocer como trabaja strictfp, asi que nos centraremos únicamente en los modificadores final y abstract. Para el examen solo necesitas saber que strictfp es una palabra reservada que puede ser usada como modificador en una clase o un método, pero nunca en una variable.

3.1 MODIFICADOR FINAL PARA CLASES

Cuando se usa en una declaración de una clase, la palabra reservada final esto significa que esta clase no puede tener subclases. En otras palabras ninguna otra clase puede nunca extenderse (heredar) de una final class, y cualquier intento de hacerlo, solo terminara en un error de compilación.

Pero entonces, ¿por qué marcar a una clase con final? Después de todo, ¿eso no viola el paradigma Orientado a Objetos en cuento a la herencia? Bueno tú debes marcar una clase con final, únicamente si necesitas una absoluta garantía de que ninguno de los métodos de esa clase será sobrescrito (overridden). Si tú dependes profundamente de la implementación de ciertos métodos, entonces usando el modificador final te dará la seguridad de que nadie podrá cambiar la implementación hecha por ti.

Modifiquemos nuestra clase de ejemplo Beverage, agregando la palabra reservada final en la declaración:

package cert;
public final class Beverage { 
            public void unMetodoImportantisimo() {  }
}

Ahora, si tratamos de compilar la clase Tea:
package exam.stuff;
import cert.Beverage;
class Tea extends Beverage {  }

Obtendremos un error algo así:

Can´t subclass final clases: Class
cert.Beverage class Tea extends Beverage {
1 error

3.2 MODIFICADOR ABSTRACT PARA CLASES

Una clase abstracta nunca puede ser instanciada. Es su único propósito, misión en la vida, ser extendida (que otras clases hereden de ella).

¿Entonces por qué una haríamos una clase si no podemos crear objetos de ella? Porque la clase probablemente sea demasiada abstracta. Por ejemplo, imagina que tienes una clase Car, con métodos genéricos y comunes para todos los vehículos. Pero en realidad no se quiere que alguien pueda crear objetos genéricos y abstractos de la clase Car, porque simplemente es demasiado abstracto.

Observa el siguiente fragmento de código de una clase abstracta:

Abstract class Car{
           
            private double price;
            private double model;
private double year;
public abstract void goFast();
public abstract void goUpHill();
public abstract void impressNeighbors();

public void goBackHome(){
            int variebleSample;
}
}

El código anterior compilara perfectamente. Ademas, si intentamos instanciar un objeto de la clase Car en otro fragmento de código, se obtendrá un error de compilación, como el siguiente:

AnotherClass.java: 7: class Car is an abstract class.
It can’t be instantiated.
            Car x = new Car();
1 error

Nota que los métodos marcados con abstract terminan en un punto y coma, en lugar de corchetes.
Si un método de una clase esta marcado como abstract, entonces la clase entera debe ser marcada com abstract, sino se obtendrá un error de compilación. Además como se ve en el ejemplo, dentro de una clase abstracta pueden ir métodos no abstractos, para de esta forma poder hacer uso de la herencia en los métodos. Todo esto se verá más adelante en detalle.






No hay comentarios:

Publicar un comentario

Datos personales