您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > java继承与多态.
2020/1/1022:171第四章继承与多态武汉大学计算机学院计算机应用系2020/1/1022:17第2页全面掌握面向对象的基本特征掌握如何使用继承性来到达软件的重用深入掌握继承过程中域的隐藏和方法的覆盖技巧深入掌握抽象类和抽象方法的定义深入掌握接口的定义和使用技巧本章学习要点2020/1/1022:17第3页本章讨论面向对象程序设计另外两个最重要的特点:继承和多态。继承是面向对象程序设计方法中实现软件重用的一种重要手段,通过继承可以更有效地组织程序结构,明确类之间的关系,并充分利用已有的类来创建新类,通过继承可以实现代码的复用,以完成更复杂的设计、开发。多态则可以统一多个相关类的对外接口,并在运行时根据不同的情况执行不同的操作,提高类的抽象度和灵活性。2020/1/1022:1744.1子类、父类与继承机制2020/1/1022:17第5页4.1.1继承的概念在类的定义过程中,继承是一种由已有的类创建新类的机制。继承而得到的类为子类,被继承的类为父类,父类包括所有直接或间接被继承的类。Java中不支持多重继承。通过在类的声明中加入extends子句来创建一个类的子类:classSubClassextendsSuperClass{……}如果缺省extends子句,则该类为java.lang.Object的子类。子类可以继承父类中访问权限设定为public、protected、package的成员变量和方法,但是不能继承访问权限为private的成员变量和方法。2020/1/1022:17第6页4.1.1继承的概念何时选择继承?一个很好的经验:“B是一个A吗?”如果是则让B做A的子类.一个父类可以同时拥有多个子类,而每一个子类则是对公共域和方法在功能、内涵方面的扩展和延伸。父类、子类间的关系具有:·共享性即子类可以共享父类的公共域和方法。·差异性即子类和父类一定会存在某些差异,否则就应该是同一个类。·层次性即由Java规定的单继承性,每个类都处于继承关系中的某一个层面。2020/1/1022:17第7页4.1.2类的层次Java语言中类的是有严格的层次结构的。除Object类之外,每个类都继承惟一的父类。这种继承性性质使得类的层次结构形成了如图所示的一种树状结构。Object类定义和实现了Java系统所需要的众多类的共同行为,它是所有类的父类,也即这个树状结构中的根类,所有的类都是由这个类继承、扩充而来的,这个Object类定义在java.lang包中。2020/1/1022:17第8页4.1.2类的层次Java语言中类的层次结构2020/1/1022:1794.2继承的实现2020/1/1022:17第10页4.2.1子类的定义定义一个子类,即在定义一个类的时候加上extends关键字,并在之后带上其父类名,其一般格式为:[类的修饰符]class子类名extends父类名{域定义;方法定义;}这和前面定义类的格式并没有什么区别,只是现在“extends父类名”不再是可选项。2020/1/1022:17第11页4.2.1子类的定义classpoint{intx,y;voidgetxy(inti,intj){x=i;y=j;}}classcircleextendspoint{doubler;doublearea(){return3.14*r*r;}}点类圆类求圆面积、画圆半径r获取、输出坐标点坐标点x,y父类子类2020/1/1022:17第12页4.2.1子类的定义固定电话移动电话电话类电话号码、剩余金额查询余额、计费方式座机费计费方式普通电话是否开通国际长途是否开通国内长途计费方式IP电话是否已启用失效日期计费方式入网方式计费方式小灵通普通手机计费方式计费方式电话及其子类的继承关系2020/1/1022:17第13页4.2.1子类的定义【例4.2】实现图4.2中电话类的继承结构。为了代码的简洁,而把注意力集中在我们要讨论的语法机制上,这里假设移动电话仅一种,电话的计费方式为:国内长途话费是市话费的3倍,国际长途话费是市话费的9倍。abstractclassTelephone{longphoneNumber;finalintlocal_Call=1;finalintdistance_Call=3;finalintinternational_Call=9;doublebalance;abstractbooleancharge_Mode(intcall_Mode);doublegetBalance(){returnbalance;}2020/1/1022:17第14页4.2.2域的继承与隐藏1.域的继承子类可以继承父类的所有非私有域。例如各类电话类所包含的域分别为:Mobile_Phone类longphoneNumber;intlocal_Call;intdistance_Call;intinternational_Calldoublebalance;来自继承父类Telephone的5个基本域StringnetworkType;2020/1/1022:17第15页4.2.2域的继承与隐藏IP_Phone类longphoneNumber;intlocal_Call;intdistance_Call;intinternational_Calldoublebalance;来自继承父类Telephone的5个基本域doublemonthFee;来自继承父类Fixed_Telephoneboolearnstarted;DateexpireDate;子类IP_Phone类中声明的域2020/1/1022:17第16页4.2.2域的继承与隐藏Ordinary_phone类longphoneNumber;intlocal_Call;intdistance_Call;intinternational_Calldoublebalance;来自继承父类Telephone的5个基本域doublemonthFee;来自继承父类Fixed_TelephonebooleanlongdistanceService;booleaninternationalService;子类Ordinary_phone类中声明的域2020/1/1022:17第17页4.2.2域的继承与隐藏2.域的隐藏子类重新定义一个与从父类继承来的域变量完全相同的变量,称为域的隐藏。即子类中定义了与父类同名的域变量,就是子类变量对同名父类变量的隐藏。这里所谓隐藏是指子类拥有了两个相同名字的变量,一个来自继承父类,另一个由自己定义。在这种情况下,当子类执行继承的父类方法时,处理的是父类的变量,而当子类执行它自己定义的方法时,所操作的就是它自定义的变量,而把来自继承父类的变量“隐藏”起来了。2020/1/1022:17第18页classAclassBextendsA{{staticintdata_a=3;staticintdata_a=5;}}classCextendsB{voidprint_out(){System.out.println(“data_a=”+data_a);System.out.println(“A.data_a=”+A.data_a);System.out.println(“B.data_a=”+B.data_a);}}classdemo{publicstaticvoidmain(Stringargs[]){Cc=newC();c.print_out();}}data_a=5A.data_a=3B.data_a=54.2.2域的继承与隐藏2020/1/1022:17第19页4.2.2域的继承与隐藏固定电话电话类剩余金额、电话号码计费方式、查询余额座机费计费方式普通电话是否接通长途剩余金额计费方式隐藏父类的剩余金额例4.32020/1/1022:17第20页4.2.3方法的继承与覆盖1.方法的继承父类的非私有方法可以被子类所继承。根据方法的继承关系,将例4.3中电话类及其各子类所包含的方法列举如下。(1)Telephone类abstractbooleancharge_Mode();doublegetBalance();(2)Fixed_Telephone类abstractbooleancharge_Mode();//来自继承父类TelephonedoublegetBalance();//来自继承父类Telephone(3)Ordinary_phone类booleancharge_Mode();doublegetBelance();//来自继承父类Fixed_Telephone2020/1/1022:17第21页4.2.3方法的继承与覆盖2.方法的覆盖方法的覆盖(Override)是指子类重定义从父类继承来的一个同名方法,此时父类的这个方法在子类中将不复存在。这是子类通过重新定义与父类同名的方法,实现自身的行为。方法覆盖时应遵循的原则:(1)覆盖后的方法不能比被覆盖的方法有更严格的访问权限。(2)覆盖后的方法不能比被覆盖的方法产生更多的异常。2020/1/1022:17第22页4.2.3方法的继承与覆盖classCar{intcolor_number;intdoor_number;intspeed;publicvoidpush_break(){speed=0;}publicvoidadd_oil(){…}}classTrash_CarextendsCar{doubleamount;publicvoidfill_trash(){…}publicvoidpush_break(){speed=speed–10;}}2020/1/1022:17第23页4.2.3方法的继承与覆盖覆盖方法的调用对于重写的方法,Java运行时系统根据调用该方法的实例的类型来决定选择哪个方法调用。publicclassDemoCar{publicstaticvoidmain(Stringargs[]){CaraCar=newTrash_Car();aCar.push_break();}}在这里,类Trash_Car中的push_break()方法将被调用。2020/1/1022:17第24页4.2.3方法的继承与覆盖方法的覆盖与域的隐藏的不同之处在于:子类隐藏父类的域只是使之不可见,父类的同名域在子类对象中仍然占有自己独立的内存空间;而子类方法对父类同名方法的覆盖将清除父类方法占用的内存空间,从而使父类方法在子类对象中不复存在。域的隐藏和方法的覆盖的意义在于:通过隐藏域和覆盖方法可以把父类的状态和行为改为自身的状态和行为,对外统一名字与接口,又不失其继承性。2020/1/1022:17254.3多态性2020/1/1022:17第26页多态性是面向对象程序设计的又一个重要的技术和手段。多态性是指同名的不同方法在程序中共存。即为同一个方法定义几个版本,运行时根据不同情况执行不同的版本。调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。多态性又被称为“一个名字,多个方法”。2020/1/1022:17第27页4.3.1多态性的概念多态性的实现有两种方式:(1)覆盖实现多态性通过子类对继承父类方法的重定义来实现。使用时注意:在子类重定义父类方法时,要求与父类中方法的原型(参数个数、类型、顺序)完全相同。(2)重载实现多态性通过定义类中的多个同名的不同方法来实现。编译时是根据参数(个数、类型、顺序)的不同来区分不同方法的。2020/1/1022:17第28页4.3.2覆盖实现多态性在覆盖实现多态性的方式中,子类重定义父类方法,此时方法的名字、参数个数、类型、顺序完全相同
本文标题:java继承与多态.
链接地址:https://www.777doc.com/doc-2881390 .html