jar档案中的Java接口

时间:2016-10-24 17:17:00

标签: java servlets interface

我正在学习servlets而我正在研究由我的教授创建的一个完整的例子。我的servlet的service()方法如下所示:

public void service (ServletRequest req, ServletResponse res) 
                        throws ServletException, IOException  {
    res.setContentType( "text/plain");
    PrintWriter out = res.getWriter();

    out.println( "Some response" );
    out.close();
}

在上面的示例中,service()使用了ServletResponse个对象,因此我进入了我的servlet-api .jar,搜索了javax.servlet.ServletResponse.class并发现ServletResponse.class是一个界面(public abstract interface javax.servlet.ServletResponse)。所以在我的代码中我使用类型为ServletResponse的对象,这是一个接口,但我认为你无法在Java中实例化一个接口。我还注意到这个接口是由ServletResponseWrapper.class实现的。

所以我的问题是:

  • 为什么编译器让我实例化一个接口?
  • 为什么我们不使用ServletResponseWrapper对象?

2 个答案:

答案 0 :(得分:1)

您没有实例化接口ServletResponse。您正在使用servlet容器在调用servlet上的service()方法时传递给您的引用。容器实例化一个实现ServletRepsonse接口的类。实例化(具体)类可以是ServletResponseWrapper或任何其他"内部"类,只要它实现ServletResponse接口。

尝试在res.getClass().getName()方法中打印service()。它应该告诉你servlet容器实例化的确切类名。

答案 1 :(得分:0)

我不相信你确实实例化了ServletResponse;你只是简单地使用传递给你的实例。你不关心实施细节;你只关心界面指定的合同。

接口指定了联系人,可能有各种各样的实现。他们每个人都可以用不同的方式实现契约,但每个人的行为都完全相同(匹配界面中指定的内容)。