抽象类可以直接使用吗?

deepsky725 2008-01-05 01:43:27
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();
...


哪位达人知道请指教,不胜感激,谢谢。
...全文
356 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅小西Echo 2008-01-06
  • 打赏
  • 举报
回复
我也举个例子


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();
}
}
bad0914 2008-01-05
  • 打赏
  • 举报
回复
首先抽象类是不能实例化的,cangyue87 这位说的是向上转型,所以可以用
楼主 deepsky725 = new 当前楼主();
但是不能用反过来用,
本人嫌麻烦,所以没有画图了,如果画图就更好理解了
建议你去看看THINKING IN JAVA这本书
至于这个
Process p = null;
这里没有实现抽象类Process,而是用抽象类Process声明了一个对象p

p = Runtime.getRuntime().exec("notepad.exe TextProperties.java");
Runtime.getRuntime().exec()因为这个方法返回的是Process类的对象,所以可以那样。
不知道解的对不对,呵呵
deepsky725 2008-01-05
  • 打赏
  • 举报
回复
我明白了,非常感谢三位的回答,特别是cangyue87 ,讲的非常仔细,还帮我找到了实现process的类,我用的是jdk1.5的帮助文档,ProcessImpl怎么都找不到。 再次感谢了!以后还请各位多多指教!
KK3K2005 2008-01-05
  • 打赏
  • 举报
回复
Process p = null;

p = Runtime.getRuntime().exec("notepad. exe TextProperties.java";

...

p.destroy();


Runtime.getRuntime().exec("...")
返回了对抽象类Process的一个实现
具体的 可以是继承实现 也可以是匿名实现
反正细节被封装了 我们只要利用这个实现就可以了
cangyue87 2008-01-05
  • 打赏
  • 举报
回复
抱歉,上面回得匆忙了,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给弄错了,但是表达的意思依然不变

cangyue87 2008-01-05
  • 打赏
  • 举报
回复
Process p = null;
这里没有实现抽象类Process,而是用抽象类Process声明了一个对象p

p = 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()打印出来的自然是"当前楼主".

上面的代码没有调试,只是表达这个意思而已.
deepsky725 2008-01-05
  • 打赏
  • 举报
回复
感谢你的回复,不过还是看不懂。 你能说的详细点吗? 哪里实现了process抽象类?Runtime.getRuntime().exec() 是怎么实现process抽象类的? 还有destroy()抽象方法是哪里实现的?Runtime.getRuntime()这个是返回了当前的实例,exec() 这个是这个实例的一个方法。他们默认就继承抽象类Process并实现了其中的抽象方法吗?
runshine 2008-01-05
  • 打赏
  • 举报
回复
Runtime.getRuntime().exec()
不就是对Process抽象类的实现?

下面的Properties,Enumeration也是同样的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧