2009-08-29 5 views
1

Consultez le code suivant: -bloc de classe principale dans '{}' exécute jamais

class Name { 

    {System.out.println("hi");} 

    public static void main(String[] args) { 
     System.out.println(waffle()); 
    } 

    static boolean waffle() { 
     try { 
      return true; 
     } finally { 
      return false; 
     } 
    } 
} 

Cela n'a jamais sorties "salut". Pourquoi est-ce?

+0

Pourquoi voudriez-vous attendre à exécuter? –

+1

le puzzle de l'énigme m'intrigue – NomeN

Répondre

24

Le code entre les accolades est instance initializer.

De The Java Language Specification, Third Edition, Section 8.6:

Un exemple initialiseur déclaré dans une classe est exécutée lorsqu'une instance de la classe est créé (§15.9), tel que spécifié dans §8.8.5.1.

Si la classe Name est exécutée, la méthode public static void main(String[]) est appelée par la machine virtuelle Java, mais la classe est Name n'est pas instancié, de sorte que le code dans l'initialiseur instance ne sera jamais exécutée.

Il y a aussi un static initializer, qui est similaire en apparence à la initialiseur instance, mais il a le mot-clé static devant:

static { 
    // Executed when a class is first accessed. 
} 

Encore une fois, de The Java Language Specification, Third Edition, Section 8.7:

Tous les initialiseurs statiques déclarés dans une classe sont exécutés lorsque la classe est initialisée et, avec tout initialiseurs de champ (§8.3.2) pour les clas s variables, peuvent être utilisées pour initialiser les variables de classe de la classe (§12.4).

La page Initializing Fields de The Java Tutorials a également des informations sur les blocs de initialiseur statiques et d'instance.

+0

Wow, je n'ai jamais su que c'était possible. Merci. – Owen

+0

Bien répondu, explication très approfondie. – Zaki

1

Je pense qu'il est activé uniquement lors de la création d'instance. Essayez de l'exécuter comme statique {...}

1

Le bloc doit être déclarée statique pour le faire fonctionner, à savoir statique {System.out.println (« salut »);}

Questions connexes