第4章深入面向对象的程序设计PPT讲稿.ppt
《第4章深入面向对象的程序设计PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第4章深入面向对象的程序设计PPT讲稿.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章深入面向对象深入面向对象的程序设计的程序设计第1页,共73页,编辑于2022年,星期一学习提要学习提要1.1.熟练掌握继承关系的定义、属性的继承和隐藏、方法的熟练掌握继承关系的定义、属性的继承和隐藏、方法的继承与覆盖;继承与覆盖;2.2.理解多态的含义和用法,包括方法的重载、构造函数的理解多态的含义和用法,包括方法的重载、构造函数的继承与重载、继承与重载、thisthis与与supersuper、父类对象与子类对象的使、父类对象与子类对象的使用和转化;用和转化;3.3.掌握包的定义与使用方法;掌握包的定义与使用方法;4.4.熟悉接口与多重继承的关系、接口的定义和使用;熟悉接口与多重继
2、承的关系、接口的定义和使用;5.5.掌握异常的定义和使用方法。掌握异常的定义和使用方法。第2页,共73页,编辑于2022年,星期一4.1Java的继承与多态的继承与多态4.1.1 4.1.1 继承与多态的概念继承与多态的概念(1 1)继承)继承 继承是两个类继承是两个类(或接口或接口)之间的一种关系,通过之间的一种关系,通过extendsextends关键字关键字来实现,被继承的类称为父类或超类,来实现,被继承的类称为父类或超类,继承了父类的所有数据继承了父类的所有数据和操作的类称为子类和操作的类称为子类。新定义的子类可以从父类。新定义的子类可以从父类继承所有非继承所有非privatepriv
3、ate的属性和方法的属性和方法作为自己的成员。一个父类可以同时拥有作为自己的成员。一个父类可以同时拥有多个子类。多个子类。单重继承:单重继承:任何一个类都只有一个单一的父类。任何一个类都只有一个单一的父类。程序结构为树状,比较简单。程序结构为树状,比较简单。多重继承:多重继承:一个类可以有一个以上的父类,其静态的一个类可以有一个以上的父类,其静态的 数据属性和操作从所有这些父类中继承。数据属性和操作从所有这些父类中继承。程序结构为网状,比较复杂。程序结构为网状,比较复杂。第3页,共73页,编辑于2022年,星期一图图4.1各种电话卡类及其间的继承关系各种电话卡类及其间的继承关系第4页,共73页
4、,编辑于2022年,星期一 在面向对象的程序设计中,在面向对象的程序设计中,采用继承的机制来组织、设计系统中采用继承的机制来组织、设计系统中的类的类的优点的优点:可以提高程序的抽象程度,使之更接近于人类的思维方式;可以提高程序的抽象程度,使之更接近于人类的思维方式;使得程序结构清晰,降低编码和维护的工作量。使得程序结构清晰,降低编码和维护的工作量。注意:注意:(1)Java(1)Java只支持只支持单重继承,单重继承,而采用而采用接口接口来实现来实现多重继承多重继承。class subClass class subClass extendsextends SuperClass SuperCla
5、ss implementsimplements interfaceinterface1 1,interface,interface2 2,interfaceinterfacen n/SuperClass/SuperClass和各个接口中和各个接口中的非的非privateprivate的属性和方法均被继承(实现)!的属性和方法均被继承(实现)!(2)(2)而而C+C+中一个类中一个类可以有多个父类。可以有多个父类。第5页,共73页,编辑于2022年,星期一(2 2)多态)多态 多态是针对方法而言的,是指同名的方法具有多种表现形多态是针对方法而言的,是指同名的方法具有多种表现形态。态。实现多态的途
6、径:实现多态的途径:1 1)覆盖()覆盖(override override)在子类中对在子类中对从父类继承从父类继承的方法进行改写。的方法进行改写。2 2)重载()重载(overload overload)在同一个类中定义在同一个类中定义多个同名多个同名的方法。的方法。比如,程序中定义多个名为比如,程序中定义多个名为 print print方法,用来打印不同类型的方法,用来打印不同类型的数据,如字符型、数值型等。数据,如字符型、数值型等。区分同名方法的措施:区分同名方法的措施:采用不同的形式参数列表,包括形式参数的个采用不同的形式参数列表,包括形式参数的个数、类型、顺序的不同。数、类型、顺序
7、的不同。第6页,共73页,编辑于2022年,星期一4.1.2属性的继承与隐藏属性的继承与隐藏(1 1)属性的继承:)属性的继承:子类从父类继承属性而不是把父类属性的定义部子类从父类继承属性而不是把父类属性的定义部分复制一遍,可以减少程序维护的工作量。分复制一遍,可以减少程序维护的工作量。(2 2)属性的隐藏:)属性的隐藏:对子类从父类继承来的属性变量重新加以定义。对子类从父类继承来的属性变量重新加以定义。即:子类定义了与父类同名的属性变量即:子类定义了与父类同名的属性变量,即出现了子类变量对,即出现了子类变量对同名父类变量的同名父类变量的隐藏。隐藏。如何区分:如何区分:子类执行从父类所继承的方
8、法时,处理的是继承自父类的变量。子类执行从父类所继承的方法时,处理的是继承自父类的变量。子类执行它自己定义的方法时,操作的是自己定义的变量,而把从子类执行它自己定义的方法时,操作的是自己定义的变量,而把从父类继承的变量父类继承的变量“隐藏隐藏”起来。起来。第7页,共73页,编辑于2022年,星期一子类覆盖父类的方法时,要注意不能降低父类方法子类覆盖父类的方法时,要注意不能降低父类方法的访问权限的访问权限!(1)classSuperClasspublicvoidmethod1()voidmethod2()classSubClassextendsSuperClassvoidmethod1()/降低
9、了访问权限,不允许!降低了访问权限,不允许!publicvoidmethod2()/提升了访问权限,允许!提升了访问权限,允许!StringtoString()return“Hello,World!”;/不允许不允许!以上覆盖的使用错误,如何改正呢?以上覆盖的使用错误,如何改正呢?第8页,共73页,编辑于2022年,星期一同一个类中方法重载时,要注意参数的类型、顺序、同一个类中方法重载时,要注意参数的类型、顺序、个数要体现不同!个数要体现不同!请分析以下程序段中的错误原因。请分析以下程序段中的错误原因。importjava.util.*;classJustInOneClasspublicvoi
10、doutput(Stringstr)publicvoidoutput(Datedate)publicvoidoutput(Doubled)publicvoidoutput(inti)publicvoidoutput(intj)publicvoidoutput(floatf)publicclasstestpublicstaticvoidmain(Stringargs)第9页,共73页,编辑于2022年,星期一例:例:TestInherit.java/类的继承,属性的继承与隐藏类的继承,属性的继承与隐藏importjava.util.*;publicclassTestInheritpublicst
11、aticvoidmain(Stringargs)D200_Cardmy200=newD200_Card();/有卡号的有卡号的200卡卡my200.balance=50.0;System.out.println(“父类被隐藏的金额为:父类被隐藏的金额为:”+my200.getBalance();/执行继承执行继承自父类的方法,操作父类的变量自父类的方法,操作父类的变量System.out.println(子类本身的金额为:子类本身的金额为:+my200.balance);System.out.println(子类继承的密码为:子类继承的密码为:+my200.password);if(my200
12、.performDial()/执行子类实现了的抽象方法,操作子类的变量执行子类实现了的抽象方法,操作子类的变量System.out.println(子类的剩余金额为:子类的剩余金额为:+my200.balance);System.out.println(父类被隐藏的金额仍为:父类被隐藏的金额仍为:+my200.getBalance();第10页,共73页,编辑于2022年,星期一abstractclassPhoneCard/定义电话卡抽象类定义电话卡抽象类doublebalance=60;/公共属性公共属性abstractbooleanperformDial();doublegetBalanc
13、e()returnbalance;abstractclassNone_Number_PhoneCardextendsPhoneCard/定义无号电话卡抽象类定义无号电话卡抽象类StringphoneSetType;StringgetSetType()returnphoneSetType;abstractclassNumber_PhoneCardextendsPhoneCard/定义有号电话卡抽象类定义有号电话卡抽象类longcardNumber;intpassword=111;StringconnectNumber;booleanconnected;booleanperformConnecti
14、on(longcn,intpw)if(cn=cardNumber&pw=password)connected=true;returntrue;elsereturnfalse;第11页,共73页,编辑于2022年,星期一classmagCardextendsNone_Number_PhoneCard/定义磁卡,无号电话卡抽象类的子类定义磁卡,无号电话卡抽象类的子类StringusefulArea;booleanperformDial()if(balance0.9)balance-=0.9;returntrue;elsereturnfalse;classIC_CardextendsNone_Num
15、ber_PhoneCard/定义定义IC卡,无号电话卡抽象类的子类卡,无号电话卡抽象类的子类booleanperformDial()if(balance0.5)balance-=0.5;returntrue;elsereturnfalse;第12页,共73页,编辑于2022年,星期一classIP_CardextendsNumber_PhoneCard/定义定义IP卡,有号电话卡抽象类的子类卡,有号电话卡抽象类的子类DateexpireDate;booleanperformDial()if(balance0.3&expireDate.after(newDate()balance-=0.3;re
16、turntrue;elsereturnfalse;classD200_CardextendsNumber_PhoneCard/定义定义200卡,有号电话卡抽象类的子类卡,有号电话卡抽象类的子类doubleadditoryFee=0.6;doublebalance;/子类的属性子类的属性,体现属性隐藏体现属性隐藏booleanperformDial()if(balance(0.5+additoryFee)balance-=(0.5+additoryFee);returntrue;elsereturnfalse;第13页,共73页,编辑于2022年,星期一4.1.3 4.1.3 方法的继承、重载与
17、覆盖方法的继承、重载与覆盖(1 1)方法的继承)方法的继承 父类的非私有方法,可以被子类所继承。父类的非私有方法,可以被子类所继承。(2 2)方法的覆盖)方法的覆盖 子类定义与父类同名的方法,除非使用子类定义与父类同名的方法,除非使用supersuper关键字或父类名为前缀,关键字或父类名为前缀,否则调用的都是自己定义的方法。否则调用的都是自己定义的方法。注意:注意:子类在重新定义父类已有的方法时应保持与父类完全相同的子类在重新定义父类已有的方法时应保持与父类完全相同的方法头声明。方法头声明。(如从如从objectobject继承来的继承来的toString()toString()方法方法)(
18、3 3)方法的重载)方法的重载 方法的重载是方法的重载是同一个类中多个同名方法同一个类中多个同名方法共存的情况,需通过参数共存的情况,需通过参数列表(包括类型、顺序和数目)来区分不同的方法。列表(包括类型、顺序和数目)来区分不同的方法。注意:注意:不能通过方法的返回值来区分同名的不同方法。不能通过方法的返回值来区分同名的不同方法。第14页,共73页,编辑于2022年,星期一例:例:TestOverride.javaTestOverride.java/方法的继承与覆盖,子类出现与父类中完全同名、同参数的方法方法的继承与覆盖,子类出现与父类中完全同名、同参数的方法public class Test
19、Overridepublic class TestOverride public static void main(String args)public static void main(String args)PhoneCard myCard=new PhoneCard();PhoneCard myCard=new PhoneCard();D200_Card my200=new D200_Card();D200_Card my200=new D200_Card();System.out.println(System.out.println(直接访问父类的方法改变金额为:直接访问父类的方法改变
20、金额为:+myCard.getBalance();+myCard.getBalance();System.out.println(System.out.println(直接访问子类的属性金额为:直接访问子类的属性金额为:+my200.balance);+my200.balance);System.out.println(System.out.println(调用子类方法(覆盖父类)改变的金额为:调用子类方法(覆盖父类)改变的金额为:+my200.getBalance();+my200.getBalance();my200.balance=50.0;my200.balance=50.0;Syst
21、em.out.println(System.out.println(赋值后访问子类的属性金额为:赋值后访问子类的属性金额为:+my200.balance);+my200.balance);if(my200.performDial()if(my200.performDial()System.out.println(System.out.println(调用子类方法后剩余金额为:调用子类方法后剩余金额为:+my200.balance);+my200.balance);System.out.println(System.out.println(直接访问子类的属性密码为:直接访问子类的属性密码为:+m
22、y200.password);+my200.password);System.out.println(System.out.println(继承父类方法修改密码为:继承父类方法修改密码为:+my200.changePwd(222);+my200.changePwd(222);System.out.println(System.out.println(访问父类属性密码为:访问父类属性密码为:+myCard.password);+myCard.password);第15页,共73页,编辑于2022年,星期一classPhoneCarddoublebalance=100;longcardNumber
23、;intpassword;doublegetBalance()/父类定义的方法父类定义的方法returnbalance+20;intchangePwd(intpwd)/父类定义的方法父类定义的方法password=pwd;returnpwd;classD200_CardextendsPhoneCarddoubleadditoryFee;doublebalance=60;booleanperformDial()if(balance(0.5+additoryFee)balance-=(0.5+additoryFee);returntrue;elsereturnfalse;doublegetBala
24、nce()/子类的同名方法,实现方法的覆盖子类的同名方法,实现方法的覆盖returnbalance+10;第16页,共73页,编辑于2022年,星期一例:例:TestOverLoad.javaTestOverLoad.java/方法的重载:一个类中存在多个同名但参数不同的方法方法的重载:一个类中存在多个同名但参数不同的方法publicclassTestOverLoadpublicstaticvoidmain(Stringargs)D200_Cardmy200=newD200_Card(12345678,1234,50.0,200);if(my200.performDial(12345678,1
25、234)System.out.println(拨打电话后剩余金额为:拨打电话后剩余金额为:+my200.getBalance();if(my200.performDial()System.out.println(拨打电话后剩余金额为:拨打电话后剩余金额为:+my200.getBalance();abstractclassPhoneCarddoublebalance;abstractbooleanperformDial();doublegetBalance()returnbalance;第17页,共73页,编辑于2022年,星期一abstractclassNumber_PhoneCardexte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 深入面向对象的程序设计PPT讲稿 深入 面向 对象 程序设计 PPT 讲稿
限制150内