web-dev-qa-db-fra.com

Peut-on utiliser la méthode statique dans une classe abstraite?

Dans Java Programmation, pouvons-nous appeler une méthode statique d'une classe abstraite?
Oui, je sais que nous ne pouvons pas utiliser static avec une méthode de classe abstraite. mais je veux savoir pourquoi ..?

41
Neha Gupta

Dans Java vous pouvez avoir une méthode statique dans une classe abstraite:

abstract class Foo {
   static void bar() { }
}

Ceci est autorisé car cette méthode peut être appelée directement, même si vous n'avez pas d'instance de la classe abstraite:

Foo.bar();

Cependant, pour la même raison, vous ne pouvez pas déclarer une méthode statique abstraite. Normalement, le compilateur peut garantir qu'une méthode abstraite aura une implémentation réelle à tout moment, car vous ne pouvez pas créer d'instance de classe abstraite. Mais comme une méthode statique peut être appelée directement, la rendre abstraite permettrait d'appeler une méthode indéfinie.

abstract class Foo {
   abstract static void bar();
}

// Calling a method with no body!
Foo.bar();

Dans une interface, toutes les méthodes sont implicitement abstraites . C'est pourquoi une interface ne peut pas déclarer une méthode statique. (Il n'y a aucune raison architecturale pour laquelle une interface ne pourrait pas avoir une méthode statique, mais je suppose que les rédacteurs du JLS ont estimé que cela encouragerait une mauvaise utilisation des interfaces.)

47
Russell Zahniser

Si vous parlez de Java, la réponse est Oui Mais vous devez définir la méthode statique. Vous ne pouvez pas créer de méthode statique abstraite. Ce que vous pouvez créer est méthode statique non abstraite.

La raison est que vous n'avez pas besoin d'une instance d'objet pour accéder à une méthode statique. Vous devez donc définir cette méthode avec certaines fonctionnalités.

donc vous ne pouvez pas avoir,

  abstract class AbstractClassExample{
     abstract static void method();


}  

Mais vous pouvez avoir,

abstract class AbstractClassExample{

     static void method(){}
}  

J'espère que cela t'aides...

21
Dulanga

Voici une explication simple. Les méthodes abstraites doivent être implémentées plus tard.Nous savons que les méthodes statiques ne peuvent pas être remplacées car les méthodes statiques n'appartiennent à aucune instance particulière, mais appartiennent plutôt à la classe.Ensuite une implémentation différente de la méthode abstraite qui est statique dans différentes classes est contre-intuitif.

8
Rafsan Mobasher

Oui, vous pouvez bien sûr définir la méthode statique en classe abstraite. vous pouvez appeler cette méthode statique à l'aide de la classe abstraite ou de la classe enfant qui étend la classe abstraite. Vous pouvez également appeler une méthode statique via une instance/un objet de la classe enfant. Pour illustrer plus en détail l'exemple suivant.

//Parent class
public abstract class TestAbstractClass {
    static void testStaticMethod(){
        System.out.println("In Parent class static method");
    }
}

//child class
public class ChildClass extends TestAbstractClass {
    public static void main(String[] args) {
        TestAbstractClass parentObj = new ChildClass();
        parentObj .testStaticMethod();
        ChildClass childObj = new ChildClass();
        childObj.testStaticMethod();
        TestAbstractClass.testStaticMethod();
        childClass.testStaticMethod();
    }
}
4
CodeNinja

À partir de Java 9, vous pouvez avoir des méthodes statiques dans une interface. Toutefois, l'implémentation doit être fournie dans le bloc lui-même. Contrairement aux méthodes statiques dans une classe, une méthode statique dans une interface n'est pas héritée. par implémentation via une classe ou une sous-interface.

Un résumé peut contenir une méthode statique. C'est parce qu'une méthode statique, bien que non substituée, peut être masquée.

Mais une méthode abstraite ne peut pas être déclarée statique en même temps, car une méthode abstraite doit être remplacée et implémentée par la méthode d'une sous-classe et sa déclaration en tant que méthode statique empêchera le remplacement. En d'autres termes, vous ne pouvez pas utiliser de mots clés abstraits et statiques pour déclarer la même méthode. Cependant, vous pouvez avoir une méthode statique dans une classe abstraite.

0
Abhishek Podder