博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
阅读量:5244 次
发布时间:2019-06-14

本文共 2327 字,大约阅读时间需要 7 分钟。

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

/** * 扑克类(一副扑克) * @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;        }    }}

 测试

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    }}

 产生编译错误

class Outer {     class Inner {}     public static void foo() { new Inner(); }     public void bar() { new Inner(); }     public static void main(String[] args) {        new Inner();    }}

 

转载于:https://www.cnblogs.com/gjack/p/8901717.html

你可能感兴趣的文章
MySQL 学习笔记 一
查看>>
【转发】NPAPI开发详解,Windows版
查看>>
(转)3D模板阴影原理
查看>>
冒泡排序
查看>>
基于div表单模拟右对齐
查看>>
利用Azure Automation实现云端自动化运维(1)
查看>>
使用Microsoft R进行机器学习和模型发布(1)
查看>>
【英宝通Unity4.0公开课学习 】(一)资源管理
查看>>
常用JS整理
查看>>
jquery.cookie.js插件一个小bug
查看>>
启动Nginx、查看nginx进程、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级
查看>>
C语言文件操作
查看>>
VIM中执行Shell命令(炫酷)
查看>>
web移动开发小贴士
查看>>
正则表达式收集
查看>>
Apache BenchMark压力测试
查看>>
plist文件的归档,解档
查看>>
并发编程总结
查看>>
Linux下打开windows中文文本乱码问题
查看>>
分享11个简单优雅的动画设计作品集展示网站
查看>>