Cet article est l'article du 18ème jour du Calendrier de l'avent MicroAd 2017 .
Est-ce quelque chose auquel je ne pense généralement pas? Si je n'en parle pas maintenant, je n'en parlerai pas à l'avenir, alors parlons de statique en java.
Seulement statique mais statique, Lors de la rédaction d'un simple quiz, organisons à nouveau facilement les éléments statiques en java.
En premier lieu, statique signifie «statique». ~~ ~~
En disant "non dynamique", le champ est un seul dans la classe, quel que soit le nombre d'instances que vous créez.
Ajoutez des éléments statiques aux champs dont vous souhaitez partager les ressources et les informations qui continueront à être partagées entre plusieurs instances. Appelez-le avec
nom de classe.nom de champ` ``. Vous pouvez accéder à la même chose en créant et en appelant une instance.
La déclaration avec `` final static '' lors de la définition d'une constante empêche la même valeur d'être dupliquée dans l'instance à chaque fois que vous en créez une nouvelle, ce qui permet d'économiser de la mémoire.
public final static String KEY = "happy-toilet";
C'est une valeur fixe de Happy Toilet qui peut être appelée n'importe où.
La méthode statique elle-même appartient à la classe, pas à une instance de la classe.
Les appels peuvent être effectués directement avec
class name.method name``, et pour les références de méthode dans les interfaces fonctionnelles, avec ``
class name :: method name`` `.
Avec le champ statique, il est appelé un membre statique.
Les méthodes générales sans statique sont appelées méthodes non statiques et méthodes d'instance.
Vous trouverez ci-dessous les différences entre les appels de méthode statique et d'instance dans les références de méthode d'interface fonctionnelle depuis java8.
MethodReference.java
public class MethodReference {
public static void main(String[] args) {
//méthode statique
wakeUp(MethodReference::printWakeUp);
System.out.print(" and ");
//Méthode d'instance
MethodReference mr = new MethodReference();
mr.goToilet(mr::printGoToilet);
}
interface Human {
void doSomething();
}
static void wakeUp(Human human) {
human.doSomething();
}
static void printWakeUp() {
String wakeUp = "wake up";
System.out.print(wakeUp);
}
void goToilet(Human human) {
human.doSomething();
}
void printGoToilet() {
String toilet = "happy toilet";
System.out.print(toilet);
}
}
Le résultat est réveil et bonne toilette </ font>.
public class StaticPractice {
public static void main(String[] args) {
Human developer = new Developer();
System.out.println(developer.getMorning());
}
}
class Human {
static String morning = "Happy Toilet";
static String getMorning() {
return morning;
}
}
class Developer extends Human {
static String morning = "Happy Coding";
static String getMorning() {
return morning;
}
}
Bien sûr, le résultat est Happy Toilet </ font>.
Si vous le changez en Developer developer = new Developer ();
, vous pouvez faire Happy Coding pour le moment.
Cependant, ici, je crée une instance juste pour représenter `ne peut pas être remplacé 'et j'appelle à partir de cette instance, mais en premier lieu, la méthode statique est
Human.getMorning();
Developer.getMorning();
Et, il est souhaitable de faire référence à partir de la classe elle-même sans passer par l'instance.
En fait, si vous transférez simplement le code ci-dessus vers IntelliJ
Noté comme une méthode statiquenon référencée par la
classe elle-même.
(Un merci spécial à @kawamnv)
public static void main(String [] args) En effet, lorsque la méthode main est appelée, l'instance n'existe pas encore en mémoire, donc la méthode main doit être exécutée même si la classe qui la contient n'est pas instanciée.
Il existe trois types de classes, classes internes, classes membres, classes locales et classes anonymes. La classe membre statique est l'une des classes membres et l'emplacement de la déclaration est dans le bloc de classe (la même position que le champ et la méthode). Cependant, à proprement parler, la classe membre statique est difficile à appeler une classe interne, et il est plus correct de la décrire comme une classe complètement différente.
Si vous appelez la classe qui entoure la classe interne la classe externe, Il a une relation relativement faible avec la classe externe et ses instances, et peut accéder aux membres statiques de la classe externe.
Comme d'autres choses statiques, il est utilisé avec ```external class name.member class name` ``.
Outer.java
class Outer { //Classe externe
//Classe de membre ➀ classe statique
static class StaticInner {
private Integer in;
public Integer getIn() {
return in;
}
public void setIn(Integer in) {
this.in = in;
}
}
//Classe de membre ➁ Classe de membre stricte
class Inner {
private String str;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
}
}
Les appels dans les classes et les méthodes principales non pertinentes sont:
Execute.java
class Execute {
public static void main(String[] args) {
//classe statique
Outer.StaticInner staticInner = new Outer.StaticInner();
//Classe de membre stricte
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
}
}
Comme je l'ai inclus dans l'exemple ci-dessus, une classe membre stricte a des liens étroits avec les instances individuelles créées par la classe externe, donc new ne peut pas être fait sans une instance de la classe externe. Comme ce n'est pas une chose statique, les membres non statiques sont également autorisés à accéder.
static {
//En traitement
}
Un initialiseur statique est un bloc qui n'est exécuté qu'une seule fois lorsqu'une classe est chargée (le fichier .class est chargé). Décrivez le processus que vous souhaitez appeler et exécuter avant d'instancier une classe ou avant la méthode main. Bien sûr, vous ne pouvez décrire que des choses statiques.
Y a-t-il une utilité pour cela? J'ai pensé,
public final static String VALUE;
static {
VALUE = makeValue();
}
/**
*Générer dynamiquement des valeurs sous certaines conditions
* @valeur de retour valeur générée
*/
private static String makeValue() {
// omit
}
L'autre jour, j'ai pu essayer ce genre d'utilisation par accident. Je pense que c'était juste parce que le but était de "créer une nouvelle valeur une seule fois au début, avant l'instanciation" et de la réutiliser.
class Something {
void printA() {
System.out.print("t");
}
void printB() {
System.out.print("e");
}
Something () {
System.out.print("l");
printB();
}
static {
System.out.print("i");
}
}
class StaticTest {
static {
System.out.print("T");
}
public static void main(String [] args) {
System.out.print("o");
new Something().printA();
}
}
Le résultat est Toilet </ font>. Vous pouvez voir que l'initialiseur statique est appelé plus tôt que le constructeur qui est finalement appelé par new (instanciation).
Introduit depuis java5.
Voici la source utilisée lors de la création de l'annotation de contrainte pour le article précédent .
CustomSize.java
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = {CustomSizeValidator.class})
public @interface CustomSize {
// omit
}
En fait, ElementType
et `` `RetentionPolicy``` sont des énumérations avec des noms de paquet longs, vous pouvez donc les écrire proprement comme ci-dessus.
S'il s'agit d'un membre statique d'une classe externe, il peut être utilisé même s'il n'est pas enum.
import static java.lang.System.*;
import static java.lang.Math.*;
Il est très important de reconfirmer les bases de la grammaire autant que la première toilette du matin.
c'est tout
Recommended Posts