黑马程序员技术交流社区

标题: 抽象类中的困惑 [打印本页]

作者: joeywr    时间: 2015-8-22 11:40
标题: 抽象类中的困惑
import java.io.*;

public class  ReadFromProcess
{
        public static void main(String[] args)
                throws IOException
        {
                // 运行javac命令,返回运行该命令的子进程
                Process p = Runtime.getRuntime().exec("javac");
                try(
                        // 以p进程的错误流创建BufferedReader对象
                        // 这个错误流对本程序是输入流,对p进程则是输出流
                        BufferedReader br = new BufferedReader(new
                                InputStreamReader(p.getErrorStream()))
                )
                {
                        String buff = null;

                        // 采取循环方式来读取p进程的错误输出
                        while ((buff = br.readLine()) != null)
                        {
                                System.out.println(buff);
                        }
                }
        }
}
上述代码中的Process是抽象类,那么getErrorStream也是个抽象方法,对p.getErroStream()感到困惑,这个抽象方法并没有得到实现,为什么代码可以正常运行?
作者: 胡述灵    时间: 2015-8-22 12:33
抽象的方法,必须要继承它的子类来操作实现。它只是抽象出这样的标准规则,本身不能实现
作者: 黄蒙    时间: 2015-8-22 16:18
在问问题前先看看API;
在这句话里Process p 代表其指向了一个对象,这个对象可以是本类对象或子类对象(多态)。右边Runtime.getRuntime().exec("javac");可以看到调用的是Runtime类的静态方法getRuntime();返回的是
一个 Runtime对象,该对象又调用了.exec方法并再返回了一个Process的对象。所以等式就成立了,左边
指向了一个本类对象,右边也返回的是一个本类对象。至于为什么右边能返回一个抽象方法的对象,可能是
匿名对象,但是这些东西的产生就不需要我们管啦。
作者: joeywr    时间: 2015-8-23 22:43
嗯  问题在于Runtime.getRuntime().exec("javac")实际返回的是Process的实现类ProcessImpl,该类继承Process,并实现了getErrorStream方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2