Nécessité de bloc statique en Java

J'ai trouvé qu'en Java, il y a une fonctionnalité appelée static block, qui inclut le code qui est exécuté lorsqu'une classe est chargée pour la première fois (je ne comprends pas ce que "chargé" les moyens, ça veut dire initialisé?). Est-il une raison pour faire l'initialisation de bits à l'intérieur d'un bloc statique et pas dans le constructeur? Je veux dire, même le constructeur fait la même chose, faire toutes les choses nécessaires lorsqu'une classe est d'abord initialisé. est-il rien de statique bloc qui accomplit un constructeur ne peut pas?

  • Appelé dès que la classe est chargée par le chargeur de classes. Pas à chaque fois que la classe est instanciée.
  • S'il vous plaît, jetez un oeil à les chapitres suivants de l'Officiel Tutoriel Java (Oracle): Compréhension de l'Instance et les Membres de la Classe et Initialisation des Champs. Revenir si vous avez encore des doutes.
  • Seulement un non-sequitur question, si une classe arrive à avoir les deux main et un constructeur, qui est invoqué précédemment lorsqu'une instance de la classe est créée?
  • Code d'initialisation (Classloading temps) -> Main (Application point d'entrée) -> Constructeurs: Voici un exemple pour illustrer le point.
  • Pour l'exemple que vous avez fournies, pourquoi n'est-il pas de tomber dans une récursion infinie? Je veux dire, la première fois que la classe Main est invoquée, la statique bloc est exécuté tout droit. Mais depuis le Main classe est elle-même à nouveau invoquée à l'intérieur de la main méthode, ils vont créer de nouvelles instances de Main. Tout en étant instancié, la statique bloc ne sera pas exécuté, mais leur main méthodes d'exécution, la création de deux nouvelles instances, et ainsi de suite.
  • Une classe est chargé et initialisé (y compris l'exécution de tout static les blocs et les initialiseurs statiques) avant tout des instances sont créées. (Cela peut être déclenchée par la tentative de créer une instance, mais c'est un processus distinct de la création de l'instance.) Plus tard lorsque vous créer des instances de cette classe, les blocs statiques ne sont pas exécutées à nouveau (il en va de même pour les initialiseurs statiques). Ainsi il n'y aura pas de récursivité pour une classe avec un static bloc et main méthode.
  • Le main méthode est de ne pas exécuter à chaque fois qu'une instance d'une classe est créée. C'est uniquement lorsque explicitement invoqué (comme toute autre méthode statique) ou lorsque la JVM commence l'application.
  • Juste la création d'une instance d'une classe avec une méthode main ne sera pas l'appeler. Rappelez-vous que la principale méthode est un static point d'entrée qui sera exécuté implicity par la JVM une fois. Alors vous avez certainement peut invoquer la main méthode explicitement et même dans un de manière récursive mode, il a définitivement sonne comme une mauvaise idée :).
  • Ressemble à une copie de stackoverflow.com/questions/2420389/...
  • Quelqu'un peut-il expliquer ce qu'on entend par "chargé"? Comment est-il différent de "initialisé'?
  • C'est tous les énoncés en détail sanglant dans Chapitre 5 de la Machine Virtuelle Java Specification. Grosso modo, le "chargement" est la lecture de l'octet codes dans la mémoire lorsque "initialisé" signifie que le code d'initialisation de la classe est exécutée.
  • Je passais par le Chapitre 12 à docs.oracle.com/javase/specs/jls/se7/html/..., et je ne pouvais pas déchiffrer la tête et la queue de il. Pouvez-vous m'indiquer une meilleure ressource qui parle tout autant à la longueur, mais beaucoup plus de lucidité, et si possible, avec un certain nombre d'exemples?
  • Google est votre ami ici. Ce sujet est compliqué, donc ne vous attendez pas quelque chose qui est facile à digérer. Cette introduction sur le sujet peut-être ce que vous cherchez.
  • Ouais, il a l'air vraiment compliqué. Va me prendre tout à fait un peu d'effort et de temps pour digérer tout ça..

InformationsquelleAutor SexyBeast | 2012-12-21