Listado completo de tutoriales

88 - Clases finales


En Java podemos sellar una clase para evitar que otras clases hereden de la misma mediante la palabra clave 'final' previo a la declaración de la clase:

public final class [Nombre de la clase] {
}

En algunas situaciones donde veamos que no tiene sentido aplicar herencia a la clase que estamos creando podemos declararla de tipo final. Si luego alguien quiere heredar de la misma se genera un error de compilación.

Problema:

Desarrollar una clase que represente un punto en el plano y tenga los siguientes métodos: constructor, imprimir en que cuadrante se encuentra dicho punto (concepto matemático, primer cuadrante si x e y son positivas, si x<0 e y>0 segundo cuadrante, etc.)

Sellar la clase para evitar que se pueda aplicar herencia en la misma.

Programa:

public final class Punto {
    private int x, y;

    public Punto(int x, int y) {
        this.x = x;
        this.y = y;
    }

    void imprimirCuadrante() {
        System.out.print("[" + x + "," + y + "] ");
        if (x > 0 && y > 0)
            System.out.println("Se encuentra en el primer cuadrante.");
        else if (x < 0 && y > 0)
            System.out.println("Se encuentra en el segundo cuadrante.");
        else if (x < 0 && y < 0)
            System.out.println("Se encuentra en el tercer cuadrante.");
        else if (x > 0 && y < 0)
            System.out.println("Se encuentra en el cuarto cuadrante.");
        else
            System.out.println("El punto no está en un cuadrante.");
    }

    public static void main(String[] ar) {
        Punto punto1;
        punto1 = new Punto(4, 5);
        punto1.imprimirCuadrante();
        Punto punto2;
        punto2 = new Punto(-4, 5);
        punto2.imprimirCuadrante();

    }
}

Hemos declarado la clase 'Punto' de tipo final para evitar que se puede heredar de ella:

public final class Punto {

Luego si se intenta heredar de la misma debe generar un error sintáctico:

java final class

Clases finales en el API de Java.

Podemos nombrar que el API de Java tiene una gran cantidad de clases definidas como final:

  • System
  • Scanner
  • String
  • Math
  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Boolean
  • Character

Como podemos ver hay numerosas clases en el API de Java que hemos utilizado a lo largo del curso que están pensadas para que no las heredemos.

Problema propuesto

  1. Desarrollar una clase que represente un Cuadrado. Definir dos métodos que retornen la superficie y el perímetro.
    Crear la clase como 'final'.

Solución
public final class Cuadrado {

    private int lado;

    public Cuadrado(int lado) {
        this.lado = lado;
    }

    public int retornarPerimetro() {
        return lado * 4;
    }

    public int retornarSuperficie() {
        return lado * lado;
    }

    public static void main(String[] ar) {
        Cuadrado cuadrado1 = new Cuadrado(20);
        System.out.println("El perímetro de un cuadrado de lado 20 es " +
                           cuadrado1.retornarPerimetro());
        System.out.println("La superficie de un cuadrado de lado 20 es " + 
                           cuadrado1.retornarSuperficie());
    }
}

Retornar