Java: 对象声明

Java: object declaration

在 Java 中声明对象时:

Runtime rt = Runtime.getRuntime();
Process lsProc = rt.exec("who -q");
InputStream in = lsProc.getInputStream();

为什么 lsproc 没有这样声明 -> Process lsproc = new Process? 对象 lsproc 如何保存另一个函数的值?

因为returns一个Process。参见 here #exec(java.lang.String)

 Process lsProc = rt.exec("who -q");

仅此一行就意味着,

这意味着 Runtime Class 的方法 exec 返回类型 Process 的实例 IsProc

看看source code of exec method

public Process exec(String[] cmdarray, String[] envp, File dir)
609        throws IOException {
610        return new ProcessBuilder(cmdarray)
611            .environment(envp)
612            .directory(dir)
613            .start();
614    }

它返回类型为 ProcessProcessBuilder 的实例,这意味着 Process 是抽象的 class 而 ProcessBuilder 是具体的 class .

现在你可能会遇到一个问题,如何

Process pro = new ProcessBuilder(..); 

有效,引导您阅读多态性。

方法 rt.exec("who -q") 可以 return 对类型 Process 的实例的引用。它可能会通过调用 new Process (..)(或者实际上,因为 Process 是一个抽象 class,通过创建 [=12= 的子 class 的实例来创建该实例本身]), 或者它可以从其他地方检索它。

遵循 Runtime.exec(String) 方法的调用链导致此调用:

    return new ProcessBuilder(cmdarray)
        .environment(envp)
        .directory(dir)
        .start();

start 方法调用 ProcessImpl.start,它实际上创建了 Process 实例。