¿Por qué usar una clase abstracta sin métodos abstractos?

Ahora estoy estudiando Java y estoy en la parte de Abstract. Leí una parte muy extraña de que hay una clase abstracta que no incluye ningún método abstracto.

¿Por qué usan este tipo de clase?

Para evitar la creación de instancias de esa clase y usarla solo como una clase base. Las clases secundarias pueden usar los métodos generales definidos en la clase abstracta.

Por ejemplo, no tiene sentido crear una instancia de AbstractVehicle . Pero todos los vehículos pueden reutilizar un método registerMileage(int) común.

Una razón común para hacer esto es hacer que la clase abstract proporcione implementaciones explosivas de los métodos abstract como una conveniencia para las subclases que no tienen que implementar todos los métodos abstract , solo aquellos que quieran, los restantes aún explotarán, pero no importará si esos caminos de ejecución no se ejercen.

HttpServlet es un ejemplo de este patrón en acción. Tiene implementaciones predeterminadas para todos los métodos que manejan los diferentes tipos de solicitud, pero arrojan una excepción. La subclase debe anular estos si quieren hacer algo significativo. Está bien dejar algunos métodos de control no anulados siempre que nunca se llamen.

Sí, podemos tener una clase abstracta sin ningún método abstracto. El mejor ejemplo de clase abstracta sin ningún método abstracto es HttpServlet

Si esta clase amplía otra clase abstracta y no tiene implementación de métodos abstractos heredados.

Esta clase contiene una lógica común para todos sus herederos, pero no representa una entidad utilizable (en términos de aplicaciones particulares)

Supongamos que tiene un conjunto de clases relacionadas, pero aún no tiene un código relacionado (compartido). Si hacemos que todas estas clases extiendan una clase base sin métodos abstractos, entonces si queremos que todas estas clases tengan un método / característica idéntica en el futuro, eso se puede hacer de una sola vez colocándolo en el clase base Por lo tanto, el código no se repite y se refleja en todas las clases secundarias al incluirlo en un solo lugar.

Este tipo de clases se utilizan para implementar una lógica general que puede ser implementada por otras clases. Hacerlo abstracto evita la creación de instancias. Pero otras clases pueden heredar la clase y sus métodos.

Desarrollo una clase abstracta para evitar la creación de instancias de esa clase y la utilizo solo como una clase base. porque, este tipo de clases se utilizan para implementar una lógica general que puede ser implementada por otras clases. A veces, tengo una implementación predeterminada para cada método en la clase abstracta. Del mismo modo, no obliga a la subclase a anular todo el método, sino que implementa a todos los que lo necesitan. Esto significa implícitamente que debe anular al menos un método para crear una escena utilizando esta clase abstracta.

Otro ejemplo para tener dicha clase es cuando implementa ayudantes de creación. Estas clases se utilizan para facilitar al cliente la creación de objetos, que están relacionados en el tema pero desacoplados según la necesidad. Por naturaleza, los métodos de estas clases de creadores son todos estáticos y también pueden verse como clases de utilidad. Obviamente, la instalación de estas clases es inútil y, por lo tanto, la palabra clave abstract .

Para mencionar un ejemplo reciente que conocí fue la clase Sftp de org.springframework.integration.dsl.sftp que es básicamente una manera fácil de requerir objetos (por ejemplo: adaptadores, puertas de enlace) de la api sftp.

No puedo pensar en ninguna buena razón para usarlo. Podría usarse como “marcador”, pero una interfaz sería una mejor opción.

La clase abstracta sin método abstracto significa que puede crear un objeto de esa clase abstracta. Ver mi ejemplo.

 abstract class Example{ void display(){ System.out.println("Hi I am Abstract Class."); } } class ExampleDemo { public static void main(String[] args) { Example ob = new Example(){}; ob.display(); } } 

Si escribe un método abstracto dentro de la clase abstracta, no comstackrá. Lo que significa que si creas una clase abstracta sin un método abstracto, entonces puedes crear el objeto de esa clase abstracta.