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"; } |