上面所说的对象是一个具体的事物,例如每辆汽车都是一个不同的对象。但是多个对象常常具有一些共性,如所有的汽车都有轮子、方向盘、刹车装置等。于是我们抽象出一类对象的共性,这就是类。类中定义一类对象共有的变量和方法。把一个类实例化即生成该类的一个对象。比如我可以定义一个汽车类来描述所有汽车的共性。通过类的定义人们可以实现代码的复用。我们不用去描述每一个对象(如某辆汽车),而是通过创建类(如汽车类)的一个实例来创建该类的一个对象,这大大减化了软件的设计。
6.1.2继承
通过对象、类,我们实现了封装,通过子类我们可以实现继承。
对于上例来说,公共汽车、出租车、货车等都是汽车,但它们是不同的汽车,除了具有汽车的共性外,它们还具有自己的特点(如不同的操作方法,不同的用途等)。这时我们可以把它们作为汽车的子类来实现,它们继承父类(汽车)的所有状态和行为,同时增加自己的状态和行为。通过父类和子类,我们实现了类的层次,可以从最一般的类开始,逐步特殊化,定义一系列的子类。同时,通过继承也实现了代码的复用,使程序的复杂性线性地增长,而不是呈几何级数增长。
在C++中支持多重继承,即一个类可以继承多个父类,这使得对象的实现变得非常复杂且不可预料(设想多个父类拥有某些相同的变量和方法)。Java则只支持单一继承,大大降低了复杂度。在Java中通过接口可以实现多重继承,但接口的概念更简单,使用更方便,而且不仅仅限于继承,它使多个不相关的类可以具有相同的方法。 考试站(www.examzz.com)
6.1.3多态
Java通过方法重写和方法重载(overloading)来实现多态。
通过方法重写,一个类中可以有多个具有相同名字的方法,由传递给它们不同个数或不同类型的参数来决定使用哪种方法,这就是多态。
例如,对于一个作图的类,它有一个draw()方法用来画图或输出文字,我们可以传递给它一个字符串、一个矩形、一个圆形,甚至还可以再指定作图的初始位置、图形的颜色等,对于每一种实现,只需实现一个新的draw()方法即可,而不需要新起一个名字,这样大大简化了方法的实现和调用,程序员和用户都不需要记住很多的方法名,只需要传入相应的参数即可。
通过方法重载,子类可以重新实现父类的某些方法,使其具有自己的特征。例如对于汽车类的加速方法,其子类(如赛车)中可能增加了一些新的部件来改善提高加速性能,这时可以在赛车类中重载父类的加速方法。重载隐藏了父类的方法,使子类拥有自己具体实现,更进一步表明了与父类相比,子类所具有的特殊性。