【问题标题】:Unusual "static" method declaration不寻常的“静态”方法声明
【发布时间】:2010-05-25 07:39:44
【问题描述】:
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
    }
}

我有一个简单的问题。在静态关键字声明之后开始的代码块,那是什么类型的方法?我以前从未见过。如果有人能启发我,那将不胜感激。谢谢。

【问题讨论】:

    标签: java


    【解决方案1】:

    这不是一个方法,而是一个类的静态 Initializer 块。您可以在Java Language Specification 中了解更多信息。

    其中的代码在加载类后执行一次。

    【讨论】:

    • +1:简明扼要,供进一步阅读参考,解释清楚。这就是 SO 的全部意义所在……
    • 感谢您快速而完美的回复!
    【解决方案2】:

    正如 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");
    }};
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-05-12
        • 2014-11-09
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        相关资源
        最近更新 更多