Java内部类如何正确运用?

2026-05-17 00:261阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计777个文字,预计阅读时间需要4分钟。

Java内部类如何正确运用?

首先,从一个示例说起。以下是一个实现了迭代器模式的简单Python类,该类可以添加、遍历数组内部的元素,并且可以判断是否到达了数组的末尾。

Java内部类如何正确运用?

pythonclass ArrayIterator: 迭代器模式实现数组遍历

def __init__(self, array): self.array=array self.index=0

def __iter__(self): return self

def __next__(self): if self.index >=len(self.array): raise StopIteration result=self.array[self.index] self.index +=1 return result

def has_next(self): 判断是否到达数组末尾 return self.index

示例使用my_array=[1, 2, 3, 4, 5]iterator=ArrayIterator(my_array)

遍历数组for element in iterator: print(element)

判断是否到达末尾print(Has next:, iterator.has_next())

在这个示例中,`ArrayIterator` 类定义了一个迭代器,它封装了一个数组,并提供了迭代和判断是否到达末尾的方法。通过重写 `__iter__` 和 `__next__` 方法,我们使得这个类符合迭代器协议。`has_next` 方法用于检查是否还有更多的元素可以迭代。

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

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

//迭代器接口 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

本文共计777个文字,预计阅读时间需要4分钟。

Java内部类如何正确运用?

首先,从一个示例说起。以下是一个实现了迭代器模式的简单Python类,该类可以添加、遍历数组内部的元素,并且可以判断是否到达了数组的末尾。

Java内部类如何正确运用?

pythonclass ArrayIterator: 迭代器模式实现数组遍历

def __init__(self, array): self.array=array self.index=0

def __iter__(self): return self

def __next__(self): if self.index >=len(self.array): raise StopIteration result=self.array[self.index] self.index +=1 return result

def has_next(self): 判断是否到达数组末尾 return self.index

示例使用my_array=[1, 2, 3, 4, 5]iterator=ArrayIterator(my_array)

遍历数组for element in iterator: print(element)

判断是否到达末尾print(Has next:, iterator.has_next())

在这个示例中,`ArrayIterator` 类定义了一个迭代器,它封装了一个数组,并提供了迭代和判断是否到达末尾的方法。通过重写 `__iter__` 和 `__next__` 方法,我们使得这个类符合迭代器协议。`has_next` 方法用于检查是否还有更多的元素可以迭代。

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

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

//迭代器接口 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