Diferencia entre clase abstracta y clase concreta en Java

Clase abstracta : una clase abstracta es un tipo de clase en Java que se declara mediante la palabra clave abstracta. Una clase abstracta no se puede instanciar directamente, es decir, el objeto de dicha clase no se puede crear directamente usando la nueva palabra clave. Una clase abstracta puede ser instanciada por una subclase concreta o definiendo todo el método abstracto junto con la nueva declaración. Puede contener o no un método abstracto. Un método abstracto se declara mediante una palabra clave abstracta, tales métodos no pueden tener un cuerpo. Si una clase contiene un método abstracto, entonces también debe ser abstracto.
Clase concreta:Una clase concreta en Java es un tipo de subclase, que implementa todo el método abstracto de su clase súper abstracta a la que se extiende. También tiene implementaciones de todos los métodos de interfaces que implementa.
Clase abstracta vs clase concreta
 

  1. Modificador: una clase abstracta se declara usando un modificador abstracto. La clase concreta no debe declararse con la palabra clave abstracta, al hacerlo, también se convertirá en una clase abstracta. 
     
  2. Instanciación: una clase abstracta no se puede instanciar directamente, es decir, el objeto de dicha clase no se puede crear directamente usando una nueva palabra clave. Una clase abstracta puede ser instanciada por una subclase concreta o definiendo todo el método abstracto junto con la nueva declaración. Se puede crear una instancia de una clase concreta directamente, utilizando una nueva palabra clave. 
    Ejemplo: instanciación directa no válida de una clase abstracta.
     

Java

abstract class DemoAbstractClass {
    abstract void display();
}
  
public class JavaApplication {
    public static void main(String[] args)
    {
        DemoAbstractClass AC = new DemoAbstractClass();
        System.out.println("Hello");
    }
}
  1. Error de compilación: 
     
prog.java:9: error: DemoAbstractClass is abstract; cannot be instantiated
        DemoAbstractClass AC = new DemoAbstractClass();
                               ^
  1. Ejemplo: Instanciación válida definiendo todos los métodos abstractos de una clase abstracta. 
     

Java

abstract class DemoAbstractClass {
    abstract void display();
}
  
public class JavaApplication {
    public static void main(String[] args)
    {
        DemoAbstractClass AC = new DemoAbstractClass() {
            void display()
            {
                System.out.println("Hi.");
            }
        };
        AC.display();
        System.out.println("How are you?");
    }
}
  1.  
Producción: 

Hi.
How are you?

 

  1. Ejemplo: Creación directa de instancias de concreto usando nueva palabra clave.
     

Java

abstract class DemoAbstractClass {
    abstract void display();
}
  
class ConcreteClass extends DemoAbstractClass {
    void display()
    {
        System.out.println("Hi.");
    }
}
  
public class JavaApplication {
    public static void main(String[] args)
    {
        ConcreteClass C = new ConcreteClass();
        C.display();
        System.out.println("How are you?");
    }
}
  1.  
Producción: 

Hi.
How are you?

 

  1.  
  2. Métodos abstractos: una clase abstracta puede o no tener un método abstracto. Una clase concreta no puede tener un método abstracto, porque la clase que contiene un método abstracto también debe ser abstracta. 
    Entendamos esto con un ejemplo: – 
    Tenemos una clase llamada «HttpServlet» en Servlet. Ahora, esta clase es especial a su manera. 
    “HttpServlet es una clase abstracta, pero no contiene ningún método abstracto”.  
    Comprendamos el significado de la declaración anterior en profundidad:- 
    -> HttpServlet es una clase abstracta porque no tiene una implementación adecuada para sus métodos. Dado que no tiene una implementación adecuada para sus métodos, ¿cuál es el sentido de crear objetos para dicha clase? Por lo tanto, esta clase se hace como abstracta.
    Ahora surge la pregunta es que: – 
    P. Si los métodos no tienen una implementación adecuada, ¿por qué no lo han hecho abstracto? 
    -> Dado que los métodos abstractos son aquellos que no tienen una definición de cuerpo adecuada y anulamos dichos métodos en nuestra clase para darle una definición adecuada. Entonces, básicamente, los métodos abstractos se utilizan para un propósito primordial. 
    Ahora, esta clase «HttpServlet» contiene 10 métodos y supongamos que si estos métodos se hicieran abstractos, entonces necesitamos anular los 10 métodos de la clase «HttpServlet», lo cual es una tontería ya que solo necesitamos los métodos doGet() y doPost(). 
    1. servicio público vacío (ServletRequest req, ServletResponse res)
    2. servicio anulado protegido (HttpServletRequest req, HttpServletResponse res)
    3. doGet vacío protegido (HttpServletRequest req, HttpServletResponse res)
    4. doPost vacío protegido (HttpServletRequest req, HttpServletResponse res)
    5. doHead vacío protegido (HttpServletRequest req, HttpServletResponse res)
    6. doOptions vacío protegido (HttpServletRequest req, HttpServletResponse res)
    7. Vacío protegido doPut (HttpServletRequest req, HttpServletResponse res)
    8. doTrace vacío protegido (HttpServletRequest req, HttpServletResponse res)
    9. Vacío protegido doDelete (HttpServletRequest req, HttpServletResponse res)
    10. Vacío protegido getLastModified (HttpServletRequest req)
  3. Final: Una clase abstracta no puede ser final , porque todos sus métodos abstractos deben estar definidos en la subclase. Una clase concreta se puede declarar como final .
  4. Interfaz: una clase abstracta no puede implementar una interfaz sola, pero puede implementar una interfaz mediante el uso de una clase secundaria y sin proporcionar implementaciones de todos los métodos de la interfaz. Es responsabilidad de la primera clase concreta que tiene esa clase abstracta como ancestro implementar todos los métodos en la interfaz. 
     
Clase abstracta Clase de hormigón
Una clase abstracta se declara usando un modificador abstracto. Una clase concreta no se declara usando un modificador abstracto.
Una clase abstracta no se puede instanciar directamente usando la nueva palabra clave. Una clase concreta se puede instanciar directamente usando la nueva palabra clave.
Una clase abstracta puede o no contener métodos abstractos. Una clase concreta no puede contener un método abstracto.
Una clase abstracta no puede declararse como final. Una clase concreta se puede declarar como final.
Es posible implementar una interfaz al no proporcionar implementaciones de todos los métodos de la interfaz. Para esto se necesita una clase infantil.. Fácil implementación de todos los métodos en la interfaz.

Algunos puntos importantes: 
 

  • Una clase concreta es una subclase de una clase abstracta, que implementa todo su método abstracto. 
     
  • Los métodos abstractos no pueden tener cuerpo. 
     
  • La clase abstracta puede tener campos estáticos y métodos estáticos, como otras clases. 
     
  • Una clase abstracta no puede declararse como final. 
     
  • Solo la clase abstracta puede tener métodos abstractos. 
     
  • Un método estático, final y privado no puede ser abstracto, ya que no puede anularse en una subclase. 
     
  • La clase abstracta no puede tener constructores abstractos. 
     
  • La clase abstracta no puede tener métodos estáticos abstractos. 
     
  • Si una clase extiende una clase abstracta, entonces debe definir todos los métodos abstractos (anulación) de la clase abstracta base. De lo contrario, la subclase (la clase abstracta que extiende la clase) también debe definirse como clase abstracta. 
     

Publicación traducida automáticamente

Artículo escrito por Husban y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *