Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:对象声明_Java_Object_Initialization - Fatal编程技术网

Java:对象声明

Java:对象声明,java,object,initialization,Java,Object,Initialization,在Java中声明对象时: Runtime rt = Runtime.getRuntime(); Process lsProc = rt.exec("who -q"); InputStream in = lsProc.getInputStream(); 为什么lsproc没有这样声明->Process lsproc=new Process? 对象lsproc如何保存另一个函数的值?因为它返回一个进程。看 这句话本身就意味着 这意味着Runtime类的exec方法返回Process类型的实例IsP

在Java中声明对象时:

Runtime rt = Runtime.getRuntime();
Process lsProc = rt.exec("who -q");
InputStream in = lsProc.getInputStream();
为什么
lsproc
没有这样声明->
Process lsproc=new Process

对象
lsproc
如何保存另一个函数的值?

因为它返回一个
进程。看

这句话本身就意味着

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

看这张照片

它返回类型为
Process
ProcessBuilder
实例,这意味着Process是一个抽象类,
ProcessBuilder
是它的具体类

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

Process pro = new ProcessBuilder(..); 
是有效的,这将引导您阅读多态性。

方法
rt.exec(“who-q”)
可以返回对类型为
Process
的实例的引用。它可以通过调用
newprocess(..)
(或者实际上,由于
Process
是一个抽象类,所以它可以通过创建
Process
的子类的实例来创建该实例本身),也可以从其他地方检索它

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

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

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

这就是方法的returntype的作用……但是当我尝试这样做时:Process lsproc=new Process为什么会出错?@user5444075这是因为无法实例化抽象类。请仔细阅读我的答案。@user5444075,因为
Process
是一个抽象类,所以无法实例化。正在实例化的实际类是
ProcessImpl
。这意味着我必须间接初始化对象lsproc,对吗?@user5444075否。这是一种直接方式。您只是在其他方法中得到初始化,该方法返回实际的objectProcess不是接口。这是一个抽象类。
Process pro = new ProcessBuilder(..); 
    return new ProcessBuilder(cmdarray)
        .environment(envp)
        .directory(dir)
        .start();