说说 Java 内部类的基本用法

先从一个示例说起。该示例实现了迭代器模式的数组,可添加、可遍历数组内部的元素。而且还可以判断是否已到了数组末尾。

在这里插入图片描述

首先定义了一个接口,本质上是一个迭代器:

//迭代器接口
public interface Selector {
    //判断是否到了数组末尾
    boolean end();
    
    //获取当前索引所在元素
    Object current();
    
    //进入下一元素
    void next();
}

接下来是主类:

// 数组序列
public class Sequence {
    
    // Object 数组
    private Object[] items;
    
    //初始索引
    private int next = 0;
    
    //初始化序列,设定序列长度
    public Sequence(int size) {
        items = new Object[size];
    }
    
    //新增元素
    public void add(Object x) {
        if (next < items.length) {
            items[next++] = x;
        }
    }
    
    //实现了 Selector 接口的内部类
    private class SequenceSelector implements Selector {
        //初始索引
        private int i = 0;
        //是否已到数组末尾
        public boolean end() {
            return i == items.length;
        }
        //获取当前索引所在元素
        public Object current() {
            return items[i];
        }
        //索引加 1
        public void next() {
            if (i < items.length)
                i++;
        }


    }
    // 初始化 Selector 内部类实例
    public Selector selector() {
        return new SequenceSelector();
    }

    public static void main(String[] args) {
        //初始化一个具有 10 个元素的序列
        Sequence sequence = new Sequence(10);
        for (int i = 0; i < 10; i++) {
            sequence.add(Integer.toString(i));
        }
        
        //迭代输出
        Selector selector = sequence.selector();
        while (!selector.end()) {
            System.out.print(selector.current() + " ");
            selector.next();
        }
    }
}

有以下几点需要注意:

  1. 在主类中定义了返回内部类实例的方法(比如示例中的 Sequence#selector 方法),以供外部调用。这个内部类是私有的,所以可以通过这种方式被外部访问到。

  2. 内部类可以直接访问在主类中定义的属性或者方法,包括 private 标注的情况(比如示例中的 items 私有属性)。


参考:
BruceEckel, 埃克尔, 陈昊鹏. Java编程思想[J]. 机械工业出版社, 2007.p.190-193

你可能感兴趣的:(说说 Java 内部类的基本用法)