Se puede declarar que una clase sea final; esto es, que la clase no pueda tener subclases. Existen (al menos) dos razones por las que se querr�a hacer esto: razones de seguridad y de dise�o.
Seguridad: Un mecanismo que los hackers utilizan para atacar sistemas es crear subclases de una clase y luego sustituirla por el original. Las subclases parecen y sienten como la clase original pero hacen cosas bastante diferentes, probablemente causando da�os u obteniendo informaci�n privada. Para prevenir esta clase de subversi�n, se puede declarar que la clase sea final y as� prevenir que se cree cualquier subclase.
La clase String del paquete java.lang es una clase final s�lo por esta raz�n. La clase String es tan vital para la operaci�n del compilador y del int�rprete que el sistema Java debe garantizar que siempre que un m�todo o un objeto utilicen un String, obtenga un objeto java.lang.String y no alg�n otro string. Esto asegura que ning�n string tendr� propiedades extra�as, incosistentes o indeseables.
Si se intenta compilar una subclase de una clase final, el compilador mostrar� un mensaje de error y no compilar� el programa. Adem�s, los bytescodes verifican que no est� teniendo lugar una subversi�n, al nivel de byte comprobando que una clase no es una subclase de una clase final.
Dise�o: Otra raz�n por la que se podr�a querer declarar una clase final son razones de dise�o orientado a objetos. Se podr�a pensar que una clase es "perfecta" o que, conceptualmente hablando, la clase no deber�a tener subclases.
Para especificar que una clase es una clase final, se utiliza la palabra clave final antes de la palabra clave class en la declaraci�n de la clase. Por ejemplo, si quisieramos declarar AlgoritmodeAjedrez como una clase final (perfecta), la declaraci�n se parecer�a a esto.
final class AlgoritmodeAjedrez { . . . }
Cualquier intento posterior de crear una subclase de AlgoritmodeAjedrez resultar� en el siguiente error del compilador.
Chess.java:6: Can't subclass final classes: class AlgoritmodeAjedrez class MejorAlgoritmodeAjedrez extends AlgoritmodeAjedrez { ^ 1 error
�M�todos Finales
Si la creacci�n de clases finales parece algo dura para nuestras necesidades, y realmente lo que se quiere es proteger son algunos m�todos de una clase para que no sean sobreescritos, se puede utilizar la palabra clave final en la declaraci�n de m�todo para indicar al compilador que este m�todo no puede ser sobreescrito por las subclases.
Se podr�a desear hacer que un m�todo fuera final si el m�todo tiene una implementaci�n que no debe ser cambiada y que es cr�tica para el estado consistente del objeto. Por ejemplo, en lugar de hacer AlgoritmodeAjedrez como una clase final, podr�amos hacer siguienteMovimiento() como un m�todo final.
class AlgoritmodeAjedrez { . . . final void siguienteMovimiento(Pieza piezaMovida, PosicionenTablero nuevaPosicion) { } . . . }