本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|语言的一个重要特性。本章主要介绍关于继承的若干应用。通过继承,子类拥有父类的所有非私有成员。子类对继承自父类的类成员重新进行定义,就称为覆盖。方法的重载是一个类中对自身已有的同名方法的重新定义。每个重载方法的参数的类型和(或)数量必须是不同的。用abstract修饰符修饰的类称为抽象类,抽象类不能实例化为对象。如果一个类被final修饰符所修饰,说明这个类不可能有子类,这样的类就称为最终类。最终类不能被别的类继承,它的方法也不能被覆盖。接口用interface来声明。接口中的域变量都是常量,方法都是没有方法体的抽象方法,其方法的真正实现在“继承”这个接口的各个类中完成。一个类只能有一个父类,但是类可以同时实现若干个接口,从而实现了多重继承。本章要点继承和多态的概念、特点以及实现方法域的继承与隐藏方法的继承与覆盖接口的实现本章难点继承和多态的实现方法接口的实现学习目标理解继承、多态、接口的概念掌握继承、多态、接口在Java中的实现。4.1继承和多态的概念4.1.1继承的概念继承实际上是存在于面向对象程序中的两个类之间的一种关系。当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系。被继承的类B称为父类或超类,继承了父类或超类的数据和操作的类A称为子类或衍生类,一个父类可以同时拥有多个子类。使用继承具有以下的好处:降低了代码编写中的冗余度,更好地实现了代码复用的功能,从而提高了程序编写的效率,使得程序维护变得简单、方便。现以汽车为例,汽车分为很多种,比如公共汽车、警车、私家车等。如果要实现对汽车的管理,就需要为每一种汽车创建一个类,而每一个类中都会具有所有汽车共有的本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|属性和方法,比如每个汽车类都会有颜色、车灯等属性,都会有加速、刹车等方法,这样势必带来代码的重复,维护起来也比较麻烦。如果我们将所有汽车共有的属性和方法都抽象出来,构建一个汽车类,让各种汽车都继承这个类,这样在汽车这个类中所拥有的属性就会衍生在它的子类中,各种汽车都会具有汽车类所拥有的属性和方法,我们就不用为每种汽车定义像颜色、车灯这样的属性,以及加速、刹车等相同的方法了。而且维护起来也比较容易了。这种结构如图4-1所示。图4-1汽车类的继承继承分为单重继承和多重继承两种类型,所谓单重继承,是指任何一个类都只有一个单一的父类;而多重继承是指一个类可以有一个以上的父类。采用单重继承的程序结构比较简单,是单纯的树状结构,掌握、控制起来相对容易;而支持多重继承的程序,其结构则是复杂的网状,设计、实现都比较复杂。Java语言仅支持类的单重继承。4.1.2多态的概念多态是面向对象程序设计的又一个特殊特性。所谓多态,是指一个程序中同名的不同方法共存的情况。面向对象的程序中多态的情况有多种,可以通过子类对父类成员的覆盖实现多态,也可以利用在同一个类中同名方法的重载来实现多态。多态是指一个方法声明的多个不同表现形式。在同一个类中或者不同的类中,同一个方法的多个不同实现。比如同样是刹车这样一个功能,在不同的汽车中所要做的操作可能是不一样的,这样我们在程序中就要为刹车这个方法名创建几个不同的实现,也就是说,刹车这个方法名可能会有几个不同的方法体,这就是面向对象程序设计中多态的概念。4.2类的继承4.2.1继承的实现Java中的继承是通过extends关键字来实现的,在定义类时使用extends关键字指明新定义类的父类,就在两个类之间建立了继承关系。其语法是:汽车类颜色、车灯加速()、刹车()公共汽车警车私家车本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|[类修饰符]class子类名extends父类名从上面的语法格式,我们可以看出比一般类的声明多了“extends”关键字部分,通过该关键字来指明子类要继承的父类。如果,父类和子类不在同一个包中,则需要使用“import”语句来引入父类所在的包。【例4_1】继承的简单示例。classFather{intf_a=0;voidprint(){System.out.println(f_a=+f_a);}}classSonextendsFather{ints_a=10;}classExam4_1{publicstaticvoidmain(String[]args){Sons=newSon();s.print();System.out.println(f_a=+s.f_a);System.out.println(s_a=+s.s_a);}}在例子中可以看到,在子类的声明中使用“extends”关键字指明一个被继承的父类就可以实现类之间的继承关系。Son类中虽然并没有定义f_a变量和print()方法,但是仍然可以访问,这是因为它从父类中继承过来的原因。子类Son还定义了自己的变量s_a,这说明了子类可以拥有比父类更多的变量和方法,也就是说子类拥有更强大的功能。程序的执行结果如图4-2所示。图4-2例4_1程序运行结果本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|的属性和方法作为自己的成员。同时根据需要再加入一些自己的属性或方法就产生了一个新的子类。可见父类的所有非私有成员实际是各子类都拥有集合的一部分,这样做的好处是减少程序维护的工作量。从父类继承来的成员,就成为了子类所有成员的一部分,子类可以使用它。【例4_2】继承的示例。classFather{privateintf_a=0;privatevoidprint(){System.out.println(f_a=+f_a);}}classSonextendsFather{ints_a=10;}classExam4_2{publicstaticvoidmain(String[]args){Sons=newSon();//s.print();//System.out.println(f_a=+s.f_a);System.out.println(s_a=+s.s_a);}}仍然如4.1的例子,但此时我们把父类中的变量f_a和方法print()修改为了private的作用域,此时在子类中就不能访问这两个成员了,因为子类不能继承私有的父类成员,程序中注释掉的两条语句是错误的读者可自行检验。程序的运行结果如图4—3所示。图4-3例4_2程序运行结果【例4_3】继承的示例。classFather{privateintf_a=0;本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|(){System.out.println(f_a=+f_a);}}classSonextendsFather{ints_a=10;}classExam4_3{publicstaticvoidmain(String[]args){Sons=newSon();s.print();//System.out.println(f_a=+s.f_a);System.out.println(s_a=+s.s_a);}}继续对4.1的例子作修改,把把父类中的变量f_a修改为了private的作用域,但方法print()仍然保持默认作用域,此时可以看到在子类中直接访问变量f_a会出现错误,但通过print()方法我们却可以访问到私有作用域的f_a变量,这又是因为什么呢?这是因为print()方法被子类继承,print()方法和变量f_a都是父类的成员,它们之间进行访问是不存在问题的,利用公共的方法去访问私有的成员,这正是面向对象封装特点的好处,它使得在类外不能直接访问私有的属性,但可以利用方法作为接口对变量进行读取操作,增强了程序的健壮性。程序的运行结果如图4_4所示。图4-4例4_3程序运行结果4.2.3替代原理有了继承特点,面向对象编程中就存在了一个替代原理,用一句话讲替代原理的内容是:子类对象总可以看作一个父类对象。也就是说,在所有使用父类对象的地方,都可以使用一个子类对象来代替父类对象,也有人把这种原理称为“isa”关系。比如在例4.1中,f_a变量和print()方法是父类的成员,应该用父类的对象去访问,但我们却使用了子类的对象去访问这两个成员,这可以认为是一种简单的替代,我们来看下面这个例子。本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|【例4_4】替代原理示例。classFather{privateintf_a=0;voidprint(Fatherf){System.out.println(f_a=+f.f_a);}}classSonextendsFather{}classExam4_4{publicstaticvoidmain(String[]args){Fatherf=newFather();Sons=newSon();f.print(s);}}我们给print()方法加上了参数,这个参数是一个父类的引用,但我们调用时,却给方法传递了一个子类的引用s,程序却依然可以正常运行,这就是替代原理。程序的运行结果如图4-5所示。图4-5例4_4程序运行结果4.3类成员的覆盖4.3.1覆盖的用法在程序的设计过程中,我们通过继承可以快速地将父类中已实现的非私有类成员应用到自己定义的子类中。但是,不是所有继承下来的类成员都是我们需要的,这时候我们就可以通过使用覆盖的方式来解决这个问题。子类对继承自父类的类成员重新进行定义,就称为覆盖。要进行覆盖,就是在子类中对需要覆盖的类成员以父类中相同的格式,再重新声明定义一次,这样就可以对继承下来的类成员进行功能的重新实现,从而达到程序设计的要求。本资料由-大学生创业|创业|创业网提供资料在线代理|网页代理|代理网页|减肥药排行榜|淘宝最好的减肥药|什么减肥药效果最好|减肥瘦身药|【例4_5】覆盖的示例。classFather{intf_a=0;voidprint(){System.out.println(f_a=+f_a);}}classSonextendsFather{intf_a=10;voidprint(){System.out.println(f_a=+f_a);}}classExam4_5{pu