помогите с пониманием интерфейса объявления объекта - PullRequest
0 голосов
/ 10 января 2010

Может кто-нибудь объяснить мне этот код Java. мне действительно трудно это понять.

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

Таким образом, запрос является объектом класса интерфейса HttpServletRequest, который получил несколько пустых методов.

  1. но как он может вернуть любые данные, если метод getParameter () пуст.

  2. а также я не могу найти getParameter () в интерфейсе HttpServletRequest. Но не должен ли он быть одним, потому что запрос объявлен как HttpServletRequest и, таким образом, владеет всеми его методами и полями?

  3. и из какого класса происходит toString ().

Ответы [ 4 ]

2 голосов
/ 10 января 2010

@ noname, @darren хорошо ответила на ваш вопрос, но ваш вопрос к нему говорит о том, что вам нужно объяснить еще более фундаментальные вопросы. Итак ...

request - это объект класса, который реализует HttpServletRequest. И когда мы смотрим на объявление HttpServletRequest , мы видим:

public interface HttpServletRequest extends ServletRequest {

Заявление о том, что класс implements интерфейс или один интерфейс extends другой может быть с пользой выражен в более человеческих терминах как IS A . Таким образом, request является объектом класса, который ЕСТЬ HttpServletRequest, который ЕСТЬ ServletRequest. Вскипела:

request IS A ServletRequest.

Это означает, что для вашего request объекта могут быть вызваны любые методы ServletRequest, а объявление ServletRequest включает в себя:

public String getParameter(String name);

И вот почему мы можем позвонить request.getParameter(someString).

Вы говорите:

К какому классу они относятся? методы? я должен это знать информация, чтобы иметь возможность кодировать и уметь думать.

Но это не так. Вы не должны знать, какой именно класс содержит реализацию метода, и вы поймете, что это сила. Это абстракция, а абстракция лежит в основе программирования; это где вся сила. Метод doPost(), который вы опубликовали, может принять ANY HttpServletRequest в качестве параметра без , точно зная, какая реализация была передана - все, что он знает, это то, что все, что передано, будет соблюдать HttpServletRequest интерфейс. Один раз он может быть вызван с запросом класса из библиотеки; в следующий раз он может быть вызван по другому запросу из класса, который вы написали сами. Вот почему doPost() может использоваться в разных контекстах; вот что делает его мощным.

2 голосов
/ 10 января 2010

Так что HttpServletRequest - это интерфейс. Интерфейсы объявляют методы для реальных классов для реализации. В этом случае ваш контейнер сервлета предоставит вам реализацию (зависит от того, что вы используете: Tomcat, Jetty и т. Д.). Помните, что интерфейсы могут также расширять друг друга. В этом случае HttpServletRequest расширяет ServletRequest. Вы должны посмотреть на ServletRequest для дополнительных методов.

Просто чтобы прояснить, методы HttpSerlvetRequest не являются "пустыми". Реализованы контейнером, поэтому, когда контейнер вызывает ваш метод выше, объекты, которые он передает вам, являются полноценными объектами, которые реализуют интерфейс HttpServletRequest. Вот почему вы можете использовать их как таковые.

Редактировать: метод toString () происходит из java.lang.Object class . Это базовый класс для всех объектов Java.

1 голос
/ 10 января 2010

Метод не принимает объект типа интерфейса "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

public void usedog() {
    GoldenRetriever golden = new GoldenRetriever();
    dodog(golden);

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

Метод dodog принимает оба из них, потому что они оба являются экземплярами класса, который реализует интерфейс Dog. Затем он может вызвать метод bark (), потому что знает, что он его реализует ... потому что он реализует интерфейс Dog.

Надеюсь, это понятнее.

1 голос
/ 10 января 2010

1) HttpServletRequest наследуется от интерфейса ServletRequest, который содержит метод getParameter().

2) Когда метод Java указывает интерфейс в качестве типа параметра, объект, реализующий этот интерфейс, должен быть передан в качестве параметра. Этот объект будет иметь код, который реализует getParameter(), а не «пустой метод», который вы видите в интерфейсе. (Например, один такой объект - HttpServletRequestWrapper.)

Всю эту информацию можно найти в JavaDocs, например ::

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...