深入理解Java多态机制

目录:
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";
    }

}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anguser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值