举个例子说,    
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
这是Filter Servlet的doFilter方法,ServletRequest是一个接口,不可能实例化,那么:
这个request是怎么来的呢?
request.getAttribute()方法是在哪里实现的呢?

解决方案 »

  1.   

    但是你拿到手的实例 可不是直接 new 这个接口来的,而是 有个  Concrete Class 实现了这个接口,MyRequest implements HttpServletRequest{
    // .. /
    }HttpServletRequest request  = new  MyRequest();这样,我给你的时候 ,你看到的是 HttpServletRequest,
     但是我当时创建的时候用的是 new MyRequest(); 这样创建出来的实例紧接着被 上溯句柄
     UpCast 成了 HttpServletRequest , 你看到的是接口, 没关系,实际上它是什么样不会变的, 你以后还可以  if  ( request instanceof MyRequest) { MyRequest myreq = (MyRequest) request;} 把它 DownCast 成原来的样子.用接口编程是 做 API 等或者设计一些类必须做的, 不用管到时候进来的具体是什么,只要实现了接口中的功能就行了, 这就是多态.
      

  2.   

    一个接口表示:" 所有实现了该特定接口的类看起来都象它".
    你难道没发现所有的接口都没有定义构造方法吗? 
    而你说的ServletRequest request,这个就牵扯到向上转型了,这个参数就是所有实现ServletRequest接口的类的对象.
    而request.getAttribute()这个方法,它调用的是个个子类所覆盖的方法,但是如果你的接口没有定义getAttribute()这个方法,这里也会出错的!
      

  3.   

    多谢指教!!!
    我想知道这个request对象是在什么时候,什么地方,用哪个类实例化的,怎么办呢?
    我是新手,顺便问一下,什么时候会要做API呢?
      

  4.   

    你说的什么意思?
    给你个例子吧:
    interface CanFight{
    void fight();
    }
    interface CanSwim{
    void swim();
    }
    interface CanFly{
    void fly();
    }
    interface CanClimb{
    void climb();
    }
    class ActionCharacter{
    public void fight(){}
    }
    class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly,CanClimb{
    public void swim(){}
    public void fly(){}
    public void climb(){}
    }
    public class Adventure{
    public static void t(CanFight x){
    x.fight();
    }
    public static void u(CanSwim x){
    x.swim();
    }
    public static void v(CanFly x){
    x.fly();
    }
    public static void r(CanClimb x){
    x.climb();
    }
    public static void w(ActionCharacter x){
    x.fight();
    }
    public static void main(String[] args){
    Hero h = new Hero();
    t(h);
    u(h);
    v(h);
    w(h);
    r(h);
    }
    }
    自己调试一下,应该就差不多了!
      

  5.   

    呵呵,我问得有点偏题了.
    拿你的例子来说,你在main方法中用Hero h = new Hero()实例化了一个Hero对象h,那么上面那个request对象是在哪里实例化的呢?
      

  6.   

    ServletRequest request 
    这个只是一个参数.
    这个参数就是所有实现ServletRequest接口的类的对象都可以传进来.当你想调用这个方法时就必须得创建一个实现ServletRequest接口的类的对象,然后将它传进来!
      

  7.   

    ServletRequest是一个接口,不可能实例化,那么:
    这个request是怎么来的呢?接口不能实例化,但implements这个接口的class总可以实例化吧!
    他这样设计是为了用reflect来反调你class里的方法,你把它理解成abstract class就可以了
      

  8.   

    上面的例子不是thinking in java里的吗
      

  9.   

    sqlink() 同志说明白了,接口不能实例化,implements这个接口的类才能实例化.interface CanFight{
    void fight();
    }
    interface CanSwim{
    void swim();
    }
    interface CanFly{
    void fly();
    }
    interface CanClimb{
    void climb();
    }
    ///////////////////////////////////////
    为了观察方便,如果你要一一对应,那么就是(当然,我们实际中可不会这么写,丢掉了接口的优点而且很不美观!)
    CanFight h1= new Hero();
    CanSwim  h2= new Hero();
    CanFly   h3= new Hero();
    CanClimb  h4= new Hero();
    这就是"接口不能实例化,implements这个接口的类才能实例化".