帮助理解对象的接口声明

时间:2010-01-10 18:21:48

标签: java

有人可以请我解释这个java代码。我觉得很难理解。

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    String firstName = request.getParameter("firstName").toString();
    processRequest(request, response);
}

所以request是接口类HttpServletRequest的一个对象,它有一些空方法。

  1. 但如果方法getParameter()为空,它如何返回任何数据。

  2. 而且,我无法在HttpServletRequest接口中找到getParameter()。但是它不应该是一个,因为请求被声明为HttpServletRequest并因此拥有它的所有方法和字段吗?

  3. 哪个类来自toString()来自。

4 个答案:

答案 0 :(得分:2)

所以HttpServletRequest是一个接口。接口声明实现类的实现方法。在这种情况下,您的servlet容器将为您提供实现(取决于您使用的是:Tomcat,Jetty等)。请记住,接口也可以相互扩展。在这种情况下,HttpServletRequest扩展了ServletRequest。您应该查看ServletRequest以了解其他方法。

为了清楚起见,HttpSerlvetRequest的方法不是“空”。已经由容器实现,所以当容器调用上面的方法时,它传递给你的对象是碰巧实现HttpServletRequest接口的完整对象。这就是你可以这样投射它们的原因。

编辑:toString()方法来自java.lang.Object class。这是所有java对象的基类。

答案 1 :(得分:2)

@ noname,@ darren很好地回答了你的问题,但是你的问题表明你需要解释更为基本的问题。所以......

request是实现HttpServletRequest的类的对象。当我们看到declaration of HttpServletRequest时,我们会看到:

public interface HttpServletRequest extends ServletRequest {

说一个类implements一个接口,或一个接口extends另一个接口,可以用更强的人工术语表达为 IS A 。因此,request是A HttpServletRequest的类的对象,是A ServletRequest。一路沸腾:

request 是A ServletRequest

这意味着可以为ServletRequest对象调用任何request声明的方法,the declaration of ServletRequest包含:

public String getParameter(String name);

这就是为什么我们可以致电request.getParameter(someString)

你说:

  

哪个类有它们   方法?我必须知道这一点   信息能够编码和   知道怎么想。

但那不对。您需要知道哪个特定类包含该方法的实现,您将逐渐理解这一点。它是一种抽象,抽象是编程的核心;它就是所有权力所在。您发布的doPost()方法可以接受 ANY HttpServletRequest作为参数,而明确知道哪个实现已经传入 - 它只知道无论如何传入将遵循HttpServletRequest接口。有一次可以使用来自库的类的请求调用它;下一次可以通过不同的请求调用它,来自您自己编写的课程。这就是为什么doPost()可以在不同的环境中使用的原因;这才是它的强大之处。

答案 2 :(得分:1)

1)HttpServletRequest继承自ServletRequest方法的接口getParameter()

2)当Java方法将接口列为参数类型时,实现该接口的对象必须作为参数传入。该对象将具有实现getParameter()的代码,而不是您在界面中看到的“空方法”。 (例如,一个这样的对象是HttpServletRequestWrapper。)

所有这些信息都可以在JavaDocs中找到,例如:

答案 3 :(得分:1)

该方法不接受接口类型“HttpServletRequest”的对象。相反,它接受任何实现该接口的对象。类实现接口的方式是为接口所说的方法提供实现(即代码)。

例如,假设我们有一个狗的接口

interface Dog {
    public String bark();
}

对于任何给定的类来实现该接口,它必须提供它自己的bark()版本。每个类都以最有意义的方式实现该方法。

class GoldenRetriever implements Dog {
    public String bark() {
        return "Woof!";
    }
}
class YippyDog implements Dog {
    public String bark() {
        return "yip";
    }
}

编辑评论:

当实际使用bark()命令时,你会编写一个方法,它接受任何实现Dog接口的类作为输入:

public dodog(Dog mydog) {
    System.out.println(mydog.bark());
}

然后,您可以通过创建实现Dog Interface

的任何类型的Object来使用该方法
public void usedog() {
    GoldenRetriever golden = new GoldenRetriever();
    dodog(golden);

    YippyDog yippy = new YippyDog();
    dodog(yippy);
}

dodog方法接受这两者,因为它们都是实现Dog接口的Class的实例。然后它可以调用bark()方法,因为它知道它们实现了它...因为它们实现了Dog接口。

我希望更清楚。