技术篇6.0接口、继承与多态

  继承和多态是面向对象开发语言中非常重要的一个环节,如果在程序中使用得当,可以将整个程序的框架变得非常有弹性,同时可以减少代码的冗余性。继承机制的使用可以复用一些定义好的类,减少重复代码的编写。多态机制的使用可以动态调整对象的调用,降低对象之间的依赖关系。同时为了优化继承与多态,一些类除了继承父类还使用接口的形式。Java语言中的类可以同时实现多个接口,接口被用来建立类与类之间关联的标准。在Java中正因为使用了这些机制使Java语言具有极强生命力。

接口的使用

  Java语言只支持单重继承,不支持多重继承,即一个类只能有一个父类。实际应用中,又经常需要使用多继承来解决问题。为了解决这个问题,Java语言提供了接口来实现类的多重继承功能。

  接口的定义

  (概念)使用interface来定义一个接口,接口定义与类的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义两部分组成。定义接口的语法格式:

  [修饰符]interface 接口名 [extends 父接口名列表]{

  [public][static][final]变量;

  [public][abstract]方法;

  }

  修饰符:可选参数,用于指定接口的访问权限,可选值为public,如果省略则使用默认的访问权限。

  接口名:必选参数,用于指定接口名称,接口名必须是合法的Java标识符。要求首字母大写。

  extends父接口名列表:可选参数,用于指定要定义的接口继承与哪个父接口。当使用extends关键字时,父接口名为必选参数。

  方法:接口中的方法只有定义而没有被实现。

  注意:Java的类文件一样,接口文件的文件名必须与接口名相同。

  接口的实现

  (概念)接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用implements关键字,基本语法结构:

  [修饰符]class<类名>[extends 父类名][implements 接口列表]{

  }

  实现接口的语法格式的参数说明:

  修饰符:可选参数,用于指定类的访问权限,可选值为public、abstrct和final。

  类名:可选参数,用于指定类的名称,类名必须合法的Java标识符。一般情况下,要求首字母大写。

  extends父类名:可选参数,用于指定要定义的类继承于哪个父类。当使用extends关键字时,父类名为必选参数。

  implements接口:可选参数,用于指定该类实现的是哪些接口。当使用implements关键字时,接口列表为必选参数。当接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。

  在类中实现接口时,方法名、返回值类型、参数的个数及类型与接口中的完全一致,并且必须实现接口中的所有方法。

  在类的继承中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔,这时就可能出现变量或方法名冲突的情况。解决该问题时,如果变量冲突,则需要明确指定变量的接口,可以通过“接口名.变量”实现。如果出现方法冲突,则只要实现一个方法即可。

类的继承

  继承一般是指晚辈从父辈那里继承财产,也可以说是子女拥有父母所给予他们的东西,在面向对象程序设计中,继承的含义与此类似,所不同的是,这里继承的实体是类而非人。也就是说继承是子类拥有父类的成员。

  继承的实现

  在Java语言中,继承通过extends关键字来实现。也就是用extends指明当前类是子类,并指明从哪个类继承而来。即在子类的声明中,通过使用extends关键字来显式的指明其父类。其基本的声明格式如下:

  [修饰符]class 子类名 extends 父类名{

    类体

  }

  修饰符:可选参数,用于指定类的访问权限,可选值为public、abstract和final

  子类名;必选参数,用于指定子类的名称,类名必须是合法的Java标识符。一般情况下,要求首字母大写。

  extends 父类名:必选参数,用于指定要定义的子类继承于哪个父类。

  继承中的重写

  重写是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法名与父类的方法名相同时,那么子类就不能继承父类的方法,此时,称为子类的方法重写了父类的方法。重写体现了子类补充或者改变父类方法的能力。通过重写,可以使一个方法在不同的子类中表现出不同的行为。

  说明:重写也可以称为覆盖。由于dog类和cat类都重写了父类的方法cry(),所以执行的是子类中的cry()方法,但是sheep类没有重写父类的方法,所以执行的是父类中的cry()方法。

  使用super关键字

  子类可以继承父类的非私有成员变量和成员方法(不是以private关键字修饰的)作为自己的成员变量和成员方法。但是,如果子类中声明的成员变量与父类的成员变量同名,则子类不继承父类的成员变量,此时称子类的成员变量隐藏了父类的成员变量。如果子类中声明的成员方法与父类的成员方法同名,并且方法的返回值及参数个数和类型也相同,则子类不能继承父类的成员方法,此时称子类的成员方法重写了父类的成员方法。这时,如果想在子类中访问父类中被子类隐藏的成员方法或变量,就可以使用super关键字,super关键字主要有以下两种用途。

  (1)调用父类的构造方法

  (概念)子类可以调用父类声明的构造方法。但是必须在子类的构造方法中使用super关键字来调用。语法格式:

  super([参数列表]);

  如果父类的构造方法中包括参数,则参数列表为必选项,用于指定父类构造方法的入口参数。

  在项目中创建beast类,在类中添加一个默认的构造方法和一个带参数的构造方法。如果想在子类tiger中使用父类的带参数的构造方法进行调用。

  2)操作被隐藏的成员变量和被重写的成员方法

  如果想在子类中操作父类中被隐藏的成员变量和被重写的成员方法,也可以使用super关键字。语法格式:

  super.成员变量

  super.成员方法名(【参数列表】)

  如果想在子类tiger的方法中改变父类beast的成员变量skin的值,可以使用以下代码:

  super.skin="";

  如果想在子类tiger的方法中使用父类beast的成员方法move(),可以使用以下代码:

  super.move():

多态

  (概念)多态性是面向对象程序设计的重要部分。在Java语言中,通常使用方法的重载(overloading)和重写(overriding)实现类的多态性。重写已经介绍,下面将介绍方法的重载。

  说明:重写之所以具有多态性,是因为父类的方法在子类中被重写,子类和父类的方法名称相同,所以说,重写也具有多态性。

  (概念)方法的重载是指在一个类中出现多个方法名相同,但参数个数或参数类型不同的方法,则称为方法的重载。Java语言在执行具有重载的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。

  注意:重载的方法之间不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法。在进行方法的重载时,方法返回值的类型不能作为区分方法的标志。

  小结:了解继承与多态的极致,掌握重载、类型转换等技术,学会使用接口与抽象类,从而对继承和多态有一个比较深入的了解。应仔细揣摩继承和多态机制,因为继承和多态本身是比较抽象的概念问题,深入理解需要一段时间,使用多态机制必须扩展自己的编程视野,应该讲编程的着眼点放在类与类之间的共同特性以及关系上,这样将为软件开发带来更快的速度、更完善的代码组织架构、更好的扩展性和维护性。

posted on 2017-05-25 15:44  L1nus  阅读(379)  评论(0)    收藏  举报

导航