Ma question concerne une utilisation particulière du mot-clé statique. Il est possible d'utiliser des static
mots clés pour couvrir un bloc de code dans une classe qui n'appartient à aucune fonction. Par exemple, le code suivant se compile:
public class Test {
private static final int a;
static {
a = 5;
doSomething(a);
}
private static int doSomething(int x) {
return (x+5);
}
}
Si vous supprimez le static
mot clé, il se plaint car la variable a
est final
. Cependant , il est possible d'enlever les deux final
et static
mots - clés et qu'il compile.
C'est déroutant pour moi dans les deux sens. Comment suis-je censé avoir une section de code qui n'appartient à aucune méthode? Comment est-il possible de l'invoquer? En général, quel est le but de cette utilisation? Ou mieux, où puis-je trouver de la documentation à ce sujet?
la source
public static void staticMethod(){}
, si vous exécutezTestStatic.class.getMethod("staticMethod");
. L'initialiseur statique ne sera pas appelé. Plus d'informations ici docs.oracle.com/javase/specs/jvms/se10/html/…Uff! qu'est-ce qu'un initialiseur statique?
L'initialiseur statique est un
static {}
bloc de code à l'intérieur de la classe java, et ne s'exécute qu'une seule fois avant l'appel du constructeur ou de la méthode principale.D'ACCORD! Dis m'en plus...
static { ... }
dans n'importe quelle classe java. et exécuté par une machine virtuelle lorsque la classe est appelée.return
déclaration n'est prise en charge.this
ousuper
pris en charge.Hmm, où puis-je l'utiliser?
Peut être utilisé partout où vous vous sentez bien :) aussi simple que cela. Mais je vois la plupart du temps qu'il est utilisé lors de la connexion à la base de données, du lancement de l'API, de la journalisation, etc.
Ne vous contentez pas d'aboyer! où est l'exemple?
Production???
J'espère que cela t'aides!
la source
afterPropertiesSet()
deInitializingBean
?Le
static
bloc est un "initialiseur statique".Il est automatiquement invoqué lorsque la classe est chargée, et il n'y a pas d'autre moyen de l'invoquer (même pas via Reflection).
Je ne l'ai personnellement utilisé que lors de l'écriture de code JNI:
la source
Method
instance mais uniquement invoqué par la machine virtuelle Java.Ceci est directement de http://www.programcreek.com/2011/10/java-class-instance-initializers/
1. Ordonnance d'exécution
Regardez la classe suivante, savez-vous laquelle est exécutée en premier?
Production:
2. Comment fonctionne l'initialiseur d'instance Java?
L'initialiseur d'instance ci-dessus contient une instruction println. Pour comprendre comment cela fonctionne, nous pouvons le traiter comme une déclaration d'affectation de variable, par exemple
b = 0
. Cela peut rendre la compréhension plus évidente.Au lieu de
int b = 0
, tu pourrais écrirePar conséquent, les initialiseurs d'instance et les initialiseurs de variable d'instance sont à peu près les mêmes.
3. Quand les initialiseurs d'instance sont-ils utiles?
L'utilisation d'initialiseurs d'instance est rare, mais elle peut néanmoins être une alternative utile aux initialiseurs de variable d'instance si:
Bien sûr, un tel code pourrait être écrit dans des constructeurs. Mais si une classe avait plusieurs constructeurs, vous devrez répéter le code dans chaque constructeur.
Avec un initialiseur d'instance, vous pouvez simplement écrire le code une fois, et il sera exécuté quel que soit le constructeur utilisé pour créer l'objet. (Je suppose que ce n'est qu'un concept et qu'il n'est pas souvent utilisé.)
Un autre cas dans lequel les initialiseurs d'instance sont utiles sont les classes internes anonymes, qui ne peuvent déclarer aucun constructeur du tout. (Est-ce que ce sera un bon endroit pour placer une fonction de journalisation?)
Merci à Derhein.
Notez également que les classes anonymes qui implémentent des interfaces [1] n'ont pas de constructeurs. Par conséquent, les initialiseurs d'instance sont nécessaires pour exécuter tout type d'expressions au moment de la construction.
la source
"final" garantit qu'une variable doit être initialisée avant la fin du code d'initialisation de l'objet. De même, "static final" garantit qu'une variable sera initialisée par le code d'initialisation de fin de classe. Omettre le "statique" de votre code d'initialisation le transforme en code d'initialisation d'objet; ainsi votre variable ne satisfait plus à ses garanties.
la source
Vous n'écrirez pas de code dans un bloc statique qui doit être appelé n'importe où dans votre programme. Si le but du code doit être invoqué, vous devez le placer dans une méthode.
Vous pouvez écrire des blocs d'initialisation statiques pour initialiser des variables statiques lorsque la classe est chargée, mais ce code peut être plus complexe.
Un bloc d'initialisation statique ressemble à une méthode sans nom, sans argument et sans type de retour. Comme vous ne l'appelez jamais, il n'a pas besoin de nom. La seule fois où elle est appelée, c'est lorsque la machine virtuelle charge la classe.
la source
lorsqu'un développeur utilise un bloc d'initialisation, le compilateur Java copie l'initialiseur dans chaque constructeur de la classe actuelle.
Exemple:
le code suivant:
est équivalent à:
J'espère que mon exemple est compris par les développeurs.
la source
Le bloc de code statique peut être utilisé pour instancier ou initialiser des variables de classe (par opposition aux variables d'objet). Ainsi, déclarer "a" statique signifie qu'il n'est partagé que par tous les objets Test, et le bloc de code statique initialise "a" une seule fois, lorsque la classe Test est chargée pour la première fois, quel que soit le nombre d'objets Test créés.
la source