技术篇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语言在执行具有重载的方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。
注意:重载的方法之间不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法。在进行方法的重载时,方法返回值的类型不能作为区分方法的标志。
小结:了解继承与多态的极致,掌握重载、类型转换等技术,学会使用接口与抽象类,从而对继承和多态有一个比较深入的了解。应仔细揣摩继承和多态机制,因为继承和多态本身是比较抽象的概念问题,深入理解需要一段时间,使用多态机制必须扩展自己的编程视野,应该讲编程的着眼点放在类与类之间的共同特性以及关系上,这样将为软件开发带来更快的速度、更完善的代码组织架构、更好的扩展性和维护性。
浙公网安备 33010602011771号