Chinaunix首页 | 论坛 | 博客
  • 博客访问: 199341
  • 博文数量: 163
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1720
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-08 11:41
文章分类

全部博文(163)

文章存档

2011年(1)

2009年(162)

我的朋友

分类: 系统运维

2009-07-07 17:32:23

一、重写父类方法的权限。

  在父类中,可能对某个方法设置了相关的权限。如对某个方法设置了protected权限,只允许其子类来访问这个方法,其他类不能够访问这个方 法。不过跟现实中一样,有些儿子总是比较叛逆,或者说总会有几个“败家子”,他们会把家里的东西拿出去给别人使用。子类继承了父类之后,可以修改父类对象 中的权限访问限制。如将protected权限(只允许子类中访问,而不允许其他类访问)更改为public访问权限。更改后子类中的这个方法所有类都可 以访问。这就相当于将子类中家传的方法(本来可能是传子不传女的),向其他类公开。其他类可以随意的访问。

  不过子类在更改父类方法的时候,有一个限制条件,即修改方法的修饰权限只能够从小的范围到达的范围改变。如在 父类中,如果某个方法的权限修饰词位protected,则子类中重写这个方法时,其如果需要修改权限,则只能够改为public,而不能够改为 private,越改越小。笔者在学习时,是按如下方法理解的。时代在进步,做儿子的要越来越大方,总不能比父亲小气吧。如此的话,这个权限修改的原则必 须从小的范围到大的范围的改变,就会牢牢的记住了,想忘也忘不了了。其实在Java语言中,有很多类似的原则,大家都可跟日常生活联系起来记忆。这即能够 帮助大家理解这些原则,而且也容易记忆。

  二、引用父类中的方法。

  父亲与儿子是一家人,住在同一个屋檐下。那么儿子当然可以利用父亲的一些工具了。如可以使用父亲的螺丝刀、自行车等工具。而不需要征得父亲的同 意。如果某个类继承了另外一个类之后,子类也可以不经过父类同意而引用父类中方法。如在子类中可以连同初始化父类构造方法来完成子类的初始化操作。即可以 在子类的构造方法中使用super()语句来调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法。注意这些方法并不是说在子类中 重新创建,而是引用。就好像自行车,其只有一辆。做儿子的只是借用而已。如果删除父类中的方法,那么在子类中就无法引用这个方法,因为引用的对象已经不存 在了。从这也可以看出,父类与子类其实共享一个方法。除非在子类中对这个方法进行了重写或者重构。

  不过有时候做父亲的也会比较自私,有些东西可能不想让儿子用。如可能有一些家传的古董之类的,怕儿子损坏,就 锁在柜子中,不给儿子使用。在Java类的继承中,也存在这种情况。通常情况下,子类可以调用父类中的所有方法。但是如果父类不想让子类调用某个方法的 话,在可以将这个方法的权限设置为private。此时即使通过继承手段创建了子类,但是这个子类仍然无法调用父类中利用private关键字修饰的方 法。这就好像做父亲的给这个方法加了个锁,不想让儿子看到或者使用。注意,只有给方法设置为private关键字,其才不能够被子类调用。但是,如果设置 了protected关键字,虽然其他类无法访问,但是子类仍然可以访问。为此在编写父类的方法时,需要注意关键字protected与关键字 private的区别。在合适的方法前面采用合适的关键字。

  三、重写或者重构父类的方法。

  作为子类并不是简单的扩展父类的功能。就像做儿子一样,并不是简单的继承父亲的特征。生长环境、教育环境的不同,做父亲的总有与儿子不同的地方。在子类中,可以通过三种方法来“青处于蓝,而胜于蓝”。

  一是在子类中可以创建父类没有的方法。这是在子类中对父类的最简单的扩展。就好像父亲不会开车,而儿子可以通过学习学会开车取得驾照一样,在子 类中可以定义父类中没有的方法。从而实现扩展父类的功能。不过在子类中定义方法的时候,名字不能够与父类的方法名字相同。不然的话,不是叫做创建父类没有 的方法了,而是叫做重写方法或者方法重构。为此在子类中定义新方法名字的时候,就多了一个限制,即不能够与父类中的方法名字相同。否则的话,会出现难以预 料的结果。不过如果不是从其他类中继承,即不是子类的话,则就没有这方面的限制,即可以跟其他类中的方法名字相同。因为独立的类中,其是根据对象名与方法 名来组合来唯一的定位一个方法。总而言之,如果在子类中只是新加了一个方法,而不想影响父类中原先方法调用的话,则必须保证子类方法的名字与父类方法的名 字不会有冲突。

 二是可以重写父类的成员方法。所谓重写父类的成员方法,是指在子类中将父类的方法名字保留,而重写成员方法的实现内容。如更改成员方法的存储权 限、修改成员方法返回值类型、修改成员方法内部的代码等等。也就是说,此时子类中的这个方法虽然跟父类中的方法名字相同,但是含义已经不同了。或者说,已 经是两个独立的方法了。在重写父类成员时,一般可以修改父类成员方法的四部分内容,分别为成员方法的权限、成员方法返回值与成员方法内部的实现方式、成员 方法的参数。不过根据笔者的编程习惯,不怎么喜欢重写父类的成员方法。在代码不复杂的情况下,宁愿重新建立一个方法。因为前者毕竟与父类的成员方法存在一 定的关联。这会无形之中增加后续代码维护的难度。既然要重写其方法,那还不如重新取一个名字定义一个新的方法,代码维护起来反而更加的方便。为此笔者建 议,除非有特殊的必要,如代码比较复杂时,才使用重写父类的成员方法的方式来调整父类成员方法的功能。否则的话,还是重新建立一个新的方法省事。

  三是可以重构父类的成员方法。如果父类成员方法的名字、返回类型、参数类型以及个数完全相同,只是其内部的代码不同,在Java中将这种重写方 式叫做成员方法重构。之所以将这个独立出来,是因为重构往往有比较特殊的作用。如刚开始其他类应用了这个子类的父类的成员方法。后来在测试的时候,发现不 同的部门有不同的需要。此时在这个子类中,不需要重新建立成员方法,而只需要更改这个成员方法中的实现方式(注意成员方法的其他部分如成员方法的名字、返 回值、参数类型等等都没有更改)即可。此时由于成员方法的名字、权限、返回值类型、参数类型与个数都没有改变,只是其内部实现方式作了一定程度的调整。为 此其他类中的代码就不需要调整了。

  可见,在子类中可以重新调整父类方法中的权限(从小气到大方)、扩展或者重新调整父类的功能等等,从而往往让子类青处于蓝,而胜于蓝。在开发过 程中,程序开发人员要使用好子类的这些特性。不过从另一种角度讲,也需要对子类的权限进行一定的限制。在必要的时候要在父类中对某些方法进行权限的控制, 防止其被子类滥用。

阅读(723) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~