No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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?

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 
}

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.



Genial genial geniaaal!!

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);

    }
}

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
    }
    

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.

Me quedo muy claro !!

Es como un nino pequeno:
.
Que quiero pizza, ay! pero sin cebolla, ay! que tampoco me gusta la rugula. quiero que traiga mucho mas queso y pimienta
.
Esta bien, toma tu Pizza abstracta 😛

Entendí que usarás clases abstractas cuando NO quieras usarlas. Por ejemplo nunca harás una clase figura como tal, siempre será una clase cuadrado o triángulo.

Práctica

Recuerden muchachos. Para interiorizar estos conceptos tenemos que practicar. Aquí les dejo un ejercicio:
.
Jerarquía de Formas: Crea una clase abstracta llamada Forma con métodos abstractos como calcularÁrea() y calcularPerímetro(). Luego, crea subclases concretas como Círculo, Rectángulo y Triángulo que extiendan Forma e implementen estos métodos. Prueba la implementación creando instancias de cada forma y llamando a sus métodos.

las clases abstractas son aquellas que fueron creadas para poder resolver problemas de las interfaces y herencia ya que estas y sus declaraciones abstractas pueden traer problemas directamente pero como sabemos pero al usar las clases abstractas podemos darle solución de mill formas podemos crear una clase de esta forma con el nombre de un metodo y fuera de este darle iniciación a este metood asi cada que tenemos o heredamos de esta podremos usarlo

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

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.

y seguimos con el magico mundo de poo

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

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

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.

Entendi con el ejemplo del codigo, excelente.

gracias 😃 entendido

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

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

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

Conclusión, las clases abstractas no pueden ser instanciadas mientras que las normales sí. c:

Cuando hablo de instanciar al principio pense que era que no se podian crear mas objetos a partir de la misma clase, pero hata ahora vengo a entender que cuando se refiere a instanciar es a crear “variables” dentro del codigo por decirlo de alguna manera, y eso que no es el primer curso de POO que tomo en platzi jajakjsa

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

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 "

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.

muy interesante