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

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

java中的多态  

2012-05-04 22:42:54|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
面向对象设计中的几大概念
封装,继承,多态

多态的语义

多态,英文单词【polymorphism来源于两个希腊词根【poly】,【morph】,分别表示多,与形态的含义

在面向对象编程中,当用继承构造了类之间的关系
举个例子说: Dog,Pig,Person 都是Animal,都隶属于Animal下面的子类,都有speak这个方法,只是大家speak
的方式不一样而已,比如说Dog,它speak只是简单的旺旺而已,Pig只是哼哼而已,而人呢,我们speak的是language

如果现在我们有了一个Animal的引用myref,那么这个myref.speak(),应该调用那个speak方法呢?
看一段非常简单的code:

public void test(Animal myref)

{

//应该调用哪一个

myref.speak();

}


注意: 在编译的时候,我们是没有办法确定这个speak是哪个类的speak方法,只能在运行的时候,根据
传进来的对象的具体类型来确定,船进行的对象是狗的实例,就执行狗的speak方法,传进来是人的实例,
就执行人的speak方法

Person p = new Person();

//则在test中调用Person的speak

test(p);

Dog d = new Dog();

//则在test中调用Dog的speak

test(d);


多态的实现

多态又是具体怎么实现的呢?
提到这个不得不提到一个概念 【动态绑定】
【动态绑定】就是指在【运行时刻】决定【被调用方法】绑定的【具体类】
与之相反的就是另外一个概念【静态绑定】
【静态绑定】就是指在【编译时刻】确定【被调用方法】绑定的【具体类】

动态绑定在java中如何实现呢?
这个问题换种方式来说就是 在test函数中如何找到Animal引用的具体类型是Dog,Person,还是Pig
在java中,解决这个问题的方式就是【反射】,通过引用来找到引用对象的类型
很简单,看一行代码

//这样就得到了具体的类

myref.getClass()

//找到了具体的类,就可以找到具体的speak方法了

myref.getClass().getMethod("speak")


多态的细节

所谓的static,就是指没有this指针的数据成员和方法,它只隶属于类本身,属于静态绑定,
所以static关键字修饰的都不能多态

//静态绑定

public static int i = 3;

//静态绑定

public static String s = "hello";


final,本意既是不变,对于基本数据类型而言,是内容不变,而对于类类型而言,是指引用不变,内容还是可变的
对于方法而言,是指不能被子类重写【override】
所以父类中被声明为final的方法是不能多态的,因为它不能在子类中重写

类的数据成员是不能被多态的,所来来说数据成员被重写了也没用,父类引用不可能引用子类的成员

最后这一部分写的可能稍晦涩了点,不过还是比较精确的,只能自己写些例子去理解了,不动手是不行的
  评论这张
 
阅读(274)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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