首页新闻找找看学习计划

AbstractList抽象类继承问题

0
悬赏园豆:20 [待解决问题]

在看Spring源码时有一个疑问,一个类继承AbstractList抽象类,但是不具体实现其中的get()方法和size(int index)方法,在进行继承类变量的赋值时,声明的继承类变量取不到值,这个是什么原因,是AbstractList抽象类重载了“=”操作符吗?

以下是测试代码

import java.util.AbstractList;

public class TestExtends
{
public static void main(String[] args)
{
Implement implement = new Implement("str");
System.out.println("Implement---------------:"+implement);
DefaultImplement defaultimplement = new DefaultImplement("str");
System.out.println("java---AbstarctList------------:"+defaultimplement);

}

}

class Implement<E> extends AbstractList<E>
{

E[] a ;
public  Implement(E... strings )
{
    a = strings;
}
@Override
public E get(int index) {
    // TODO Auto-generated method stub
    return a[index];
}

@Override
public int size() {
    // TODO Auto-generated method stub
    return a.length;
}

}

class DefaultImplement<E> extends AbstractList<E>
{
E[] a ;

public  DefaultImplement(E... strings )
{
    a = strings;
}

@Override
public E get(int index) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int size() {
    // TODO Auto-generated method stub
    return 0;
}   

}

运行结果如下图所示

西红柿鸡蛋面的主页 西红柿鸡蛋面 | 初学一级 | 园豆:181
提问于:2019-07-16 15:47

另外博问支持 markdown 代码高亮语法,代码看起来就不会乱了

小光 7个月前
< >
分享
所有回答(1)
0

AbstractList这个类是java.util包的,和spring没关系。
你既然看源码了,应该看得仔细一点,源码里面肯定能找到原因。

DefaultImplement defaultimplement = new DefaultImplement("str");
System.out.println("java---AbstarctList------------:"+defaultimplement);

首先你要知道直接输出对象其实就是调用对象的toString()方法,当前类没有重写就找父类的toString()方法

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

AbstractList类中没有重写toString()方法,父类AbstractCollection重写了toString()方法:

public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

找到遍历的对象数据是从哪来的:

Iterator<E> it = iterator();
E e = it.next();

找到子类AbstractList中iterator()的实现:

public Iterator<E> iterator() {
        return new Itr();
    }

Itr类中的next()方法就是toStirng()中输出的值it.next():

public E next() {
            checkForComodification();
            try {
                int i = cursor;
                E next = get(i);
                lastRet = i;
                cursor = i + 1;
                return next;
            } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }

看到next()方法中的get(i)你应该能想到你的DefaultImplement 类重写了AbstractList抽象类的这个方法,而且return null,所以DefaultImplement类输出数据是空的

@Override
public E get(int index) {
    // TODO Auto-generated method stub
    return null;
}
小光 | 园豆:1830 (小虾三级) | 2019-07-17 09:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册