编程思想--第8章--多态

多态

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征。(也叫动态绑定,后期绑定或运行时绑定)

多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序--满足项目初建或后续扩展。

“封装”通过合并特征和行为来创建新的数据类型。“实现隐藏”通过将细节私有化把接口和实现分离开来。多态的作用是消除类型之间的耦合关系。

一、再论向上转型

对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。这种把对某个对象的引用视为对其基类型的引用的做法被称为向上转型。

多态允许我们不管导出类的存在,编写代码只是与基类打交道。

二、转机

方法调用绑定:将一个方法调用同一个方法主体关联起来被称作绑定。C只能前期绑定,后期绑定就是在运行时根据对象的类型进行绑定。

如果一种语言实现后期绑定,就必须具有某种机制,以便在运行时能判断对象的类型,从而调用恰当的方法。也就是说编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,并加以调用。

java中除了static方法和final方法(private方法属于final方法)外,其它所有的方法都是后期绑定。这意味着通常情况下,我们不必判定是否应该进行后期绑定--它会自动发生。

多态就是一项“将改变的事务与未变的事物分离开来”的重要技术,我们所做的代码修改,不会对程序中其他不应受到影响的部分产生破坏。

向上转型,父类调用子类方法。

三、构造器和多态

通常构造器不同于其他种类的方法。涉及到多态仍是如此。尽管构造器并不具有多态性(实际上是static方法,不过该static声明是隐式的),但还是非常有必要理解构造器怎样通过多态在复杂的层次结构中运行。

构造器具有一项特殊任务:检查对象是否被正确的构造。导出类只能访问它自己的成员,不能访问基类中的成员。只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化。因此,必须令所有构造器都得到调用,否则就不可能正确构造完整对象。这正是编译器为什么要强制每个导出类部分都必须调用构造器的原因。在导出类的构造器主体中,如果没有明确指定调用某个基类构造器,它就会调用默认构造器。如果不存在默认构造器,编译器就会报错(若某个类没有构造器,编译器会自动合成出一个默认构造器)。

组合,继承及多态构建构造器的顺序:1,调用基类构造器。2,按声明顺序调用成员初始化方法。3,调用导出类构造器主体。

层次结构中的每个类对象销毁顺序和初始化的顺序相反,对于字段则意味着与声明的顺序相反。执行清理工作的时候,必须小心和谨慎。

构造器的工作实际上是创建对象。在任何构造器内部,整个对象可能只是部分形成--我们只知道基类对象已经进行初始化。

初始化的实际过程是:1,在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。2,调用构造器。3,按声明顺序调用成员初始化方法。4,调用导出类的构造器主体。

编写构造器有一条有效的准则:用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。

四、协变返回类型

协变返回类型:表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。简单来说,就是父类调用子类方法,返回另外一个类对象。

五、用继承进行设计

一条通用的准则:用继承表达行为间的差异,并用字段表达状态上的变化。

纯继承与扩展:采取纯粹的方式来创建继承层次结构似乎是最好的方式。也就是说,只有在基类中已经建立的方法才可以在导出类中被覆盖。被称作“is-a”关系,即父子类的接口完全一致,可以认为是纯替代。 “is-like-a”关系,子类含有比父类多的扩展接口。

向上转型(在基层层次中向上移动)会丢失具体的类型信息,安全的,向下转型,在继承层次中向下移动,极其不安全的。

在java语言中,所有转型都会得到检查,所以即使我们只是进行一次普通的加括弧形式的转换,在进入运行期时仍然会对其进行检查,以便保证它的确是我们希望的那种类型。

六、总结

多态意味着“不同的形式”。在面向对象的过程中,我们持有从基类继承而来的相同接口,以及使用该接口的不同形式:不同版本的动态绑定。

为了在自己的程序中有效运用多态及面向对象的技术,必须扩展自己的编程视野,使其不仅包括个别类的成员和消息,而且还要包括类与类之间的共同特性以及它们之间的关系。尽管这需要极大的努力,但这样做是非常值得的,因为它可以带来很多成效:更快的程序开发过程、更好的代码组织、更好扩展的程序以及更容易的代码维护等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容