关于接口的疑问。

cultra 2003-10-16 04:59:26
接口文件:
public interface HTMLAction extends Serializable {

public void setServletContext(ServletContext context);

public void doStart(HttpServletRequest request);

public Event perform(HttpServletRequest request) throws HTMLActionException;

public void doEnd(HttpServletRequest request, EventResponse eventResponse);

}

例子程序:

private HTMLAction getAction(URLMapping urlMapping) {
HTMLAction handler = null;
String actionClassString = null;
if (urlMapping != null) {
actionClassString = urlMapping.getWebAction();
if (urlMapping.isAction()) {
try {
handler = (HTMLAction) getClass().getClassLoader().loadClass(
actionClassString).newInstance();
}
catch (Exception ex) {
System.err.println("RequestProcessor caught loading action: " + ex);
}
}
}
return handler;
}


片段2:

HTMLAction action = getAction(urlMapping);
if (action != null) {
action.setServletContext(request.getSession().getServletContext());
action.doStart(request);
ev = action.perform(request);
EventResponse eventResponse = null;


1)为什么一个函数的返回值可以是接口?
private HTMLAction getAction(URLMapping urlMapping) { }

2) 为什么接口能定义变量?
HTMLAction handler = null;

3)一个类实例为什么能被强制转成接口?

HTMLAction handler = (HTMLAction) getClass().getClassLoader().loadClass(
actionClassString).newInstance();

4)为什么接口自己调用了起来?

action.setServletContext(request.getSession().getServletContext());
action.doStart(request);

...全文
38 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
truezerg 2003-10-17
  • 打赏
  • 举报
回复
不客气,共同学习
cultra 2003-10-17
  • 打赏
  • 举报
回复
truezerg(赵明宇),你让我对CSDN有了全新的看法,谢谢你的热情,我会记住你的。
truezerg 2003-10-17
  • 打赏
  • 举报
回复
我来解释一下,你看下面的代码

//这是一个接口,Vehicle是交通工具的意思,这个接口定义了交通工具的一个共有的方法
//drive()驾驶
public interface InfVehicle {
public void drive();
}

//小汽车是交通工具,实现交通工具的接口
public class Car implements InfVehicle {
public void drive() {
//这里具体实现小汽车的驾驶方法
}
}
//自行车也是交通工具,实现了交通工具的接口
public class Bicycle implements InfVehicle {
public void drive() {
//这里具体实现自行车的驾驶方法
}
}

//这是一个“人”类,它有一个方法是 goHome回家,回家需要一种交通工具,所以他有一个交通工具,他回家时使用这个工具
public class Man {
private InfVehicle vehicle;

public InfVehicle getVehicle() {
return this.vehicle;
}

public void setVehicle(InfVehicle vehicle) {
this.vehicle = vehicle;
}
//回家方法
public void goHome() {
this.vehicle.drive();
}
}

现在我们来看怎么使用这些类

Man aMan = new Man(); //创建一个"人"
InfVehicle car = new Car(); //创建一个小汽车
InfVehicle bicycle = new Bicycle();//创建一个自行车

//比如今天这个人想开车回家,我们就
aMan.setVehicle(car);
aMan.goHome();
//如果他开车开腻了,想换一种方式,他这可以骑车回家
aMan.setVehicle(bicycle);
aMan.goHome(Bicycle);


看明白上面的代码我来回答你的问题:

1)为什么一个函数的返回值可以是接口?比如 类 Man 中的 public InfVehicle getVehicle()
这是因为接口也是一种“类型”,当然它可以用来当方法的返回值。但一个接口是不能有实例的,也就是说它必须指向一个具体类型(比如car或bicycle),当一个方法返回一个接口时,实现上也是返回一个具体实例,只不过是以接口的形式返回的

2) 为什么接口能定义变量?比如上例中的 InfVehicle car = new Car();
上面说了,接口是一种类型,它就可以定义变量,但它所指向的对象必须是一个具体的类型,这里的具体类型是car.你不能这样写
InfVehicle v = new InfVehicle(); //这就错了,因为接口不能被实例化。它所接收的要是一个具体类的实例,而这个类要实现这个接口。

3)一个类实例为什么能被强制转成接口?
将一个具体的类实例转成它所实现的接口,这种操作叫向上转型,这是可以的。 当你转成接口后,你就只能使用接口中的方法了,而不能使用这个实现所扩展的方法。这是一个要注意的地方。当然,你向上转型时要保证你所转向的类型确实是这个类的父类类型

4)为什么接口自己调用了起来?
这个问题比较好回答,一个具体的类调用自已的方法你一定认为这没什么吧,很正常,当然了,一个接口也可以调用自已的方法啊。为什么不能呢? 你要明白的是虽然表面是它是一个接口,实际上,它是指向一个具体的类的实例的,也就是说当接口调用自已方法时,和一个具体的类的实例调用自己的方法是一样的。没有什么不同。
cultra 2003-10-17
  • 打赏
  • 举报
回复
那么接口只是一种规范,接口怎么可以实例化,返回接口没有道理啊??
songbo_pp 2003-10-17
  • 打赏
  • 举报
回复
面向对象三大特性:封装,继承,多态。别的不多说了

zez 2003-10-17
  • 打赏
  • 举报
回复
这些都是基本概念,建议看看入门的书,要比我讲的详细的多:)

------------------------------------------------------
我们还年轻牛奶会有的奶牛也会有的
可天天在 csdn 混这些会有吗 ??
Yanbin_Q 2003-10-17
  • 打赏
  • 举报
回复
去充分了解一下多态性,一个对象既是本身类的实例,也是它的父类及追溯到祖先类的实例。
cultra 2003-10-17
  • 打赏
  • 举报
回复
还有没有朋友能给解释一下??
Schlemiel 2003-10-17
  • 打赏
  • 举报
回复
interface是一种类型(type),你实际获得的是它的一个子类对象。
kazy0514 2003-10-17
  • 打赏
  • 举报
回复
没见过,关注!!

62,612

社区成员

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

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