关于java多态的一点认识

Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型,编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋予该变量的对象决定,如果编译时类型和运行时类型不一致,就会出现所谓的多态现象。

 

看实验:

首先创建一个Parent作为父类,代码:

public class Parent {

   

    public String name = "老张";

   

    public void method1(){

       System.out.println(name+",你好");

    }

扫描二维码关注公众号,回复: 1391184 查看本文章

}

 

然后创建一个子类Children,继承自父类Parent,代码:

public class Children extends Parent {

 

    public String name = "小张";

 

    @Override

    public void method1() {

       System.out.println(name+",你好");

    }  

}

 

测试类:

public class Test {

 

    public static void main(String[] args) {

   

       Parent p = new Children();

       p.method1();

       System.out.println(p.name);

    }

}

 

测试输出结果:

//     小张,你好

//     老张

 

由测试结果可以看出,只有方法具有多态性,对象属性不具备多态性

 

根据java的多态性,在实际编程中会非常的有用,最常用的MVC架构中,控制器在进行请求转发时,一般就是用到了java的多态特性,看代码:

//核心代码,根据请求的cmd进行实例化,并把实例化后的对象赋予所有cmd类的父接口

//ICommand 声明的引用,在执行execute方法时,实际执行的是实例类的方法。

ICommand cmd = (ICommand)Class.forName(cmdName).newInstance();

           String forward = cmd.execute(request, response);

           request.getRequestDispatcher(forward).forward(request, response);

 

 

所有cmd的父接口代码:

public interface ICommand {

 

    public String execute(HttpServletRequest request, HttpServletResponse response);

}

 

其中一个实现类cmd,代码:

public class UserCmd implements ICommand {

      

    public String execute(HttpServletRequest request,HttpServletResponse response){

             

       String methodName = request.getParameter("method");

      

       if("login".equals(methodName)){

          

       }else if("insert".equals(methodName)){

          

       }else if("update".equals(methodName)){

          

       }else if("delete".equals(methodName)){

          

       }

       return "fail.jsp";  

    }

 

猜你喜欢

转载自huangqiqing123.iteye.com/blog/1399329