目录:
1,多态的概念?
2,存在的条件?
3,案列解析?
4,应用场景?1,多态的概念
父类引用指向子类对象,通俗点就是,在编译时不绑定是什么方法,根据你传进来的值,是什么就会运行什么。
2.存在条件
第一,要有继承
第二,要有方法的重写
第三,父类引用指向子类对象3,案列解析
好好体会以下这个案例,通过debug,就知道他的运行流程,最后看看输出的结果是什么玩意儿,其实这是一道阿里实习生的一道笔试题。
代码:
public class Demo {
class Super {
int flag = 1;
Super() {
test();
}
void test() {
System.out.println("Super.test() flag=" + flag);
}
}
class Sub extends Super {
Sub(int i) {
super();//默认的
flag = i;//flag = 5
System.out.println("Sub.Sub()flag=" + flag);
}
void test() {
System.out.println("Sub.test()flag=" + flag);
}
}
public static void main(String[] args) {
new Demo().new Sub(5);
}
}
附:最后给出输出结果
Sub.test()flag=1
Sub.Sub()flag=5
4 ,应用场景?此处挑选一个典型的案列,j2ee servlet中的应用。
/**
* 采用反射+多态实现一个通用的servlet,根据用户请求的方法完成相应方法的调用
*/
public class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
// 1.获取子类 创建子类或者调用子类的时候 this代表的是子类对象
@SuppressWarnings("rawtypes")
Class clazz = this.getClass();
//System.out.println(this);此处通过控制台打印,this所指的对象乃子类的对象,通俗点就是谁调用指向谁。
// 2.获取请求的方法
String m = request.getParameter("method");
if(m==null){
m="index";
}
//System.out.println(m);
// 3.获取方法对象
Method method = clazz.getMethod(m, HttpServletRequest.class, HttpServletResponse.class);
// 4.让方法执行 返回值为请求转发的路径
String s=(String) method.invoke(this, request,response);//相当于 userservlet.add(request,response)
// 5.判断s是否为空
if(s!=null){
request.getRequestDispatcher(s).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
public String index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return null;
}
}
下面是他的一个子类,通过继承当前servlet
public class IndexServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
public String index(HttpServletRequest request, HttpServletResponse reponse)throws ServletException, IOException {
//System.out.println("SndexServlet 的index方法执行了");
return "jsp/index.jsp";
}
}