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();
...
哪位达人知道请指教,不胜感激,谢谢。
Enumeration e = sp.propertyNames();
...
哪位达人知道请指教,不胜感激,谢谢。
不就是对Process抽象类的实现?下面的Properties,Enumeration也是同样的
这里没有实现抽象类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()打印出来的自然是"当前楼主".上面的代码没有调试,只是表达这个意思而已.
这句里 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给弄错了,但是表达的意思依然不变
Runtime.getRuntime().exec("...")
返回了对抽象类Process的一个实现
具体的 可以是继承实现 也可以是匿名实现
反正细节被封装了 我们只要利用这个实现就可以了
楼主 deepsky725 = new 当前楼主();
但是不能用反过来用,
本人嫌麻烦,所以没有画图了,如果画图就更好理解了
建议你去看看THINKING IN JAVA这本书
至于这个
Process p = null;
这里没有实现抽象类Process,而是用抽象类Process声明了一个对象p p = Runtime.getRuntime().exec("notepad.exe TextProperties.java");
Runtime.getRuntime().exec()因为这个方法返回的是Process类的对象,所以可以那样。
不知道解的对不对,呵呵
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();
}
}