日期:2014-05-17  浏览次数:20713 次

servlet 源码一个疑问。
小弟初学JAVA EE,最近刚刚看到Servlet开发。我学习编程一向习惯穷其根本,虽然基础不行,但是也受益良多。
废话不多。开主题

一般服务器上的Servlet实例化后,我们都是调用GenericServlet的service方法和HttpServlet的doGet()方法来处理请求。因为协议的关系,我们一般都采用HttpServlet中的doGet方法来处理。那么我就在eclipse视图中找到了这段方法的源码。

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletExceptionIOException
    {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_get_not_supported");
        if (protocol.endsWith("1.1")) {
            resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
        } else {
            resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
        }
    }

本人的问题就是不论是HttpServletRequest还是HttpServletResponse看API手册都属于interface,interface本身就是抽象的,是需要被实现的。
那么既然是抽象并且需要实现的,请问为什么可以定义变量当做参数传入这个函数。
我的意思就是一个抽象接口的作用就是被人实现,现在却可以定义变量并能调用其方法,那岂不是意味着能实例化对象了吗?
除了静态方法,一般方法不是只有对象才能调用的吗?

------解决方案--------------------
你应该知道Interface obj = new InterfaceImplemention();吧?
知道这个应该就不难理解了。参数是接口没问题的
------解决方案--------------------
是不是就是说HttpServletRequest 和 HttpServletResponse其实是实现了,只是对我们隐藏了。
============================================
对的。你不需要去自己 new 这些对象。