Clase Abstracta: No se instancian, solo se heredan. Cierto? 😃
Entender la Programación orientada a objetos
Programación orientada a objetos en Java
¿Qué es un Objeto?
Abstracción: ¿Qué es una Clase?
Modularidad
Definir Clases y sus componentes
Creando nuestra primera Clase
Método constructor
Static: Variables y Métodos Estáticos
Creando elementos estáticos
Final: Variables Constantes
Sobrecarga de métodos y constructores
¡Reto!
Encapsulamiento: Modificadores de acceso
Getters y Setters
Variable vs. Objeto
Variable vs. Objeto: Un vistazo a la memoria
Clases Anidadas
Clases Internas y Locales a un método
Enumerations
Reutilizar Código
¿Qué es la Herencia? Don't repeat Yourself
Super y This
Polimorfismo: Sobreescritura de Métodos
Polimorfismo: Sobreescribiendo el método toString
Interfaces
Creando una interfaz para definir si una fecha es agendable
Collections
Aplicar Abstracción
Clases Abstractas
Miembros abstractos
Clases Anónimas
Diferencias entre las Interfaces y las Clases Abstractas
Interfaces en Java 8 y 9
Herencia en interfaces
Ensamblando Objetos el proyecto
Simulando autenticación de usuarios
Modularizando la UI de Doctores
Definiendo las citas disponibles
Modularizando la UI de Pacientes
Recorriendo estructuras de árbol en Java
Agendando Citas
Cierre del curso: Continúa con Programación Funcional en Java
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Anahí Salgado Díaz de la Vega
Aportes 51
Preguntas 3
Clase Abstracta: No se instancian, solo se heredan. Cierto? 😃
“Forma en como nombramos:
Clase abstracta: pensamos en objetos
Interfaz: pensamos en acciones que pueden tener muchos objetos”
Aquí unas guías de complemento y su uso:
Clase Abstracta: https://n9.cl/aju1
Interfaces: https://n9.cl/h5lh
Me causa un poco de conflicto y siento que lo hará en el examen, el hecho de que diga que no se puede heredar de una clase abstracta y luego diga que hay un pequeño hack para hacer una instancia
No me quedó claro la última parte de que una aplicación debe estar orientada a interfaces. Acaso estas no deben ser “implementadas” por las clases?
O indica que las aplicaciones deben estar orientadas a interfaces por sobre clases abstractas?
Antes de Java 8 las interfaces sólo podían tener métodos abstractos, es decir sin implementación.
Con Java 8 las interfaces pueden tener métodos default y static. La razón de este cambio es para que los desarrolladores puedan añadir nuevos métodos a las interfaces sin afectar las clases que implementan estas interfaces.
Los métodos default y static sí tienen un cuerpo o implementación en su interfaz.
Suponiendo que cientos de clases implementan una interfaz, si se le agrega un nuevo método, antes de Java 8 se tendría que implementar ese nuevo método en cada una de las clases que implementan la interfaz.
Gracias a Java 8, ya no es necesario que el default method sea implementado, sino que es opcional. De manera que se puedan añadir nuevos métodos a la interfaz sin romper el código.
Un método estático en una interfaz es similar al default method excepto que no es posible sobrescribir este método en las clases que implementan la interfaz.
El propósito de una interfaz es proporcionar una abstracción total, mientras que una clase abstracta propociona una abstracción parcial.
Una clase abstracta únicamente se utilizará para definir subclases, sólo se podrá heredar. Por lo tanto la herencia de métodos se llevará de forma lineal, desde una clase padre a una clase hijo y así sucesivamente.
Una clase abstracta sólo servirá para redefinir nuevas clases sin crear nuevos objetos.
Los métodos de una interfaz pueden implementarse en muchas familias de clases, la implementación de los métodos dejará de ser lineal como se hace en las clases abstractas.
La clases abstractas están más enfocadas en un objeto, y las interfaces son más enfocadas en las acciones en común de muchos objetos.
Buenas prácticas
Fuente
https://beginnersbook.com/2017/10/java-8-interface-changes-default-method-and-static-method/
¿Cuando puedo utilizar una clase abstracta?
únicamente se utilizará para definir subClases, por lo tanto siempre deberá ser heredada para poder heredar y sobreescribir los métodos de su clase padre.
Una restricción de esta clase es que, naturalmente, no se podrá crear instancias a partir de ella. Únicamente podrá ser heredada. Por lo tanto la herencia de métodos se llevará de forma lineal, desde una clase padre a una clase hija y así sucesivamente.
Herencia de métodos en clases abstractas de forma Lineal
Podemos heredar métodos abstractos y no abstractos.
Por lo tanto una Clase abstracta nos servirá para redefinir nuevas Clases sin crear nuevos Objetos.
¿Cuando puedo utilizar una Interfaz?
En una interfaz tenemos nuevos modificadores de Acceso Default
y Private
, esto significa que podemos agregar comportamiento a los métodos de una interfaz. Entonces una interfaz, ahora, tendra métodos con implementación y otros sin implementación, igual que en una clase abstracta.
En la interfaces tendremos una estructura similar de métodos abstractos y no abstractos. Pero acá la vista principal será sobre los métodos que estos pueden implementarse en muchas familias de Clases. La implementación de estos métodos dejará de ser Lineal, como en la clases abstractas.
La implementación de métodos de interfaces no es Lineal
Usaremos interfaces para implementar métodos que se comparten entre familias, es decir, la relación va más allá de la herencia entre dos clases.
Otra diferencia es la forma en como nombramos una clase abstracta y una interfaz. En la Abstracta pensaremos mas en objetos y en la interfaces pensaremos más en las acciones, comportamientos, que pueden tener en común muchos objetos.
Es común encontrar nombres en forma de acciones como Drawable (Dibujable), Runnable (Ejecutable), Callable (invocable), Visualizable (Visualizable) para interfaces. Y para clases abstractas tendremos nombres sustantivos como Film, Publication, Figure.
Una buena práctica es que el diseño de las aplicaciones, siempre, esté orientado a interfaces y no a la implementación.
Crear buenas abstracciones para encontrar comportamientos en común.
Enfocarse en la declaración de métodos.
Si se trata de forma homogenea y con independencia los módulos, el programa será más eficiente y escalables
Las Clases Abstractas sirven para definir SubClases, la implementación de los métodos de las Clase Abstractas es opcional, para utilizar sus métodos debe ser heredada por una SubClase y la herencia de métodos es lineal.
Las Interfaces cuentan modificadores de acceso para métodos(default, private) lo que permite que la implementación de un método sea opcional como las clases Abstractas, los métodos de la Interface pueden implementaarse en diferentes familias, es decir, la relación va mas allá de la relación entre dos clases y la herencia de métodos deja de ser lineal.
Aquí hay dos videos para dominar ambas:
Clases abstractas:https://www.youtube.com/watch?v=2vOkWKJdJUQ&list=PLhU2otMFcLuCQPcEcRQfi3UQQ-ms5YH0L&index=21
Interfaces: https://www.youtube.com/watch?v=hBnDFThRBpM&list=PLhU2otMFcLuCQPcEcRQfi3UQQ-ms5YH0L&index=22
Porfa quiten la musica de fondo, o bajenle, distrae.
Porque las interfaces tienen en común que usualmente se les encuentra con la palabra “-able” al final? Según entiendo cualquier metodo como “Run” podria ser implementado en otras clases.
Bueno de esta forma es como me quedo claro a mi:
En resumen, una clase abstracta se utiliza como una clase base para ser extendida, mientras que una interfaz se utiliza para definir un contrato que debe ser seguido por las clases que la implementan.
Muy bonito y todo la clase así, pero es más difícil tomar anotaciones así, e igual comprenderlo.
Diferencias entre las interfaces y las clases abstractas
Las interfaces tiene modificadores de acceso (default y private), esto significa que es posible añadir comportamiento a métodos de una interfaz. Entonces una interfaz ahora tendrá métodos con implementación y otros sin ella, igual que una clase abstracta.
Una clase abstracta solo se utilizará para definir subclases, es decir, esta siempre debe ser heredada para poder reutilizar y sobrescribir sus métodos. De estas no se puede crear instancias, por lo que la herencia de métodos se hará de forma lineal.
Una clase abstracta sólo servirá para redefinir nuevas clases sin la necesidad de crear nuevos objetos.
Las interfaces tiene métodos que pueden implementarse en diferentes familias de clases, la implementación de los métodos dejará de ser lineal.
Las interfaces se utilizan cuando se tienen métodos que se pueden implementar en muchas familias, es decir, la relación va mas allá de la relación entre dos clases.
Otra diferencia está en cómo se nombran. Para la Clase Abstracta pensaremos más en objetos y en las interfaces en las acciones que pueden tener en común muchos objetos.
Una buena práctica es que el diseño de las aplicaciones siempre esté orientado a interfaces y no a la implementación, para esto:
😀 Esta sección nos permite determinar las diferencias que existen entre una clase abstracta y una interfaz.
Super!!
Excelente explicación, muy bien diseñada la animación para explicar es genial
Here are some of the reasons why this hack is not recommended:
Algunas diferencias entre las interfaces y las clases abstractas son:
Una clase solo puede extender una sola clase abstracta, pero puede implementar varias interfaces.
Una clase abstracta puede tener métodos no abstractos, mientras que una interfaz solo puede tener métodos abstractos.
Una clase abstracta puede tener atributos, mientras que una interfaz no.
Una clase abstracta puede proporcionar una implementación por defecto para un método, mientras que una interfaz no.
Las clases abstracta serán mas utilizadas para crear clases padres y las interfaces para poder reutilizar métodos que nos ayuden en muchos objetos
La Diapositiva no esta a la par de lo que anahí va hablando, lo que me confundió mucho.
Alguien que le quite la musica desesperante de fondo por favor
Clase abstracta = pensar más en los objetos
Interfaces = pensar más en las acciones comunes (métodos) de varios objetos
Private
Default
Se utiliza para implementar métodos abstractos
Los métodos pueden implementarse en muchas familias de clases
La implementación de métodos dejara de ser lineal.
Se enfoca el los métodos y es común encontrar nombres como runnable, visualizable,
Se utiliza para definir clases hijas
No podre instanciarla, únicamente heredarla
La herencia se métodos seguirá de manera lineal
No podemos crear métodos
Se enfoca mas en las subclases
Concentrarse en interfases
Comportamiento común
Declaración de métodos
Por favor quiten esa música horrible del video o suban el volumen de la voz para poder centrarnos en lo importante.
Gracias
Clases abstractas -> Objetos
Instancias -> Comportamientos
excelente 😃 hacia falta otra aclaración XD
si, bastante mas claro asi
Genial.
Muy buena la explicación, Gracias!
excelente explicacion, me gusto mucho la animacion, cual la herramienta para hacer estar animaciones?
Estupenda manera de abordar la diferencia entre las clases abstractas y las interfaces, la principal diferencia es que las primeras se enfocan en ayudar a la creación de subclases por medio de la herencia para hacer la aplicación más eficiente. Por el otro lado las interfaces, se centran en el compartimiento que se les pueda brindar a las clases.
Genial ,quedo más claro la diferencia entre las interfaces y las clases abstractas.
Alguien me podria dar un ejemplo de cuando nos beneficiaria usar herencia de una clase QUE NO SEA Abstracta?
Excelente
Mucho mas claro
¡Muy buena explicación!
Clase abstractas
Únicamente se utilizará para definir subclases, esta siempre deberá ser heredada para poder utilizar y sobrescribir los métodos. Una restricción que tiene esta clase, es que naturalmente no se puede crear instancias ni objetos a partir de ella únicamente solo se podrá heredarla. La herencia de métodos se llevará de forma lineal de una clase padrea a una clase hijo. Solo Servirá para redefinir nuevas clases sin necesidad de crear nuevos objetos.
Interfaces
Tenemos una estructura similar de métodos abstractos y no abstractos. Pero aquí la vista principal será los métodos que estos podrán implementar en muchas familias de clases. La implementación de los métodos dejará de ser lineal.
Usaremos interfaces para implementar métodos que se comparten entre familias. La relación va más allá de la herencia entre dos clases. La forma en que nombramos una clase abstracta y una interfaces. Abstractas pensaremos más en objetos y en las interfaces pensaremos más en las acciones en que puede tener en común muchos objetos.
Buenas gente!
Aquí les dejo un link a un post que me permitió ir un poco mas allá sobre aquello de la “composición por sobre la herencia”
Dejo advertido que no es mía la pagina ni nada, pero la manera en la que explican todo es bastante clara.
Un saludo a tod@s.
ya un poco mas claro ahora
Java es muy amplio no es suficiente con las bases de clases y objetos, el tema de las interfaces es mas profundo, aumentando la complejidad.
Mis apuntes de esta Clase:
Diferencias entre las Interfaces y las Clases Abstractas
Las interfaces ahora cuentan con nuevos modificadores de acceso: default
y private
lo que significa que ahora se puede agregar comportamiento a los métodos de una interfaz, por lo que una interfaz tendrá métodos con implementación y otros sin implementación, exactamente igual que en una Clase abstracta.
Diferencias
Clases abstractas
Se usan para definir subclases, por lo que siempre debe ser heredada para poder llamar y sobrescribir los métodos. La herencia de métodos se hace de forma lineal; se pueden heredar métodos abstractos y no abstractos. En resumen una Clase abstracta sirve para redefinir nuevas Clases sin tener que crear nuevos objetos. Las Clases abstractas a diferencia de las interfaces se centran más en los objetos
Interfaces
Se tienen métodos abstractos y no abstractos, dichos métodos pueden implementarse en familias de Clases distintas por lo que aquí la implementación de los métodos no es lineal. En resumen las interfaces se usan cuando se quiere crear métodos que se puedan implementar en muchas familias, considerando las acciones que pueden tener en común muchos objetos.
Nota: una buena práctica es que el diseño de las apps siempre este orientado a interfaces y no a la implementación. Hay que concentrase en crear buenas abstracciones, encontrar comportamientos comunes, tratar de forma independiente los módulos.
En la abstracta pensaremos mas en objetos (no podemos crear objetos) xd ? y en las interfaces en las acciones que pueden tener muchos objetos…
¿a que refiere que el diseño de una aplicación este orientado a interfaces y no a la implementación?
Quedo claro.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?