static
les membres ( static
champs ou static
méthodes) en Java sont associés à leur classe respective plutôt qu'aux objets de cette classe. Le code suivant tente d'accéder à un champ statique sur une 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()
retourne null
, cela fonctionne et s'affiche value = 10
. Comment fonctionne ce code?
Main main = null; main.getNull().value
.new Thread[]{}[-1].sleep(10);
où sleep () est une méthode statique. Cela réussissait sur certaines anciennes versions de Java.Réponses:
Ce comportement est spécifié dans la spécification du langage Java :
Plus en détail, une évaluation de champ statique ,
Primary.staticField
comme suit (c'est moi qui souligne) - dans votre casPrimary = main.getNull()
,:la source
Parce que, comme vous l'avez dit, les champs statiques ne sont pas associés à une instance.
La possibilité d'accéder aux 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
la source
Chaque fois que 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:
Il affichera la valeur de la valeur de la variable statique car au moment de la compilation, il sera converti en
Preuve:
Téléchargez le décompilateur et décompilez votre fichier .class en fichier .java et vous pouvez voir toutes les méthodes statiques ou le nom d'objet référencé variable est automatiquement remplacé par le nom de classe.
la source
L'accès à un
static
membre avec le nom de classe est légal, mais son no a été écrit que l'on ne peut pas accéder austatic
membre en utilisant la variable de référence d'objet. Donc ça marche ici.Une
null
variable de référence d'objet est autorisée à accéder à unestatic
variable de classe sans lever d'exception au moment de la compilation ou de l'exécution.la source
La variable statique et la méthode appartiennent toujours à la classe. Ainsi, chaque fois que nous créons un objet, seules les variables et les méthodes non statiques sont mises en tas avec l'objet, mais la statique réside dans la zone de méthode avec la classe. C'est pourquoi chaque fois que nous essayons d'accéder à une variable statique ou à une méthode, elle est convertie en nom de classe dot variable ou en nom 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
la source