Cómo evitar la herencia en Java utilizando la palabra clave Final

Si bien uno de los puntos fuertes de Java es el concepto de herencia, en el que una clase puede derivarse de otra, a veces es deseable evitar la herencia de otra clase. Para evitar la herencia, use la palabra clave "final" al crear la clase.

Por ejemplo, si es probable que otros programadores usen una clase, es posible que desee evitar la herencia si alguna de las subclases creadas puede causar problemas. Un ejemplo típico es la clase String. Si quisiéramos crear una subclase de String:

MyString de clase pública extiende String 

Nos enfrentaremos a este error:

 no puede heredar de java.lang.String final 

Los diseñadores de la clase String se dieron cuenta de que no era candidato a la herencia y evitaron que se extendiera.

¿Por qué prevenir la herencia??

La razón principal para evitar la herencia es asegurarse de que una subclase no corrompa el comportamiento de una clase..

Supongamos que tenemos una clase Cuenta y una subclase que la extiende, OverdraftAccount. Cuenta de clase tiene un método getBalance ():

 public double getBalance ()


 devuelve this.balance;

  

En este punto de nuestra discusión, la subclase OverdraftAccount no ha anulado este método.

(Nota: Para otra discusión usando esta clase de Cuenta y Cuenta de Sobregiro, vea cómo una subclase puede ser tratada como una superclase).

Creemos una instancia de cada una de las clases Account y OverdraftAccount:

 Cuenta bobsAccount = nueva cuenta (10);

 bobsAccount.depositMoney (50);

 OverdraftAccount jimsAccount = new OverdraftAccount (15.05,500,0.05);

 jimsAccount.depositMoney (50);

 // crea una matriz de objetos de Cuenta

 // podemos incluir jimsAccount porque 

 // solo quiero tratarlo como un objeto de Cuenta

 Cuenta [] cuentas = bobsAccount, jimsAccount;

 

 // para cada cuenta en la matriz, muestra el saldo

 para (Cuenta a: cuentas)

 

 System.out.printf ("El saldo es% .2f% n", a.getBalance ());

 

 El resultado es:

 El saldo es de 60.00.

 El saldo es 65.05 

Todo parece funcionar como se esperaba, aquí. Pero, ¿qué pasa si OverdraftAccount anula el método getBalance ()? No hay nada que evite que haga algo como esto:

 OverdraftAccount de clase pública extiende la Cuenta 

 

 sobregiro doble privado Límite;

 sobregiro doble privado

 

 // el resto de la definición de clase no está incluida

 

 public double getBalance ()

 

 devolver 25.00;

 

  

Si el código de ejemplo anterior se ejecuta nuevamente, la salida será diferente porque elEl comportamiento getBalance () en la clase OverdraftAccount se llama para jimsAccount: