先看下代码:
class A:
import java.io.LineNumberReader;
import java.io.Reader;
public class A{
private LineNumberReader l;
public A(Reader r) throws Exception{
l = new LineNumberReader(r);
}
public String classA_MethodRead() throws Exception{
System.out.println(1);
return l.readLine();
}
//new InputStreamReader(new FileInputStream(new File("D://abc.txt")))
public static void main(String[] args) throws Exception{
A a = new A(new B());
a.classA_MethodRead();
}
}
class B:
import java.io.IOException;
import java.io.Reader;
public class B extends Reader{
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
System.out.println(2);
return 0;
}
@Override
public void close() throws IOException {
// TODO Auto-generated method stub
}
}
程序先输出1然后输出2,输出1没问题,因为它调了classA_MethodRead()方法,但是输出2我一开始就有些不大
理解,我是重写了Readr中的read(char[] cbuf, int off, int len)方法,而我classA_MethodRead()方法中并未调用read(char[] cbuf, int off, int len)方法啊!只调用了readLine()方法,那么只有一种情况——readLine()方法中调用了read方法,进入readLine的父类实现,我看到:
public String readLine() throws IOException {
return readLine(false);
}
再点进去,找了半天,看到一个fill()方法,点进去看到这么一段:
do {
n = in.read(cb, dst, cb.length - dst);
} while (n == 0);
额。。总算看到read方法了(int java.io.Reader.read(char[] cbuf, int off, int len) throws IOException)。几经周折总算看到了。。。
这是在解释编译器中的第一步骤,分词器中的一小段样板代码,想请教下大家,类似A a = new A(new B());B继承Readr重写read方法。这种类似的操作大家平时用的多吗?或者说主要这种思路或者方法一般用在哪里合适?