page contents

静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?

轩辕小不懂 发布于 2021-07-22 14:11
阅读 590
收藏 0
分类:Java开发
1358
Nen
Nen
- 程序员

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的

如下所示。

[java]

package com.lovo;  

/** 

 * 扑克类(一副扑克) 

 * @author 骆昊 

 * 

 */  

public class Poker {  

    private static String[] suites = {"黑桃", "红桃", "草花", "方块"};  

    private static int[] faces = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};  

    private Card[] cards;  

     

    /** 

     * 构造器 

     *  

     */  

    public Poker() {  

        cards = new Card[52];  

        for(int i = 0; i < suites.length; i++) {  

            for(int j = 0; j < faces.length; j++) {  

                cards[i * 13 + j] = new Card(suites[i], faces[j]);  

            }  

        }  

    }  

      

    /** 

     * 洗牌 (随机乱序) 

     *  

     */  

    public void shuffle() {  

        for(int i = 0, len = cards.length; i < len; i++) {  

            int index = (int) (Math.random() * len);  

            Card temp = cards[index];  

            cards[index] = cards[i];  

            cards[i] = temp;  

        }  

    }        


    /** 

     * 发牌 

     * @param index 发牌的位置 

     *  

     */  

    public Card deal(int index) {  

        return cards[index];  

    }    


    /** 

     * 卡片类(一张扑克) 

     * [内部类] 

     * @author 骆昊 

     * 

     */  

    public class Card {  

        private String suite;   // 花色  

        private int face;       // 点数  

        public Card(String suite, int face) {  

            this.suite = suite;  

            this.face = face;  

        }    

        @Override  

        public String toString() {  

            String faceStr = "";  

            switch(face) {  

            case 1: faceStr = "A"; break;  

            case 11: faceStr = "J"; break;  

            case 12: faceStr = "Q"; break;  

            case 13: faceStr = "K"; break;  

            default: faceStr = String.valueOf(face);  

            }  

            return suite + faceStr;  

        }  

    }  

}  

测试类:

[java] 

package com.lovo;  

class PokerTest {  


    public static void main(String[] args) {  


        Poker poker = new Poker();  


        poker.shuffle();            // 洗牌  


        Poker.Card c1 = poker.deal(0);  // 发第一张牌  

        // 对于非静态内部类Card  

        // 只有通过其外部类Poker对象才能创建Card对象  

        Poker.Card c2 = poker.new Card("红心", 1);    // 自己创建一张牌  

        System.out.println(c1);     // 洗牌后的第一张  

        System.out.println(c2);     // 打印: 红心A  

    }  


}  

请先 登录 后评论