第8章继承·经过了前面学习,对面向对象有了一定的认识,下面开始学习面向对象的一个重要的概念——继承。在此基础上讨论重写、重载、重写与重载之间的区别,以及多态和如何灵活运用final、abstract等概念,因此学好这些概念是灵活运用多态的基石。通过本章的学习,读者应该能够完成如下几个目标。·了解什么是继承和继承如何使用。·掌握声明成员变量的修饰符。·熟练掌握方法的重写和重载。·了解枚举、反射和泛型等热门技术。北京源智天下科技有限公司1-1联系方式:什么是继承····在日常生活中,经常遇到如下问题。有一辆自行车,自行车有颜色和型号大小之分,而公路赛车也有颜色和型号大小之分,公路赛车多了一项速度的优势。自行车有的东西公路赛车全都有,而公路赛车有的东西自行车不一定有,它们相同地方有很多。在Java中,对于这种情况下就采用继承来完成这个功能。【范例8-1】通过示例代码8-1来理解什么是继承。示例代码8-101//这是一个类,表述的是一个自行车02publicclassbike03{·04publicStringcolor;//自行车的颜色·05publicintsize;//自行车的大小,即型号·····06}0708//这是一个类,表述的是一个公路赛类09pubicclassracing_cycle10{·11publicStringcolor;//自行车的颜色···12publicintsize;13publicStringspeed;14}//自行车的大小,即型号//公路赛车的速度北京源智天下科技有限公司1-2联系方式:下面就来使用继承来简化上面的程序。···01//这是一个类,表述的是一个自行车02publicclassbike03{·04publicStringcolor;//自行车的颜色·05publicintsize;//自行车的大小,即型号····06}07//这是一个类,表述的是一个公路赛车,它继承于自行车08pubicclassracing_cycleextendsbike09{·10publicStringspeed;//公路赛车的速度1-3··11}继承是为了让代码重复使用,提高效率,在此基础上衍生出更多的新类。继承是面向对象编程的特点,没有继承就不是面向对象编程,而是面向过程了。Java提供了单一继承,通过接口可以实现多重继承。本节要说明什么是继承,继承有那些特点。北京源智天下科技有限公司联系方式:····在Java中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass)。因此,子类是超类的一个功能上的扩展,它继承了超类定义的所有属性和方法,并且添加了特有功能方法。首先举一个典型例子来说明继承有什么特点,然后再结合代码学习。有一对爷俩,爸爸和儿子,爸爸的眼睛是单眼皮,个子很高,头发很好,皮肤很黑,而儿子同样有他爸爸的一些特征,但是儿子的皮肤很白,双眼皮,戴眼镜,在外人看来他们是爷俩。儿子具有爸爸的所有特征,但是儿子的皮肤很白和戴眼睛这些是儿子自己所特有的,也是和爸爸不一样的地方。这个小例子正是日常生活里常见的。换到Java里,类与类之间的关系,可以看成倒置的金字塔,爸爸在上面,儿子在下面。爸爸可能有多个儿子,但是一个儿子只能有一个爸爸,这在日常生活里也是如此。北京源智天下科技有限公司联系方式:·······本节学习了继承的使用,下面对其内容做如下总结。通过继承定义类,可以简化类的定义,让所需要的功能用相应的子类去定义和实现。Java是单继承的,子类可以有很多,父类只能有一个。上面的例子,如果加一个Friend类,Son只能继承自Father,要么继承Friend,不能同时继承Father和Friend。Java的继承是多层继承的,是一个类可以有很多子类,而子类下面又可以有很多子类。父类里的属性和方法可以让子类所有,父类里的属性和方法可以使子类同样拥有,而子类的不能调用父类的方法和属性,子类的无参构造器默认是调用的父类的无参构造器。父类没有定义一个无参的构造器,那么编译器就默认生成一个无参的构造器,也可以在子类构造器里显示使用super方法调用父类构造器,super方法里写几个参数就可以表示调用的是父类的哪一个构造器。一般情况下,定义了一个有参的构造器,就应该定义一个无参的构造器。北京源智天下科技有限公司联系方式:················类的继承是通过Java保留的关键字extends来修饰的,通过extends的关键字表明前者具备后者的公共的成员变量和方法,在具备了所有的公共的成员变量和方法后,本身还能定义一些特有的成员变量和方法。基本语法如下所示。class类名extends父类名称【范例8-6】下面是使用继承的程序。·示例代码8-601publicclassFather02{03publicStringname;//父亲的名字04publicintage;//父亲的年龄05publicStringeye;//父亲眼睛的样子06publicStringheight;//父亲的身高07publicStringcutis;//父亲的皮肤的颜色08}0910publicclassSonextendsFather//Son类继承与Father类11{12publicStringspectacleframe;//这个属性是儿子所特有的表示儿子是否带眼镜13}北京源智天下科技有限公司联系方式:修饰符·修饰符是修饰的当前成员变量的访问限制和状态的。就好比一个眼镜,颜色是黑色的,这个黑色就修饰了这个眼镜,而眼镜的种类很多可以让不同的人群来使用,如近视眼镜就由有近视眼的人群来使用,别人来使用的话就不好了。·publicStringname;//public就是一个修饰符·成员变量的继承是指B继承与A后,B能使用A的属性和方法,是受成员变量的修饰符决定的。在上一节的例子里的成员变量都是使用的默认修饰符,本小节将详细介绍修饰符是如何限制成员变量的继承的。主要有4个修饰符:public、private、default、protected,对其详细介绍将分为小节来进行。北京源智天下科技有限公司1-7联系方式::声明成员变量为公共类型·public表明被它修饰的成员变量为公共类型,那么这个成员变量在任何包里都能访问,包括子类也能访问到,下面用代码来说明。·下面是使用public修饰符的程序。北京源智天下科技有限公司1-8联系方式::声明成员变量为私有类型·private表明被它修饰的成员变量为私有类型,表示除了本类外任何类都不能访问到这个成员变量,具有很好的保护性。下面用代码来说明。·【范例】下面是使用private修饰符的程序。北京源智天下科技有限公司1-9联系方式::声明成员变量为默认类型·如果不给成员变量添加任何修饰符,就表示这个成员变量被修饰为default类型,在一个同包里的类或子类是能够访问的,相当于public类型,但是在不同包里的类或子类没有继承该成员变量,是访问不到它的。北京源智天下科技有限公司1-10联系方式::声明成员变量为保护类型·protected表明被它修饰的成员变量为保护类型,在同一包里和public类型是一样的,也是能够访问到的,但是如果在不同包里的protected类型的成员变量就只能通过子类来访问,这个修饰符是区别于其他的修饰符的。北京源智天下科技有限公司1-11联系方式:成员变量的覆盖·正如前面所举爸爸和儿子的例子,爸爸的眼睛是单眼皮,儿子的是双眼皮,不能说儿子没有继承爸爸的特性,只能说明儿子的特性把爸爸的覆盖了。成员变量的覆盖是子类里有和父类里相同的成员变量或方法,继承的关系,子类的成员变量将会使用,而父类的成员变量被保护起来。有时也因修饰符原因而变化,下面用代码来说明。北京源智天下科技有限公司1-12联系方式:对象引用·对象引用就好比一个人的名字,是一个代号。也是为了方便和容易记忆所用的。比如去商店里买水果,进门就说我要买水果,而售货员也不知道要买的是什么。在Java里定义了一个类,这个类里有很多的成员变量和方法,再给这个类起一个名字,这个名字就是这个对象的引用。·bikeb=newbike();·代码说明:·bikeb是创建Like类的一个对象应用,而这个b就相当于bike的名字。·newbike()相当于把bike这个类实例化了,真实存在与内存当中了。北京源智天下科技有限公司1-13联系方式:方法的重写和重载·方法的重写和重载是体现继承特性的重要方面,理解了方法的重写和重载,可以为以后学习多态打下基础,本节重点学习重写和重载的用法和区别。北京源智天下科技有限公司1-14联系方式:方法重写的特点·自行车的移动和公路赛车的移动都是靠外力来移动,二者是相同的。公路赛车继承了这一特点,但公路赛车的移动速度就不相同了,移动的快慢就是由它们各自移动特性不相同决定的,方法继承的特点和成员变量的覆盖很类似,但也有特殊情况,方法重写也可以叫方法的覆盖。关键字为override。·【范例】下面用例子说明在日常生活中自行车和公路赛车的相同点和不同点。北京源智天下科技有限公司1-15联系方式:方法重载的特点·方法的重载就好比日常生活中人的名字,有大名也有小名,但这些名字都指的是这个人,不同点就是让这个人去做的事情可能不一样,如图所示。北京源智天下科技有限公司1-16联系方式:···········1-17这和Java里的重载很相似,关键字为overload。下面看一下重载的要求。重载的方法名称相同,但方法的参数列表不相同。如参数个数和参数类型等。图8-9重载重载的方法的返回值可以相同也可以不相同。代码演示:publicStringmove(){};publicStringmove(Stringname){};publicvoidmove(Stringname,intspend){};代码说明:虽然三种方法的名称是相同的,但这三种方法的的参数列表,即个数和类型,是不相同的。判断方法是否是重载,看参数列表是很重要的。什么是传递基本类型,所谓基本类型就是用于数学计算的那些类型。当有两个名称一样的方法时,根据传递数值的类型来匹配哪两个方法的参数列表是相同的。北京源智天下科技有限公司联系方式:重写的返回类型·方法有它的返回类型,而重写的方法也有返回类型,并有一些相应的限制。方法被重写后,返回的类型为基本类型时,重写方法的返回要必须一样,否则会出现错误。·【范例】下面是演示重写返回类型的代码。北京源智天下科技有限公司1-18联系方式:重写是基于继承的·重写和重载的产生是基于继承的,如果没有发生继承就不会产生重写和重载了。举个例子来说,自行车通过外力可以移动,而公路赛车通过外力也可以移动,公路赛车继承了自行车的特性。也可以说成,公路赛车是自行车的一个升级版本。相当于一个参照点吧