返回列表 发帖

【分享】子类如何青处于蓝、而胜于蓝

一、重写父类方法的权限。
  在父类中,可能对某个方法设置了相关的权限。如对某个方法设置了protected权限,只允许其子类来访问这个方法,其他类不能够访问这个方法。不过跟现实中一样,有些儿子总是比较叛逆,或者说总会有几个“败家子”,他们会把家里的东西拿出去给别人使用。子类继承了父类之后,可以修改父类对象中的权限访问限制。如将protected权限(只允许子类中访问,而不允许其他类访问)更改为public访问权限。更改后子类中的这个方法所有类都可以访问。这就相当于将子类中家传的方法(本来可能是传子不传女的),向其他类公开。其他类可以随意的访问。
  不过子类在更改父类方法的时候,有一个限制条件,即修改方法的修饰权限只能够从小的范围到达的范围改变。如在父类中,如果某个方法的权限修饰词位protected,则子类中重写这个方法时,其如果需要修改权限,则只能够改为public,而不能够改为private,越改越小。笔者在学习时,是按如下方法理解的。时代在进步,做儿子的要越来越大方,总不能比父亲小气吧。如此的话,这个权限修改的原则必须从小的范围到大的范围的改变,就会牢牢的记住了,想忘也忘不了了。其实在Java语言中,有很多类似的原则,大家都可跟日常生活联系起来记忆。这即能够帮助大家理解这些原则,而且也容易记忆。
  二、引用父类中的方法。
  父亲与儿子是一家人,住在同一个屋檐下。那么儿子当然可以利用父亲的一些工具了。如可以使用父亲的螺丝刀、自行车等工具。而不需要征得父亲的同意。如果某个类继承了另外一个类之后,子类也可以不经过父类同意而引用父类中方法。如在子类中可以连同初始化父类构造方法来完成子类的初始化操作。即可以在子类的构造方法中使用super()语句来调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法。注意这些方法并不是说在子类中重新创建,而是引用。就好像自行车,其只有一辆。做儿子的只是借用而已。如果删除父类中的方法,那么在子类中就无法引用这个方法,因为引用的对象已经不存在了。从这也可以看出,父类与子类其实共享一个方法。除非在子类中对这个方法进行了重写或者重构。
  不过有时候做父亲的也会比较自私,有些东西可能不想让儿子用。如可能有一些家传的古董之类的,怕儿子损坏,就锁在柜子中,不给儿子使用。在Java类的继承中,也存在这种情况。通常情况下,子类可以调用父类中的所有方法。但是如果父类不想让子类调用某个方法的话,在可以将这个方法的权限设置为private。此时即使通过继承手段创建了子类,但是这个子类仍然无法调用父类中利用private关键字修饰的方法。这就好像做父亲的给这个方法加了个锁,不想让儿子看到或者使用。注意,只有给方法设置为private关键字,其才不能够被子类调用。但是,如果设置了protected关键字,虽然其他类无法访问,但是子类仍然可以访问。为此在编写父类的方法时,需要注意关键字protected与关键字private的区别。在合适的方法前面采用合适的关键字。
  三、重写或者重构父类的方法。
  作为子类并不是简单的扩展父类的功能。就像做儿子一样,并不是简单的继承父亲的特征。生长环境、教育环境的不同,做父亲的总有与儿子不同的地方。在子类中,可以通过三种方法来“青处于蓝,而胜于蓝”。
  一是在子类中可以创建父类没有的方法。这是在子类中对父类的最简单的扩展。就好像父亲不会开车,而儿子可以通过学习学会开车取得驾照一样,在子类中可以定义父类中没有的方法。从而实现扩展父类的功能。不过在子类中定义方法的时候,名字不能够与父类的方法名字相同。不然的话,不是叫做创建父类没有的方法了,而是叫做重写方法或者方法重构。为此在子类中定义新方法名字的时候,就多了一个限制,即不能够与父类中的方法名字相同。否则的话,会出现难以预料的结果。不过如果不是从其他类中继承,即不是子类的话,则就没有这方面的限制,即可以跟其他类中的方法名字相同。因为独立的类中,其是根据对象名与方法名来组合来唯一的定位一个方法。总而言之,如果在子类中只是新加了一个方法,而不想影响父类中原先方法调用的话,则必须保证子类方法的名字与父类方法的名字不会有冲突。

二是可以重写父类的成员方法。所谓重写父类的成员方法,是指在子类中将父类的方法名字保留,而重写成员方法的实现内容。如更改成员方法的存储权限、修改成员方法返回值类型、修改成员方法内部的代码等等。也就是说,此时子类中的这个方法虽然跟父类中的方法名字相同,但是含义已经不同了。或者说,已经是两个独立的方法了。在重写父类成员时,一般可以修改父类成员方法的四部分内容,分别为成员方法的权限、成员方法返回值与成员方法内部的实现方式、成员方法的参数。不过根据笔者的编程习惯,不怎么喜欢重写父类的成员方法。在代码不复杂的情况下,宁愿重新建立一个方法。因为前者毕竟与父类的成员方法存在一定的关联。这会无形之中增加后续代码维护的难度。既然要重写其方法,那还不如重新取一个名字定义一个新的方法,代码维护起来反而更加的方便。为此笔者建议,除非有特殊的必要,如代码比较复杂时,才使用重写父类的成员方法的方式来调整父类成员方法的功能。否则的话,还是重新建立一个新的方法省事。
  三是可以重构父类的成员方法。如果父类成员方法的名字、返回类型、参数类型以及个数完全相同,只是其内部的代码不同,在Java中将这种重写方式叫做成员方法重构。之所以将这个独立出来,是因为重构往往有比较特殊的作用。如刚开始其他类应用了这个子类的父类的成员方法。后来在测试的时候,发现不同的部门有不同的需要。此时在这个子类中,不需要重新建立成员方法,而只需要更改这个成员方法中的实现方式(注意成员方法的其他部分如成员方法的名字、返回值、参数类型等等都没有更改)即可。此时由于成员方法的名字、权限、返回值类型、参数类型与个数都没有改变,只是其内部实现方式作了一定程度的调整。为此其他类中的代码就不需要调整了。
  可见,在子类中可以重新调整父类方法中的权限(从小气到大方)、扩展或者重新调整父类的功能等等,从而往往让子类青处于蓝,而胜于蓝。在开发过程中,程序开发人员要使用好子类的这些特性。不过从另一种角度讲,也需要对子类的权限进行一定的限制。在必要的时候要在父类中对某些方法进行权限的控制,防止其被子类滥用。
链接标记http://hi.baidu.com/isolated

返回列表