Declarar Clases

Ahora que ya sabemos como crear, utilizar y destruir objetos, es hora de aprender cómo escribir clases de las que crear esos objetos.

Una clase es un proyecto o prototipo que se puede utilizar para crear muchos objetos. La implementación de una clase comprende dos componentes: la declaración y el cuerpo de la clase:

DeclaraciónDeLaClase {
    CuerpoDeLaClase
}

La Declaración de la Clase

Como mínimo, la declaración de una clase debe contener la palabra clave class y el nombre de la clase que está definiendo. Así la declaración más sencilla de una clase se parecería a esto:
class NombredeClase {
    . . .
}
Por ejemplo, esta clase declara una nueva clase llamada NumeroImaginario:
class NumeroImaginario {
    . . .
}
Los nombres de las clases deben ser un identificador legal de Java y, por convención, deben empezar por una letra mayúscula. Muchas veces, todo lo que se necesitará será una declaración mínima. Sin embargo, la declaración de una clase puede decir más cosas sobre la clase. Más especificamente, dentro de la declaración de la clase se puede:
  • declarar cual es la superclase de la clase.
  • listar los interfaces implementados por la clase
  • declarar si la clase es pública, abstracta o final

Declarar la Superclase de la Clase

En Java, todas las clases tienen una superclase. Si no se especifica una superclase para una clase, se asume que es la clase Object (declarada en java.lang). Entonces la superclase de NumeroImaginario es Object porque la declaración no explicitó ninguna otra clase. Para obtener más información sobre la clase Object, puede ver La clase Object.

Para especificar explícitamente la superclase de una clase, se debe poner la palabra clave extends más el nombre de la superclase entre el nombre de la clase que se ha creado y el corchete abierto que abre el cuerpo de la clase, así:

class NombredeClase extends NombredeSuperClase {
    . . .
}
Por ejemplo, supon que quieres que la superclase de NumeroImaginario sea la clase Number en vez de la clase Object. Se podróa escribir esto:
class NumeroImaginario extends Number {
    . . .
}
Esto declara explícitamente que la clase Number es la superclase de NumeroImaginario. (La clase Number es parte del paquete java.lang y es la base para los enteros, los números en coma flotante y otros números).

Declarar que Number es la superclase de NumeroImaginario declara implícitamente que NumeroImaginario es una subclase de Number. Una subclase hereda las variables y los métodos de su superclase.

Crear una subclase puede ser tan sencillo como incluir la clausula extends en su declaración de clase. Sin embargo, se tendrán que hacer otras provisiones en su código cuando se crea una subclase, como sobreescribir métodos. Para obtener más información sobre la creacción de subclases, puede ver Subclases, Superclases, y Herencia.

Listar los Interfaces Implementados por la Clase

Cuando se declara una clase, se puede especificar que interface, si lo hay, está implementado por la clase. Pero, ¿Qué es un interface? Un interface declara un conjunto de métodos y constantes sin especificar su implementación para ningún método. Cuando una clase exige la implementación de un interface, debe proporcionar la implementación para todos los métodos declarados en el interface.

Para declarar que una clase implementa uno o más interfaces, se debe utilizar la palabra clave implements seguida por una lista de los interfaces implementados por la clase delimitada por comas. Por ejemplo, imagina un interface llamado Aritmetico que define los métodos llamados suma(), resta(), etc... La clase NumeroImaginario puede declarar que implementa el interface Aritmetico de esta forma:

class NumeroImaginario extends Number implements Aritmetico {
    . . .
}
se debe garantizar que propociona la implementación para los métodos suma(), resta() y demás métodos declarados en el interface Aritmetico. Si en NumeroImaginario falta alguna implementación de los métodos definidos en Aritmetico, el compilador mostrará un mensaje de error y no compilará el programa:
nothing.java:5: class NumeroImaginario must be declared abstract. It does not define 
java.lang.Number add(java.lang.Number, java.lang.Number) from interface Aritmetico.
class NumeroImaginario extends Number implements Aritmetico {
      ^
Por convención, la clausula implements sigue a la clausula extends si ésta existe.

Observa que las firmas de los métodos declarados en el interface Aritmetico deben corresponder con las firmas de los métodos implementados en la clase NumeroImaginario. Tienes más información sobre cómo crear y utilizar interfaces en Crear y Utilizar Interfaces.

Clases Public, Abstract, y Final

Se puede utilizar uno de estos tres modificadores en una declaración de clase para declarar que esa clase es pública, abstracta o final. Los modificadores van delante de la palabra clave class y son opcionales.

El modificador public declara que la clase puede ser utilizada por objetos que estén fuera del paquete actual. Por defecto, una clase sólo puede ser utiliza por otras clases del mismo paquete en el que están declaradas.

public class NumeroImaginario extends Number implements Aritmetico {
    . . .
}
Por convención, cuando se utiliza la palabra public en una declaración de clase debemos asegurarnos de que es el primer item de la declaración.

El modificador abstract declara que la clase es una clase abstracta. Una clase abstracta podría contener métodos abstractos (métodos sin implementación). Una clase abstracta está diseñada para ser una superclase y no puede ejemplarizarse. Para una discusión sobre las clases abstractas y cómo escribirlas puedes ver Escribir Clases y Métodos Abstractos.

Utilizando el modificador final se puede declarar que una clase es final, que no puede tener subclases. Existen (al menos) dos razones por las que se podría querer hacer esto: razones de seguridad y razones de diseño. Para un mejor explicaión sobre las clases finales puedes ver Escribir Clases y Métodos Finales.

Observa que no tiene sentido para una clase ser abstracta y final. En otras palabras, una clase que contenga métodos no implementados no puede ser final. Intentar declarar una clase como final y abstracta resultará en un error en tiempo de compilación.

Sumario de la Daclaración de una Clase

En suma, una declaración de clase se parecería a esto:
[ modificadores ] class NombredeClase [ extends NombredeSuperclase ]
 [ implements NombredeInterface ] {
    . . .
}
Los puntos entre [ y ] son opcionales. Una declaración de clase define los siguientes aspectos de una clase:
  • modificadores declaran si la clase es abstracta, pública o final.
  • NombredeClase selecciona el nombre de la clase que está declarando
  • NombredeSuperClase es el nombre de la superclase de NombredeClase
  • NombredeInterface es una lista delimitada por comas de los interfaces implementados por NombredeClase
De todos estos items, sólo la palabra clave class y el nombre de la clase son necesarios. Los otros son opcionales. Si no se realiza ninguna declaración explícita para los items opcionales, el compilador Java asume ciertos valores por defecto (una subclase de Object no final, no pública, no obstracta y que no implementa interfaces).


Ozito