¿Por qué los métodos estáticos no pueden ser abstractos en Java?

En Java, un método estático no puede ser abstracto . Si lo hace, provocará errores de compilación.
Ejemplo: 
 

Java

// Java program to demonstrate
// abstract static method
 
import java.io.*;
 
// super-class A
abstract class A {
 
    // abstract static method func
    // it has no body
    abstract static void func();
}
 
// subclass class B
class B extends A {
 
    // class B must override func() method
    static void func()
    {
        System.out.println(
            "Static abstract"
            + " method implemented.");
    }
}
 
// Driver class
public class Demo {
    public static void main(String args[])
    {
 
        // Calling the abstract
        // static method func()
        B.func();
    }
}

El código anterior es incorrecto ya que los métodos estáticos no pueden ser abstractos. Cuando se ejecuta, el error de compilación que se produce es:
Error de compilación: 
 

prog.java:12: error: illegal combination of modifiers: abstract and static
    abstract static void func();
                         ^
1 error

¿Qué sucederá si un método estático se vuelve abstracto?
Suponiendo que hacemos abstracto un método estático. Entonces ese método se escribirá como: 
 

public abstract static void func();
  • Escenario 1: cuando un método se describe como abstracto mediante el uso del modificador de tipo abstracto, se convierte en responsabilidad de la subclase implementarlo porque no tiene una implementación específica en la superclase. Por lo tanto, una subclase debe anularlos para proporcionar una definición de método. 

     

  • Escenario 2: ahora, cuando un método se describe como estático, deja en claro que este método estático no puede ser anulado por ninguna subclase (hace que el método estático esté oculto) ya que los miembros estáticos son elementos de tiempo de compilación y anularlos los convertirá en elementos de tiempo de ejecución (Polimorfismo en tiempo de ejecución). 
     

Ahora, considerando el Escenario 1 , si el método func se describe como abstracto, debe tener una definición en la subclase. Pero de acuerdo con el Escenario 2 , el método de función estática no se puede anular en ninguna subclase y, por lo tanto, no puede tener una definición en ese momento. Así que los escenarios parecen contradecirse entre sí. Por lo tanto, nuestra suposición de que el método de función estática es abstracto falla. Por lo tanto, un método estático no puede ser abstracto .
Entonces ese método se codificará como: 
 

public static void func();

Ejemplo: 
 

Java

// Java program to demonstrate
// abstract static method
 
import java.io.*;
 
// super-class A
abstract class A {
 
    // static method func
    static void func()
    {
        System.out.println(
            "Static method implemented.");
    }
 
    // abstract method func1
    // it has no body
    abstract void func1();
}
 
// subclass class B
class B extends A {
 
    // class B must override func1() method
    void func1()
    {
        System.out.println(
            "Abstract method implemented.");
    }
}
 
// Driver class
public class Demo {
    public static void main(String args[])
    {
 
        // Calling the abstract
        // static method func()
        B.func();
        B b = new B();
        b.func1();
    }
}
Producción: 

Static method implemented.
Abstract method implemented.

 

Publicación traducida automáticamente

Artículo escrito por Code_r 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 *