不寻常的“静态”方法声明

public class Card { public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE } public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES } private final Rank rank; private final Suit suit; private Card(Rank rank, Suit suit) { this.rank = rank; this.suit = suit; } public Rank rank() { return rank; } public Suit suit() { return suit; } public String toString() { return rank + " of " + suit; } private static final List protoDeck = new ArrayList(); // Initialize prototype deck **static** { for (Suit suit : Suit.values()) for (Rank rank : Rank.values()) protoDeck.add(new Card(rank, suit)); } public static ArrayList newDeck() { return new ArrayList(protoDeck); // Return copy of prototype deck } } 

我有一个快速的问题。 在静态关键字声明之后立即启动的代码块,是什么类型的方法? 我以前从未见过。 如果有人能够启发我,那将非常感激。 谢谢。

这不是方法,而是类的静态初始化程序块。 您可以在Java语言规范中阅读更多相关信息。

加载类后,内部代码执行一次。

正如Grzegorz正确指出的那样,它是一个静态初始化块

这是解释类初始化实例化之间差异的另一个资源 ,以及调用类变量和静态初始化程序块的顺序。

一个相关的概念是实例初始化块 ,它可以与匿名类一起用于方便的双括号初始化习惯用法:

 private static final Set VALID_CODES = new HashSet() {{ add("XZ13s"); add("AB21/X"); add("YYLEX"); add("AR2D"); }}; 

知道初始化顺序也很好,因为我记得这个顺序首先是静态变量,而不是静态块。 同样重要的是这个静态块执行的时间 – 在第一次提到相应的类时,而不是在类实例创建时。