Los métodos de una clase que se declaran de tipo final no pueden ser redefinidos por las subclases. Esta opcion puede adoptarse por razones de seguridad, para que nuestras clases no puedan ser extendidas por otros.
Veamos un ejemplo:
abstract class Animal{
String nombre;
int patas;
public Animal (String n, int p){
nombre = n;
patas = p;
}
public final int numPatas(){
return patas;
}
abstract void habla();
}
class Perro extends Animal{
String raza;
public Perro (String n, int p, String r){
super(n,p);
raza = r;
}
public void habla(){
System.out.println("Me llamo "+nombre+": GUAU, GUAU");
System.out.println("mi raza es:"+raza);
System.out.println("Tengo "+numPatas()+" patas");
}
}
class Gallo extends Animal{
public Gallo (String n, int p){
super(n,p);
}
public void habla(){