A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© joeywr 中级黑马   /  2015-8-22 11:40  /  466 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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()感到困惑,这个抽象方法并没有得到实现,为什么代码可以正常运行?

3 个回复

倒序浏览
抽象的方法,必须要继承它的子类来操作实现。它只是抽象出这样的标准规则,本身不能实现
回复 使用道具 举报
在问问题前先看看API;
在这句话里Process p 代表其指向了一个对象,这个对象可以是本类对象或子类对象(多态)。右边Runtime.getRuntime().exec("javac");可以看到调用的是Runtime类的静态方法getRuntime();返回的是
一个 Runtime对象,该对象又调用了.exec方法并再返回了一个Process的对象。所以等式就成立了,左边
指向了一个本类对象,右边也返回的是一个本类对象。至于为什么右边能返回一个抽象方法的对象,可能是
匿名对象,但是这些东西的产生就不需要我们管啦。
回复 使用道具 举报
嗯  问题在于Runtime.getRuntime().exec("javac")实际返回的是Process的实现类ProcessImpl,该类继承Process,并实现了getErrorStream方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马