Process p = null;p = Runtime.getRuntime().exec("notepad. exe  TextProperties.java";...p.destroy();我不明白,Process是个抽象类,不是抽象类不能创建一个实例吗?不能创建实例却可以使用实例?这个例子中destroy()方法也是抽象的,这个方法是哪里实现的呢?在api文档里面我找不到实现了Process 抽象类的子类。同样的问题对于Enumeration 抽象类也是。没有实现这个抽象类的子类,却可以直接拿来用如:Properties sp = System.getProperties();
Enumeration e = sp.propertyNames();
...
哪位达人知道请指教,不胜感激,谢谢。

解决方案 »

  1.   

    Runtime.getRuntime().exec()
    不就是对Process抽象类的实现?下面的Properties,Enumeration也是同样的
      

  2.   

    感谢你的回复,不过还是看不懂。 你能说的详细点吗? 哪里实现了process抽象类?Runtime.getRuntime().exec() 是怎么实现process抽象类的? 还有destroy()抽象方法是哪里实现的?Runtime.getRuntime()这个是返回了当前的实例,exec() 这个是这个实例的一个方法。他们默认就继承抽象类Process并实现了其中的抽象方法吗?
      

  3.   

    Process p = null;  
    这里没有实现抽象类Process,而是用抽象类Process声明了一个对象pp = Runtime.getRuntime().exec("notepad.exe TextProperties.java");首先,Runtime.getRuntime()是一个static方法,返回的是一个Runtime对象,而Runtime.exec()方法返回的是一个Process类型的对象.这里将对象p指向一个实例,注意这个实例不是抽象类Process,而是用Runtime.exec()方法创建的.
    在JDK1.6中查看Runtime.exec()方法创建Process类型对象的过程:
    public Process exec(String[] cmdarray, String[] envp, File dir) throws IOException 
    {
      return new ProcessBuilder(cmdarray)
        .environment(envp)
        .directory(dir)
        .start();
    }
    发现Runtime.exec()真正创建的其实是Process的子类ProcessBuilder,只不过是用父类Process包装的而已,而ProcessBuilder是一个普通类.也就是说,这段代码其实是 Process p = new ProcessBuilder();的模式,
    举个例子就是:public abstract class 楼主
    {
      public void TestAvstract()
      {
        System.out.println("楼主");
      }
    }class 当前楼主 extends 楼主
    {
      public void TestAvstract()
      {
        System.out.println("当前楼主");
      }
    } 其中 楼主类 当然是不能实例化的,不过我可以用 楼主类 声明 deepsky725 而用 当前楼主类 实例化deepsky725:楼主 deepsky725 = new 当前楼主();那么最后deepsky725 其实是披着 楼主 外衣 的 当前楼主.最后调用deepsky725.TestAvstract()打印出来的自然是"当前楼主".上面的代码没有调试,只是表达这个意思而已.
      

  4.   

    抱歉,上面回得匆忙了,ProcessBuilder并不是Process的子类new ProcessBuilder(cmdarray).environment(envp).directory(dir).start();
    这句里 environment返回Map类型,之后directory返回ProcessBuilder类型(我囧一个先~~~)
    最后调用ProcessBuilder.start(),然后继续看这个方法的代码:public Process start() throws IOException {
      // Must convert to array first -- a malicious user-supplied
      // list might try to circumvent the security check.
      String[] cmdarray = command.toArray(new String[command.size()]);
      for (String arg : cmdarray)
      if (arg == null)
        throw new NullPointerException();
      // Throws IndexOutOfBoundsException if command is empty
      String prog = cmdarray[0];  SecurityManager security = System.getSecurityManager();
      if (security != null)
        security.checkExec(prog);  String dir = directory == null ? null : directory.toString();  try {
        return ProcessImpl.start(cmdarray,environment,dir,redirectErrorStream);
      } catch (IOException e) {
        // It's much easier for us to create a high-quality error
        // message than the low-level C code which found the problem.
        throw new IOException("Cannot run program \"" + prog + "\""
    + (dir == null ? "" : " (in directory \"" + dir + "\")")
    + ": " + e.getMessage(),
    e);
      }
    }
    返回的是 ProcessImpl.start();方法创建的对象,最后来看ProcessImpl.start():static Process start(String cmdarray[],
            java.util.Map<String,String> environment,
            String dir,
            boolean redirectErrorStream)
    throws IOException
    {
      String envblock = ProcessEnvironment.toEnvironmentBlock(environment);
      return new ProcessImpl(cmdarray, envblock, dir, redirectErrorStream);
    }
    OK,终于找到Process的子类了:ProcessImpl,其中ProcessImpl.start()返回的是一个ProcessImpl的对象这里更正我在3楼的回复,我把ProcessBuilder和ProcessImpl给弄错了,但是表达的意思依然不变
      

  5.   

    Process   p   =   null; p   =   Runtime.getRuntime().exec("notepad.   exe     TextProperties.java"; ... p.destroy(); 
    Runtime.getRuntime().exec("...")
    返回了对抽象类Process的一个实现
    具体的 可以是继承实现 也可以是匿名实现
    反正细节被封装了 我们只要利用这个实现就可以了
      

  6.   

    我明白了,非常感谢三位的回答,特别是cangyue87 ,讲的非常仔细,还帮我找到了实现process的类,我用的是jdk1.5的帮助文档,ProcessImpl怎么都找不到。 再次感谢了!以后还请各位多多指教!
      

  7.   

    首先抽象类是不能实例化的,cangyue87 这位说的是向上转型,所以可以用 
    楼主   deepsky725   =   new   当前楼主(); 
    但是不能用反过来用,
    本人嫌麻烦,所以没有画图了,如果画图就更好理解了
    建议你去看看THINKING IN JAVA这本书
    至于这个
    Process   p   =   null;     
    这里没有实现抽象类Process,而是用抽象类Process声明了一个对象p p   =   Runtime.getRuntime().exec("notepad.exe   TextProperties.java"); 
    Runtime.getRuntime().exec()因为这个方法返回的是Process类的对象,所以可以那样。
    不知道解的对不对,呵呵
      

  8.   

    我也举个例子
    public abstract class people
    {
    public abstract void eat();
    }class deepsky725 extends people
    { @Override
    public void eat()
    {
    System.out.println("我是楼主,我在吃饭");
    }

    }class get
    {
    public static people getPeople()
    {
    people p = new deepsky725();
    return p;
    }

    }class test
    {
    people p = null;
    test()
    {
    p = get.getPeople();
    p.eat();
    }
    public static void main(String[] a)
    {
    new test();
    }
    }