注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

薛沛然 廊坊师范学院 九期信息技术提高班

无脑地生活,像白痴一样成长,不给自己留感伤的时间。。。

 
 
 

日志

 
 

多态的学习  

2014-06-19 23:52:29|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一多态的定义

马士兵的视频中多态的定义还有另外两个名字,迟绑定,动态绑定。动态绑定的定义是

执行期间而不是编译期间,判断所引用对象的实际类型,根据实际的类型调用其相应的方法。

这样做最大的优点是对变化有着极强的适应性,可拓展性非常强。这也是面对对象和基于对象语言最大的差别之一。

二多态的设计

那么,这么优雅的设计是怎么构成的呢。马士兵总结了三条。1要有继承2要有重写3父类引用指向子类对象。这样的设计对程序的执行顺序和内存管理产生了非常大的影响。为了便于方便自己的学习和理解,我将多态中所出现的现象作了个简单的总结。

现象1会发生对象类型的转换。

为了理解这一点,请阅读下面的小例子。

class A {

        

         public String show(A obj){

                return ("这里是A");

         }

         public String show(B obj){

                return ("这里是B");

         }

}

class B extends A{}

class C extends B{}

public class Test1 {

    public static void main(String args[]){

     

               A a = new A();

               B b = new B();

               C c = new C();

System.out.println(a.show(a));

System.out.println(a.show(b));

System.out.println(a.show(c));

}

程序执行结果是

这里是A

这里是B

这里是B

A中明明没有C的类型,却打印出了这里是B”这是为什么呢。我分析是继承做的好事。因为C继承了B类型,所以将c传入后自动强制类型转换将c类型转换成为b类型,因而产生如上的效果。

现象2一切老爹说了算

这个现象主要讲的是当父类引用指向子类对象时,这时所产生的实例所能处理的仅仅是从超类继承的那一部分,并不包含子类新添加的部分。

为了理解这一现象请阅读下面的小例子

 class A{

 public void show(){

      System.out.println("我是老爹");

   }

}

class B extends A{

  public void show1(){

      System.out.println("我是儿子");

   }

}

public class Test2 {

    public static void main(String args[]){

                      A a =new B();

                       a.show();

                       a.show1();

            

               }

}

执行结果:编译错误。因为a根本无法识别子方法中的show1().但是需要特别注意的是一旦子类中对父类的方法进行了重写,那么系统就会只识别子类的方法。

三综合实例

在了解了基本的现象之后,我们将重写,重载,继承,父类引用指向子类对象等面向对象的语言结合起来编写一个稍微复杂点的小例子。

class A {

        

         public String show(A obj){

                return ("这里是A");

         }

         public String show(B obj){

                return ("这里是B");

         }

}

class B extends A{

         public String show(B obj){

                      return ("这里是C");

                }

}

class C extends B{}

public class Test1 {

    public static void main(String args[]){

     

               A a = new A();

               B b = new B();

               C c = new C();

               A a1 = new B();

              System.out.println( a.show(a));//1

               System.out.println(a.show(b));//2

              System.out.println(a.show(c));//3

              System.out.println(a1.show(c));//4

             }

 

}

执行结果是:

这里是A

这里是B

这里是B

这里是C

其中第一个和第二个最好理解,第三个发生了强制类型转换。现在着重讨论下第四个。

根据现象二,我们知道a1有两个方法,一个方法的参数是A,另一个是B,所以我们把c带入,发现没有符合c的方法,所以,自动将c类型强制转换成b,这样看来貌似应该打印出这里是B”。但问题是B类型已经将父类的方法重写,因此show的方法的实体指向了这里是c”这句话。

总结

    最后这段代码看似简单,却花了我很长时间。其实只要掌握了上文提到的两个原则,读懂这样的代码的把握就会大大提升。

  评论这张
 
阅读(75)| 评论(6)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017