Question

Quelqu'un peut-il m'expliquer pourquoi Java permet l'accès aux méthodes statiques et aux membres à partir d'une instance? Un mauvais exemple, si j’ai une classe appelée RedShape et une méthode statique appelée getColor () qui retourne "rouge", pourquoi java permet-il d’appeler la méthode statique à partir d’une instance de RedShape? Pour moi, cela semble violer certains des concepts de base de la conception de langage OO. À tout le moins, cela devrait venir avec un avertissement du compilateur.

Merci d'avance.

Modifier:

En particulier, je vous demande quand vous avez quelque chose comme

RedShape test = new RedShape();
test.getColor();

où getColor est une méthode statique de la classe RedShape. Cela n'a aucun sens si c'est autorisé et ne donne pas d'avertissement au compilateur sur la ligne de commande via javac. Je vois que c'est "fortement déconseillé", mais j'étais curieux de savoir s'il existait une raison technique ou raisonnable de ne pas le permettre en dehors de "parce que C ++ le permet".

Était-ce utile?

La solution

Il n'y a vraiment aucune raison pour que vous puissiez réellement faire cela.

Ma seule hypothèse était que cela vous permettrait de remplacer les méthodes statiques, mais vous ne pouvez pas .

Si vous essayez le scénario suivant:

Banana a une méthode statique appelée "test" (cette option affiche "banane") Apple étend Banana et "substitue" la méthode statique appelée 'test' (ceci affiche 'apple')

et vous faites quelque chose comme ça:

public static void main(String[] args) {
    Apple apple = new Apple();
    Banana banana = new Banana();
    Banana base = new Apple();

    apple.test();
    banana.test();
    base.test();
}

Le résultat obtenu est:

apple
banana
banana

Donc, effectivement, c'est plutôt inutile.

Autres conseils

Je ne vois aucun inconvénient à appeler une méthode statique à partir de une instance. Qu'est-ce qui ne va pas avec ça? En particulier, il y a souvent des méthodes utiles dans la logique d'une classe, mais qui n'ont pas besoin de manipuler l'instance elle-même.

Je ne ne souhaite pas appeler une méthode statique via une référence d'instance. Exemple classique:

Thread thread = new Thread(...);
thread.sleep(5000); // Doesn't do what it looks like

Cela vient avec un avertissement du compilateur dans certains IDE - certainement dans Eclipse, si vous l'activez. (Java / Compiler / Erreurs et avertissements / Style de code / Accès non statique à un membre statique.) Personnellement, j'estime que est une erreur dans la conception de Java. (C’est l’une des erreurs que C # a réussi à éviter de copier.)

L’accès aux méthodes statiques vous permet de partager des valeurs entre les instances de la même classe, voire d’obtenir les valeurs sans avoir besoin de créer une instance de classe.

Il y a des cas où cela est pratique et ne constitue pas une violation du langage OO.

Je parie que c'est parce que les concepteurs d'origine portaient des capacités de C ++ et que, lorsque le recul était de 20/20, il s'agissait d'un problème de compatibilité ascendante.

Cela, ou parce que lorsque vous appelez une méthode dans une classe, même si vous n'avez pas besoin de tout préfixer avec this. , le compilateur l'insère (ou son équivalent), y compris pour les méthodes statiques. Si les méthodes statiques ne peuvent pas être appelées à partir d'instances, il peut être problématique de placer this. à l'avant (ou de forcer les codeurs à indiquer le nom de classe à l'avant des méthodes statiques à chaque fois qu'ils souhaitent les utiliser. dans une instance réelle).

Quoi qu’il en soit, les réponses ne sont que spéculatives, à moins que l’un des premiers développeurs en langage ne réponde.

public class MyClass {
    public static String myString;
}


public class AnotherClass {
   public void doSomething() {
       doAnotherThing();
   }
   public static doAnotherThing() {
       MyClass.myString = "something";
   }

Nous accédons ici à une variable statique à partir d'une méthode non statique (indirectement) en appelant une méthode statique à partir d'une méthode non statique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top