Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de Java SE Orientado a Objetos

Curso de Java SE Orientado a Objetos

Anahí Salgado Díaz de la Vega

Anahí Salgado Díaz de la Vega

Clases Abstractas

26/38
Recursos

A veces NO necesitamos implementar todos los métodos de una clase heredada o interfaz. No siempre necesitamos crear instancias o implementar todos los métodos heredados de una clase padre, así como tampoco podremos necesitamos algún método de nuestras interfaces, pero estas nos obligan a escribir el código de todos los métodos que definimos genéricamente.

Afortunadamente, las Clases Abstractas resuelven todos estos problemas. Son una combinación entre interfaces y herencia donde no implementaremos todos los métodos ni tampoco crearemos instancias.

public abstract class Figura {
  // ...
}

class Triangulo extends Figura {
  // ...
}

Aportes 33

Preguntas 10

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Interface: te obliga a implementar todos los métodos.

Herencia: A veces no necesitamos crear instancias de una clase padre, porque es muy genérica.

Clases Abstractas: Combinación entre Interface y Herencia , no implementa todos los métodos, por su composición no es necesario instanciarlo, no se pueden crear instancias de una clase abstracta.

La herencia desprende, entre algunos, dos conceptos particulares, que son las CLASES ABTRACTAS y las INTERFACES.

Las CLASES ABSTRACTAS son aquellas clases que tienen por lo menos un método abstracto, es decir, un método no definido. Y además no pueden ser instanciadas, únicamente pueden ser heredadas (extends). Para definir una clase abstracta usamos:

abstract class Ejemplo {
	//código
}

Las INTERFACES son siempre una clase abstracta pública, tanto así, que todos sus métodos son abstractos públicos implícitamente, es decir, no necesitamos usar las palabras reservadas public abstract al momento de declararlos.
Las INTERFACES tampoco pueden ser instanciadas, únicamente pueden ser implementadas (implements).
Y únicamente pueden contener constantes públicas.
Para definir una INTERFAZ usamos:

interface Ejemplo {
	//constantes y/o métodos 
}

Yo lo veo de una manera un poco más sencilla. Si una clase es un molde para crear objetos, una clase abstracta es un molde para crear moldes. Es bastante resumido, pero ayuda a entender el rol de una clase abstracta.

✨ No podemos instanciar objetos de una clase abstracta.

Clases Abstractas
Uno de los puntos débiles de la implementación de interfaces es que a veces no necesitamos implementar todos los métodos que contiene la interfaz o la clase padre.

En el caso de la herencia, las clases podrían no necesitar heredar la implementación o el comportamiento de un método. A veces no necesitamos crear instancias de una clase padre, ya que es muy genérica.


Estos problemas vienen a ser solucionados por las Clases Abstracta, estas clases se podrían definir como una combinación entre interfaces y herencia de clases. Con las clases abstractas no es necesario implementar todos lo métodos y tampoco es necesario crear instancias/objetos de estas clases (de hecho no es posible crear objetos de una clase abstracta).

<h4>Ejemplo</h4>
public abstract class Figura{
}

class Triangulo extends Figura{
}

En este caso la clase Triangulo está heredando de la clase Figura, pero también podría ser una clase Circulo, Cuadrado u otra figura. En esta clase se definirían los elementos más definidos posibles y con esto ya no es necesario crear una instancia de la clase Figura.

Si en nuestro programa, hacemos la clase User una clase abstracta no aparecería ningún error, ya que esta clase no tiene ninguna instancia creada, solo sirve para heredarle a las demás clases los atributos y métodos. Cabe mencionar que sí se pueden crear instancias de las clases que heredan de User.

Una clase abstracta es una combinación entre una interfaz y herencia

De una clase abstracta no se implementa todos los métodos, podemos decidir que metodos debemos y no debemos implementar.

No se crean instancias, no se crean objetos de una clase abstracta.

No se pueden crear instancias de una clase abstracta pero se puede crear objetos de una clase abstracta siempre y cuando el objeto se instancie como objeto de una clase hija de la super clase abstracta

ejemplo:

User user = new User(); // => Esto no se puede hacer poque la clase User es abstracta.

User user = new Doctor(); // => Esto si se puede hacer porque estamos creando un objeto de tipo User pero le estamos diciendo que se comporte como un objeto de tipo Doctor, le estamos llamando al constructor de la clase Doctor y le estamos dando un comportamiento al objeto User.



Mis apuntes de esta Clase:

  • Clases Abstractas

    El polimorfismo se puede aplicar en la herencia sobrescribiendo métodos. n el caso de la implementación de Interfaces también se aplica el polimorfismo.

    Cuando se implementa una Interfaz sobre una Clase es necesario que dicha Clase implemente todos los métodos de la Interfaz. No obstante hay casos en los que hacer esto es no necesario y sólo no se ocupa implementar todos los métodos de una interfaz.

    En el caso la Herencia, cuando se sobrescribe un método, este hereda la implementación que tenía en la superclase, pero en ocasiones no se necesita heredar la implementación de un método. Otra situación que se puede presentar en la herencia es que no se quiere crear una instancia de una Clase padre ya que esta es muy genérica.

    Las Clases abstractas permiten solucionar los problemas citados anteriormente. Las Clases abstractas son una especie de combinación entre Interfaces y Herencia. En este tipo de Clases se puede definir que tipo de métodos son obligatorios de implementar y cuáles no y además no se crean instancias.

    // Declarar una Clase abstracta
    public abstract class Figura {
        // Implementación
    }
    
    // Usar una Clase abstracta
    class Triangulo extends Figura {
        // Implementación
    }
    

EJERCICIO (hallar área de figuras):

//CLASE ABSTRACTA BASE:
(SOLAMENTE USANDO UN MÉTODO ABSTRACTO,LOS DEMÁS SON CONSTRUCTORES QUE PUEDEN SER USADO PARA DIFERENTES OBJETOS)

abstract class figura {
    private double base;
    private double altura;
    private String nombre;

    //Constructor por defecto
    figura(){
        base=altura=0d;
        nombre = "Nada";
    }

    //figura normal
    figura(String n , double b , double h){
        this.nombre=n;
        this.base=b;
        this.altura=h;
    }

    //figura tiene la misma base y altura
    figura(Double x , String nombre){
        base = altura = x;
        this.nombre = nombre;
    }
    // CREANDO UN OBJETO A PARTIR DE UN OBJETO
    figura(figura object){
        altura = object.altura;
        base = object.base;
        nombre = object.nombre;
    }

    //MÉTODO ASBTRACTO
    abstract double area();


    //métodos get y set
    public double getBase() {
        return base;
    }
    public void setBase(double base) {
        this.base = base;
    }
    public double getAltura() {
        return altura;
    }
    public void setAltura() {
        this.altura = altura;
    }
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }


}

//CLASE TRIÁNGULOS

public class triangulo extends figura {
    private String tipo;
    triangulo(figura objeto1){
        super();
        tipo = "nullo";
        System.out.println(tipo);
        System.out.println("El área es: "+area());
    }
    triangulo(double b , double h,String t){
        super("Triangulo", b, h);
        this.tipo=t;
        System.out.println(tipo);
        System.out.println(getNombre());
        System.out.println("El área es: "+area());
    }
    //Triangulo EQUILATERO (LADOS IGUALES)
    triangulo(double x , String t){
        super(x,"Triángulo");
        this.tipo=t;
        System.out.println(tipo);
        System.out.println(getNombre());
        System.out.println("El área es: "+area());
        System.out.println(getNombre());
    }

    //OBJETO A PARTIR DE UN OBJETO
    triangulo(triangulo obj){//Pasa el objeto al constructor de DosDimensiones
     super(obj);
     System.out.println("El área es: "+area());
        System.out.println(getNombre());
    }

    @Override
    double area() {
        return (getBase()*getAltura())/2;
    }
}

//CLASE RECTÁNGULO

public class rectángulo extends figura {
    rectángulo(){

    }
    rectángulo(double b , double h ){
         super("Rectángulo", b,h);
         System.out.println("El área es: "+area());
    }

    rectángulo(double x ){
    super(x, "Cuadrado");
    System.out.println("El área es: "+area());
        System.out.println(getNombre());
    }

    @Override
    double area() {
        return getBase()*getAltura();
    }

}

//MAIN PRINCIPAL


public class main {
    public static void main(String[] args) {


        figura objeto1= new triangulo(6,"EQUILÁTERO");
        System.out.println("------------------------------------");
        figura objeto2 = new triangulo(12.4,8.9,"ESCALENO");
        System.out.println("------------------------------------");
        figura objeto3 = new rectángulo(12d);

    }
}

Genial genial geniaaal!!

Incluso por si no queda claro con la implementación del proyecto.
Con este video puede quedar un poco mas claro con un ejemplo mas sencillo.
https://www.youtube.com/watch?v=J2aXYUA1h20
Incluso desde el cielo nos sigue enseñando.

Era fan de Java pero ORACLE me destruyo… cuando empece a re-inventarme el camino investigue a Kotlin a Flutter y si habria una posibilidad de seguir con Java. asi que pense… No!.. tengo que ver que vendra a futuro. apostar a lo seguro ya no es fiable, y descubri el mundo de Blockchain! Wow! que emocionante es ver un futuro sin fronteras! gracias ORACLE me haz hecho entender mi camino. Gracias PLATZI por Hacer ese camino mas facil de caminar

NOOOO Acabo de ver esto!!! noo acaso soy el ultimo en enterarse? fak https://youtu.be/bdlMenlhxRQ

Les recomiendo este video donde para comprender en profundidad las clases abstractas y de forma clara:
https://www.youtube.com/watch?v=2vOkWKJdJUQ&list=PLhU2otMFcLuCQPcEcRQfi3UQQ-ms5YH0L&index=21

El sentido de crear clases abstractas y métodos abstractos es marcar la pauta a seguir en el diseño de la herencia.

Excelente explicación de las clases abstractas

y seguimos con el magico mundo de poo

La vida cambia despues de que conoces las clases abstractas, son buenisimas

Genial , cada vez se pone más interesante el curso.☕

Muchas gracias por la explicación de las clases abstractas instructora Anahí, ahora sabemos que por medio de ellas no se crearan objetos (instancias) pero si podremos aprovechar los métodos que necesitemos.

Abstract también podría ser con una marca de carros, y los modelos

Entendi con el ejemplo del codigo, excelente.

gracias 😃 entendido

Las clases abstractas nos permiten decidir a diferencia de las interfaces escoger que metodos podemos implementar y cuales no, pero al igual que la herencia que veniamos manejando solo se puede heredar de una clase sea abstracta o no.

Muy interesante la clase, hay una herramienta para todos los casos.


Una clase que herede una clase abstracta está obligada a sobrescribir los métodos abstractos heredados (o declararse también como abstracta).
No es posible crear objetos de una clase abstracta.

Cuando no necesitamos implementar todos los métodos de una Interface (cosa que estamos obligados a hacer si implementamos una Interface) y tampoco necesitamos crear instancias de una clase padre porque es muy genérica podemos utilizar Clases Abstractas para solucionar dicho problema.
Una Clase Abstracta es una clase cualquiera, pero que no puede ser instanciada, solo heredada.

muy interesante

this.speciality = speciality; eso en que parte del curso lo arregla?

"En nuestro programa el objeto usuario no figura en ningun lugar , las relaciones van entre pacientes y doctores , pacientes y enfermeros. Las clases abstractas vienen a solucionar estos problemas , pues en las interfaces es obligatorio implementar todos los métodos y en la herencia es necesario crear una instancia de la clase padre ,pero esto resulta inutil porque no lo estamos utilizando , además que en la herencia estamos reutilizando métodos "

"Una clase abstracta va ser una combinación entre interfaces y herencia, en una clase abstracta no implementaremos todos los metodos , podemos definir que metodos si son obligatorios de implementar , ademas no es necesario crear objetos de esta clase "

Clases abstractas veamos cómo funcionan en la próxima clase.