Java学习笔记008——内部类与接口的应用案例

当内部类与接口组合在一起的时候,可以真正展现内部类的实用性了。在一个类(顶层类)中定义一个内部类,让这个内部类实现一个接口(在顶层类之外,同包不同包都可),然后通过接口变量来引用这个内部类的实例,于是就不用和内部类的名称打交道,更重要的是可以屏蔽内部类的实现细节。

如下代码是一个简单案例:

java 复制代码
package com.test;

interface Iterator{
    /**
     * 接口:Iterator
     * 方法:hasNext() 返回一个布尔值
     * 方法:next()  返回一个字符串
     */
    boolean hasNext();
    String next();
}

public class StringHolder {
    /**
     * 类:StringHolder 用于存储字符串,并提供字符串的迭代功能
     */
    private String[] values;  // 属性:字符串数组
    private int pos;          // 属性:整数,数组的索引坐标

    /**
      类StringHolder的构造函数,参数是一个整数
      初始化类StringHolder私有属性values数组的长度
      初始化类StringHolder私有属性pos为0
    */
    public StringHolder(int length) {
        values = new String[length];
        pos = 0;
    }

    /**
     * 类StringHolder的成员方法,把参数值添加到类属性values数组中
     * @param val 一个字符串
     */
    public void put(String val) {
        this.values[pos++] = val;
    }

    /**
     * 根据参数返回类属性values数组中的一个元素
     * @param index 一个整数
     * @return 类属性values数组index索引的值
     */
    public String get(int index) {
        return values[index];
    }

    /**
     * 定义一个方法:iterator
     * @return 私有内部类StringIterator的实例
     * 因为类StringIterator是实现接口Iterator,
     * 类StringIterator实例对象作为返回值,该方法的类型是Iterator接口,故会发生向上转型,这是合法允许的。
     */
    public Iterator iterator() {
        return new StringIterator();
    }

    /**
     * 类StringHolder内部的一个私有类StringIterator,实现Iterator接口
     */
    private class StringIterator implements Iterator {
        private int ipos = 0;   // 私有属性ipos,初始值为0,用于从索引位置0开始迭代

        // 实现接口Iterator中定义的next()方法
        public String next() {
            return values[ipos++];
        }
        // 实现接口Iterator中定义的方法
        public boolean hasNext() {
            return ipos < values.length;
        }
    }

    public static void main(String[] args) {
        // 创建类StringHolder的实例,通过构造函数传入参数,将初始化类属性values数组的元素个数为10
        StringHolder sh = new StringHolder(10);
        // 调用类StringHolder成员方法put(),给类成员数组values赋值
        for(int i=0;i<10;i++){
            sh.put(((Integer)(i * 3)).toString());
        }

        // 创建接口Iterator类型变量it,通过类StringHolder实例中的方法iterator()赋值给变量it
        // it变量是StringIterator向上转型的实例对象
        Iterator it = sh.iterator();
        while (it.hasNext()) {
            System.out.print(it.next());
            System.out.print(" ");
        }

    }
}

代码理解:

(1)首先定义了一个接口Iterator,这个接口有两个方法分别是hasNext()和next()

(2)定义StringHolder类,这个类的作用是用于存储字符串,并提供字符串的迭代功能。

(3)在StringHolder类中定义了一个内部类StringIterator,StringItertor实现了接口Iterator(编写hasNext()和next()实现代码),

(3)在这个顶层类StringHolder中,定义了一个方法iterator,iterator方法返回的类型是接口Iterator,iterator方法内部创建了一个内部类StringIterator的实例,并返回它。该实例会被向上转型为接口类型。

(4)当需要使用这个内部类的实例时,调用外部类对象的iterator方法,并赋值给外部类中定义的Iterator接口类型的变量即可。如上面代码:

复制代码
Iterator it = sh.iterator();  //sh是顶层类的实例

(5)既然不需要直接访问内部类StringIterator,为了更好地屏蔽内部类的实现细节,把内部类声明为private,这样如同顶层类StringHolder的私有成员一样,无法在顶层类之外访问这个内部类StringIterator。

(6)上面是一段完整的可运行代码,运行结果是:0 3 6 9 12 15 18 21 24 27

总结学习知识点:

(1)使用了迭代器(Itertor)设计模式。在Java的类库中,有Iterator和Iterable接口,当外部类实现了Iterable接口,并且有一个内部类实现了Iterator接口之后,就可以使用"for each"循环来遍历外部类中的元素了。

利用上面提到的Java特性,上面StringHolder类就实现了一个字符串容器,且可以通过方法进行迭代。

(2)StringHolder类内部的实现采用数组来存储字符串。

相关推荐
武子康10 分钟前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
_Kayo_3 小时前
VUE2 学习笔记6 vue数据监测原理
vue.js·笔记·学习
YuTaoShao3 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
chenchihwen3 小时前
大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容
人工智能·学习
源码_V_saaskw3 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4044 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空4 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643145 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0015 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式