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<Card> protoDeck = new ArrayList<Card>();
// Initialize prototype deck
**static** {
for (Suit suit : Suit.values())
for (Rank rank : Rank.values())
protoDeck.add(new Card(rank, suit));
}
public static ArrayList<Card> newDeck() {
return new ArrayList<Card>(protoDeck); // Return copy of prototype deck
}
}
我有一个简单的问题。在静态关键字声明之后立即启动的代码块,是什么类型的方法?我以前从未见过这个。如果有人能够启发我,那将非常感激。感谢。
答案 0 :(得分:16)
这不是方法,而是类的静态初始化块。您可以在Java Language Specification。
中详细了解相关信息加载类后,内部代码执行一次。
答案 1 :(得分:3)
正如Grzegorz正确指出的那样,它是 static initializer block 。
Here is another resource解释了类初始化和实例化之间的区别,以及调用类变量和静态初始化程序块的顺序。
一个相关的概念是实例初始化程序块,它可以与匿名类一起用于方便的 double-brace initialization 习语:
private static final Set<String> VALID_CODES = new HashSet<String>() {{
add("XZ13s");
add("AB21/X");
add("YYLEX");
add("AR2D");
}};
答案 2 :(得分:0)
知道初始化顺序也很好,因为我记得这个顺序首先是静态变量,而不是静态块。同样重要的是这个静态块执行的时间 - 在第一次提到相应的类时,而不是在类实例创建时。