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