Histoire statique Java

introduction

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.

objectif

Seulement statique mais statique, Lors de la rédaction d'un simple quiz, organisons à nouveau facilement les éléments statiques en java.

champ statique

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ù.

méthode statique (méthode de classe)

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>.

Ne peut pas être remplacé

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

alert.png

Noté comme une méthode statiquenon référencée par laclasse 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.

classe statique (classe interne statique)

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.

initialiseur statique

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.

Constructeur et initialiseur statique

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).

déclaration d'importation statique

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.*;

La fin

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