内部类对象引用外部类对象

  • Post author:
  • Post category:其他


在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 版权协议,转载请附上原文出处链接和本声明。