118 votes

Champs statiques sur une référence nulle en Java

static membres ( static ou static méthodes) en Java sont associées à leur classe respective plutôt qu'aux objets de cette classe. Le code suivant tente d'accéder à un champ statique sur un objet de la classe null référence.

public class Main
{
    private static final int value = 10;

    public Main getNull()
    {
        return null;
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        System.out.println("value = "+main.getNull().value);
    }
}

Bien que main.getNull() renvoie à null il fonctionne et affiche value = 10 . Comment ce code fonctionne-t-il ?

93voto

assylias Points 102015

Ce comportement est spécifié dans le Spécification du langage Java :

une référence nulle peut être utilisée pour accéder à une variable de classe (statique) sans provoquer d'exception.

Plus en détail, une évaluation statique sur le terrain tels que Primary.staticField fonctionne comme suit (c'est moi qui souligne) - dans votre cas, Primary = main.getNull() :

  • L'expression primaire est évaluée, et le résultat est rejeté . [...]
  • Si le champ est un champ final non vierge, alors le résultat est la valeur de la variable de classe spécifiée dans la classe ou l'interface qui est le type de l'expression primaire. [...]

19voto

SLaks Points 391154

Car, comme vous l'avez dit, les champs statiques ne sont pas associés à une instance.

La possibilité d'accéder à des champs statiques à partir d'une référence d'instance (comme vous le faites) est simplement un sucre syntaxique et n'a aucune signification supplémentaire.
Votre code se compile en

main.getNull(); 
Main.value

3voto

Kumar Vivek Mitra Points 19369
  1. Accéder à un static avec le nom de la classe est légale, mais ses non ont été écrites que l'on ne peut pas accéder au static en utilisant la variable de référence de l'objet. Donc ça marche ici.

  2. A null est autorisée à accéder à une variable de référence d'objet static classe sans lever une exception, que ce soit à la compilation ou à l'exécution. d'exécution.

3voto

Rais Alam Points 3162

Lorsque vous accédez à une variable statique ou à une méthode avec des objets au moment de la compilation, elle est convertie en nom de classe, par exemple :

Main main = null;
System.out.println(main.value);

Il imprimera la valeur de la variable statique valeur car au moment de la compilation, elle sera convertie en

System.out.println(Main.value);

Preuve :

téléchargez le décompilateur et décompilez votre fichier .class en fichier .java et vous pourrez voir que toutes les méthodes statiques ou variables référencées sont automatiquement remplacées par le nom de la classe.

2voto

Les variables statiques et les méthodes appartiennent toujours à la classe. Ainsi, lorsque nous créons un objet, seules les variables et les méthodes non statiques vont dans le tas avec l'objet, mais les statiques résident dans la zone des méthodes avec la classe. C'est pourquoi, lorsque nous essayons d'accéder à une variable statique ou à une méthode, le nom de la classe est converti en nom de variable ou de méthode.

Veuillez vous référer au lien ci-dessous pour plus de détails.

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X