举个例子说,
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
这是Filter Servlet的doFilter方法,ServletRequest是一个接口,不可能实例化,那么:
这个request是怎么来的呢?
request.getAttribute()方法是在哪里实现的呢?
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
这是Filter Servlet的doFilter方法,ServletRequest是一个接口,不可能实例化,那么:
这个request是怎么来的呢?
request.getAttribute()方法是在哪里实现的呢?
// .. /
}HttpServletRequest request = new MyRequest();这样,我给你的时候 ,你看到的是 HttpServletRequest,
但是我当时创建的时候用的是 new MyRequest(); 这样创建出来的实例紧接着被 上溯句柄
UpCast 成了 HttpServletRequest , 你看到的是接口, 没关系,实际上它是什么样不会变的, 你以后还可以 if ( request instanceof MyRequest) { MyRequest myreq = (MyRequest) request;} 把它 DownCast 成原来的样子.用接口编程是 做 API 等或者设计一些类必须做的, 不用管到时候进来的具体是什么,只要实现了接口中的功能就行了, 这就是多态.
你难道没发现所有的接口都没有定义构造方法吗?
而你说的ServletRequest request,这个就牵扯到向上转型了,这个参数就是所有实现ServletRequest接口的类的对象.
而request.getAttribute()这个方法,它调用的是个个子类所覆盖的方法,但是如果你的接口没有定义getAttribute()这个方法,这里也会出错的!
我想知道这个request对象是在什么时候,什么地方,用哪个类实例化的,怎么办呢?
我是新手,顺便问一下,什么时候会要做API呢?
给你个例子吧:
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);
}
}
自己调试一下,应该就差不多了!
拿你的例子来说,你在main方法中用Hero h = new Hero()实例化了一个Hero对象h,那么上面那个request对象是在哪里实例化的呢?
这个只是一个参数.
这个参数就是所有实现ServletRequest接口的类的对象都可以传进来.当你想调用这个方法时就必须得创建一个实现ServletRequest接口的类的对象,然后将它传进来!
这个request是怎么来的呢?接口不能实例化,但implements这个接口的class总可以实例化吧!
他这样设计是为了用reflect来反调你class里的方法,你把它理解成abstract class就可以了
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这个接口的类才能实例化".