12
votes

Que se passe-t-il lorsqu'une méthode statique est invoquée à l'aide d'une référence nulle objet?

public class CallingStaticMethod {
public static void method() {
    System.out.println("I am in method");
}
public static void main(String[] args) {
    CallingStaticMethod csm = null;
    csm.method();
   }
}
Can someone explain how the static method is invoked in the above code?

2 commentaires

Chaque fois que vous écrivez du code comme celui d'un chaton meurt


@Fuzzy Lollipop ::) @OP: années et il y a des années et des années, j'ai été mordu (et mordant dur) par ce comportement, pour la simple raison pour laquelle il ne m'avait jamais rencontré d'appeler une méthode de classe à l'aide de la notation d'instance. (Donc, j'ai pensé appelais une méthode d'instance, et c'est là que le problème a commencé.) Évitez de le faire à tout prix (pas que je pense que vous dites que vous voulez; ma prise est que vous êtes confus, pourquoi ça ne veut pas t ne pas compiler).


5 Réponses :


22
votes

Il a été optimisé par le compilateur, simplement parce que d'avoir une instance de la classe n'est pas nécessaire. Le compilateur remplace fondamentalement xxx

par xxx

C'est en général une bonne pratique de le faire vous-même. Même l'IDE moyen serait avertir vous sur l'accès à des méthodes statiques à travers une instance, au moins Eclipse fait ici.


7 commentaires

Je ne pense pas que ce soit ça. Vous pouvez appeler des méthodes statiques à l'aide de la syntaxe d'instance, qu'il puisse être optimisé ou non. Je suis un peu surpris par cette formulation particulière travaillant, mais je suppose que cela a du sens. :-)


Il peut toujours être optimisé par le compilateur, car il est statique.


Les compilateurs peuvent optimiser le code de nombreuses façons de la rendre plus rapide. Sans instance, vous n'avez pas besoin d'allouer / saisir du tas, etc.


@Bozho: Ouais, je suppose que c'est une autre façon de le regarder. Je n'aurais pas tendance à y penser comme une optimisation , mais c'est juste une chose sémantique.


Je reformulerais cette réponse (mais je ne vais pas aller le modifier; ce serait pushy): Je dirais "Vous pouvez utiliser la notation d'instance pour appeler des méthodes de classe, même si ce n'est pas une bonne idée. Comme vous avez Découvert, l'instance n'a pas d'importance du tout et peut même être null - c'est le type de variable d'instance qui détermine ce que la classe est, et donc quelle méthode de classe est appelée. Évitez de faire cela. "


Assez juste. J'ai étendu / reformulé un peu.


@ T.J. Crowder, pourquoi ne pas soumettre votre propre réponse à la question qui dit cela?



3
votes

Java vous permet d'utiliser une instance de classe pour appeler des méthodes statiques, mais vous ne devez pas confondre cette allocation comme si la méthode serait appelée sur l'instance utilisée pour l'appeler.

instance.method ();

est la même que

classe.method ();


2 commentaires

Oui, appelerStaticMethod.Method () Pour utiliser l'exemple de la question.


C'est ça. Il y avait une cloche très éloignée qui sonne dans ma tête. Je semble me rappeler avoir été mordu par celui-ci (je jamais Utilisez des instances pour appeler des méthodes de classe.)



0
votes

Eh bien c'est parfaitement ok. La méthode statique n'est pas accessible par l'instance d'objet de la classe A. Vous l'appelez par le nom de la classe ou la référence, le compilateur l'appellera par une instance de la classe Java.lang.class.

FYI, chaque classe (appelanteStaticmethod dans l'illustration ci-dessus) en Java est une instance de la classe 'java.lang.class'. Et chaque fois que vous définissez une classe, l'instance est créée comme java.lang.class appelingStaticMethod = nouveau java.lang.class ();

La méthode est donc appelée sur "CallingStaticMethod" et donc Null Pointer Exception ne se produira pas.

J'espère que cela aide.


0 commentaires

0
votes

oui nous pouvons. Il lancera NullpointeException Seulement si nous appelons une méthode non statique avec NULL objet. Si la méthode est statique, elle exécutera et si la méthode est non statique, elle passera via une NPE ...

Pour en savoir plus, cliquez ici ...


0 commentaires

1
votes

La spécification de langue Java indique que la référence obtenue est évaluée, puis supprimée, puis la méthode statique est invoquée.
15.12.4.1. Compute Référence cible (si nécessaire)

Il s'agit du même comportement lorsque vous utilisez le cette référence pour appeler une méthode statique. Ce est évalué, puis jeté alors la méthode est appelée.

Il existe même un exemple dans la spécification similaire à votre exemple.

Lorsqu'une référence cible est calculée, puis jetée car le mode d'invocation est statique, la référence n'est pas examinée pour voir s'il est NULL: xxx


0 commentaires