在看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;
}
}
运行结果如下图所示
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;
}
另外博问支持 markdown 代码高亮语法,代码看起来就不会乱了
– 小光 5年前