Una clase es una agrupación de datos (variables o campos) y de funciones (métodos) que operan sobre esos datos.
| public
class Classname |
| { ... // definición de variables y métodos |
| } |
Un
objeto (instance) es un ejemplar concreto de una clase.
Las
características de una clase son las siguientes:
| 1)
Todas las variables y funciones de Java deben pertenecer a una
clase. |
|
2) Si una clase deriva de otra (extends), hereda todas sus variables y métodos. |
|
3)
Java tiene una jerarquía de clases estándar de la que pueden
derivar las clases que crean los usuarios. |
|
4) En Java no hay herencia múltiple. |
|
5) En un fichero se pueden definir varias clases, pero en un fichero no puede haber más que una clase public. |
|
6) Si una clase contenida en un fichero no es public, no es necesario que el fichero se llame como la clase. |
| 7) Los métodos de una clase pueden referirse de modo global al objeto de esa clase al que se aplican por medio de la referencia this. |
|
8) Las clases se pueden agrupar en packages, introduciendo una línea al comienzo del fichero (package packageName;). |
Variables
miembro
Variables miembro de objeto
Variables
miembro de clase (static).
Son aquellas variables propias de la
clase. Se crean anteponiendo la
palabra static a su declaración, y se
suelen utilizar para definir constantes comunes para todos los objetos de la
clase.
Las
variables de clase son lo más parecido que Java tiene a las variables globales
de C/C++.
Variables que no pueden
cambiar su valor a lo largo de la ejecución del programa.
Puede ser considerada como una constante, y equivale a la palabra const
de C/C++.
Java
permite separar la definición de la inicialización de una variable final; es decir, la inicialización puede hacerse más tarde, en
tiempo de ejecución, llamando a métodos o en función de otros datos.
Métodos
(funciones miembro)
Los
métodos son funciones definidas dentro de una clase.
La primera línea de la definición de un método se llama declaración o header; el código comprendido entre las llaves { ... } es el cuerpo o body del método.
| public returnValue functionName(arg1,arg2,...) |
| { // comienzo del método |
| ... // cuerpo de la función |
| } // final del método |
El header consta del cualificador de acceso (public, en este caso), del tipo del valor de retorno, del nombre de la función y de una lista de argumentos explícitos entre paréntesis, separados por comas.
Métodos
que no actúan sobre objetos concretos a través del operador punto.
Los métodos de clase pueden recibir objetos de su clase como argumentos
explícitos, pero no tienen argumento implícito ni pueden utilizar la
referencia this.
Métodos sobrecargados (overloaded).
Métodos
que tienen el mismo nombre, pero que se diferencian por el número y/o tipo de
los argumentos.
Un constructor
es un método que se llama automáticamente cada vez que se crea un objeto de
una clase. La principal misión del
constructor es reservar memoria e inicializar las variables miembro de la clase.
Los constructores no tienen valor de retorno (ni siquiera void) y su nombre es el mismo que el de la clase. Su argumento implícito es el objeto que se está creando.
Una clase tiene varios constructores, que se diferencian por el tipo y número de sus argumentos (métodos sobrecargados). Se llama constructor por defecto al constructor que no tiene argumentos.
Línea
de actuación para evitar que haya variables sin inicializar correctamente, y estos pueden ser static
(para la clase) o de objeto.
Inicializadores de clase (static).
Es un algo parecido a un método que se llama automáticamente al crear la clase. Se diferencia del constructor en que no es llamado para cada objeto, sino una sola vez para toda la clase.
Los tipos primitivos pueden inicializarse directamente con asignaciones en la clase o en el constructor, pero para inicializar objetos o elementos más complicados es bueno utilizar un inicializador, ya que permite gestionar excepciones (situaciones de error) con try... catch.
Los inicializadores static se crean dentro de la clase, como métodos sin nombre, sin argumentos y sin valor de retorno; tan solo es la palabra static y el código entre llaves { ... }.
No llevan la palabra static y se utilizan para las clases anónimas, que por no tener nombre no pueden tener constructor. En este caso, los inicializadores de objeto se llaman cada vez que se crea un objeto de la clase anónima.
Destrucción
de objetos (liberación de memoria)
En
Java no hay destructores como en C++. El sistema se ocupa automáticamente de liberar memoria de
los objetos que ya han perdido la referencia, esto es, objetos que ya no tienen
ningún nombre que permita acceder a ellos, por ejemplo por haber llegado al
final del bloque en el que habían sido definidos, porque a la referencia se le
ha asignado el valor null o porque a la referencia se le ha asignado la dirección
de otro objeto. A esta característica
se le llama recogida de basura
(garbage collection).
Son
métodos que vienen a complementar la labor del garbage collector.
Un finalizador es un método de objeto (no static),
sin valor de retorno (void), sin
argumentos, con nombre de función finalize(),
y que se llama automáticamente cuando se va a destruir un objeto (antes de que
la memoria sea liberada de modo automático por el sistema).
Se utilizan para ciertas operaciones de terminación distintas de liberar
memoria (por ejemplo: cerrar ficheros, cerrar conexiones de red, etc.)
Un package es una agrupación de clases.
Para que una clase pase a
formar parte de un package llamado
pkgName, hay que introducir en ella la sentencia: package
pkgName;
que debe ser la primera sentencia del fichero sin contar comentarios y líneas
en blanco.
Los nombres de los packages
se suelen escribir con minúsculas para distinguirlos de las clases.
Todas las clases que forman
parte de un package deben estar en el
mismo directorio. Los nombres
compuestos de los packages están relacionados con la jerarquía de directorios
en que se guardan las clases. Package
permite que los nombres de las clases de Java sean únicos en Internet y así
evitar conflictos.
Las clases de un package se
almacenan en un directorio con el mismo nombre largo (path) que el package. Por
ejemplo, la clase es.ceir.jgjalon.infor2.ordenar.QuickSort.class debería estar en el directorio
CLASSPATH\es\ceir\jgjalon\infor2\ordenar\QuickSort.class, donde CLASSPATH es una
variable de entorno del PC que establece la posición absoluta de los
directorios en los que hay clases de Java (clases del sistema o de usuario), en
este caso la posición del directorio es en los discos locales del ordenador.
Los packages se utilizan con
las finalidades siguientes:
|
1) Para agrupar clases relacionadas. |
|
2)
Para evitar conflictos de nombres ya que el dominio de nombres de
Java es la Internet. |
|
3) Para ayudar en el control de la accesibilidad de clases y miembros. |
Concepto
de Herencia
Construir una clase a partir
de otra. Para indicar que una clase
deriva de otra se utiliza la palabra extends,
como por ejemplo:
class CirculoGrafico extends Circulo { ... }
Cuando una clase deriva de
otra, hereda todas sus variables y métodos.
Estas funciones y variables miembro pueden ser redefinidas(overridden) en
la clase derivada, que puede también definir o añadir nuevas variables y métodos.
Es la raíz de toda la
jerarquía de clases de Java. Como
consecuencia, todas las clases tienen algunos métodos que han heredado de
Object.
Clases
y métodos abstractos
Una clase abstracta (abstract)
es una clase de la que no se pueden crear objetos.
Su utilidad es permitir que otras clases deriven de ella, proporcionándoles
un marco o modelo que deben seguir y algunos métodos de utilidad general.
Las clases abstractas se declaran anteponiéndoles la palabra abstract,
como por ejemplo
public abstract class Geometria { ... }
Una clase abstract
puede tener métodos que no son abstract,
pero si una clase tiene algún método abstract
es obligatorio que la clase sea abstract.
Clases
y métodos finales
Una clase declarada final
no puede tener clases derivadas. Esto
se puede hacer por motivos de seguridad y también por motivos de eficiencia,
porque cuando el compilador sabe que los métodos no van a ser redefinidos puede
hacer optimizaciones adicionales.
Análogamente, un método
declarado como final no puede ser
redefinido por una clase que derive de su propia clase.
Una interface es un conjunto de declaraciones de métodos (sin definición).
Ejemplo:
![]()