在SeqList类中声明了一个内部类MyInt ,通过调用SeqList类的iterator方法,返回该内部类对象。但是该内部类对象是用到了外部类层成员变量的。如何获取?
package com.suanfa.xxb;
import com.suanfa.utils.Assert;
import java.util.Arrays;
import java.util.Iterator;
public class SeqList<T> implements Iterable<T> {
private T[] eles;
private int n;
public SeqList(int capacity){
this.eles = (T[])new Object[capacity];
this.n = 0;
}
//清空线性表
public void clear(){
this.n = 0;
}
public boolean isEmpty(){
return n == 0;
}
public int length(){
return this.n;
}
public T get(int i){
return eles[i];
}
//向线性表中插入元素T
public void insert(T t){
//默认插入到最后
eles[n++] = t;
}
//指定位置插入元素
public void insertIndex(T t,int index){
// Assert.express(index < 0);
//Assert.express(n - 1 > index );
//该下标往后的所有元素向右移
for (int i = n; i >= index ; i--) {
eles[i] = eles[i - 1];
}
eles[index] = t;
n++;
}
//删除一个元素
public T remove(int index){
T t = eles[index];
//后一个元素覆盖前一个元素
for (int i = index; i < n ; i++) {
eles[i] = eles[i + 1];
}
n--;
return t;
}
public int indexOf(T t){
for (int i = 0; i < n; i++) {
T ele = eles[i];
if (ele.equals(t)){
return i;
}
}
return -1;
}
@Override
public Iterator<T> iterator() {
return new MyInt();
}
private class MyInt implements Iterator<T>{
private int cousor;
public MyInt(){
this.cousor = 0;
}
@Override
public boolean hasNext() {
return cousor < n;
}
@Override
public T next() {
return eles[cousor++];
}
}
}
测试方法
//数组取值和差值,都不能超过最大下标
public static void main(String[] args) {
SeqList<Integer> seqList = new SeqList<>(5);
seqList.insert(1);
seqList.insert(12);
seqList.insert(3);
Iterator<Integer> iterator = seqList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println(seqList);
}
通过debug发现,iterator 不仅有自己的成员变量,还多了一个this$0的属性,而这个属性的引用就是外部类对象的引用。
版权声明:本文为qq_43750656原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。