第4讲面向对象继承优秀课件.ppt
《第4讲面向对象继承优秀课件.ppt》由会员分享,可在线阅读,更多相关《第4讲面向对象继承优秀课件.ppt(59页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4讲面向对象继承第1页,本讲稿共59页主讲:chen第第4 4章章 面向对象编程面向对象编程继承与多态继承与多态892/9/2023第2页,本讲稿共59页继承继承是由已有类创建新类的机制,是面向对象程序设计基础,是面向对象程序设计方法的一个重要手段通过继承可以更有效地组织程序结构,利用已有的类来完成更复杂的新类的设计与开发,充分实现代码重用Java只支持单一继承,即一个类只能有一个超类。多态多态是指一个程序中,同名的不同方法共存的情况。多态提高了类的抽象性和封装性,多态有两种表现形式:同一个类内的方法的重载重载和不同类间的子类对超类方法的覆盖覆盖。继承和多态是面向对象编程的两个核心特点本章介
2、绍继承与多态的实现技术。本章学习说明第3页,本讲稿共59页本章目标1.理解掌握面向对象的两个核心特性继承与多态的概念与应用2.掌握子类的定义,理解掌握子类构造方法的定义与调用原则3.掌握重载与覆盖的概念与应用以及二者的区别4.理解掌握最终类与最终方法、抽象类与抽象方法的概念与应用第4页,本讲稿共59页 4.1 4.1 类的继承类的继承当一个类可以自动拥有另一个类的成员变量和成员方法时,称这两个类之间存在继承关系被继承的类称为超类超类或父类,继承了超类成员的类称为子类子类,子类是由超类派生的类子类通过派生可以继承已有超类的成员,是实现类代码重用和数据共享的重要机制若一个类有一个以上的超类则称为多
3、重继承多重继承。一个类只有一个超类为单重继承单重继承JavaJava只支持单重继承只支持单重继承,即每个类只能有一个超类。Java的单重继承既体现了面向对象编程的思想,又降低了面向对象编程的难度。使Java面向对象编程变得更加简洁 第5页,本讲稿共59页 4.1.1子子类的声明类的声明类的声明类的声明在在Java类的声明中,使用关键字类的声明中,使用关键字extends实现继承,实现继承,由已有的超类派生子类,格式如下:由已有的超类派生子类,格式如下:修饰符修饰符classextends子类类体;子类类体;其中,其中,extends是关键字是关键字子类名是新定义的类,是合法的子类名是新定义的类
4、,是合法的Java标识符标识符超类名是已有的类。超类名是已有的类。第6页,本讲稿共59页例如例如classEagleextendsBird其中,其中,Eagle是新定义的子类是新定义的子类Bird是是Eagle的超类。的超类。4.1.1 4.1.1子子子子类的声明类的声明说明说明:在Java中每个类都有超类,如果一个类在定义时没有显式声明超类,系统默认其超类是java.lang包中的Object类,Object是系统预定义的一个类,是一切类的根类是一切类的根类。第7页,本讲稿共59页 4.1.2 Object类类如果一个类在定义时没有声明超类,它的超类默认如果一个类在定义时没有声明超类,它的超
5、类默认为为Object类;类;Object类是其他所有类的超类,是类层次的根;类是其他所有类的超类,是类层次的根;所有的类都拥有所有的类都拥有Object类预定义的一系列方法类预定义的一系列方法下面介绍下面介绍Object类中常用的方法。类中常用的方法。第8页,本讲稿共59页Object类中常用的方法1.publicfinalClassgetClass()2.publicbooleanequals(Objectobj)3.publicStringtoString()获得一个Class类的对象,该对象中含有当前对象的信息判断两个对象是否相等,有些教材认为该方法是用来判断两个对象是否含有相同的信息
6、,这种说法不够确切以字符串对象的形式返回对当前对象的描述:类名称对象所在内存地址。在实际编程时常常在自定义类中覆盖该方法,以返回更适合需求的信息4.publicinthashCode()获得当前对象的哈希码,系统运行时每个对象都将拥有一个唯一的哈希码标识该对象第9页,本讲稿共59页关于继承的说明关于继承的说明:子类继承超类成员的同时,子类还可以增加新的成员变量和成员函数,扩充或改造超类的成员,这是子类不同于超类的关键所在继承体现了子类对超类的扩展,子类是更加具体更加细化的类第10页,本讲稿共59页子类派生过程主要体现在三个方面子类派生过程主要体现在三个方面:1.继承超类的成员变量和成员方法;2
7、.增加新的成员变量和成员方法;3.覆盖(修改)超类的成员方法,或隐藏(重载)超类的成员变量第11页,本讲稿共59页类的继承规则类的继承规则1.子类继承的成员变量子类继承的成员变量子类可继承超类的所有public、protected 成员变量;子类可继承同一个包中超类的默认成员变量;如果子类成员变量名与超类相同,则称子类覆盖覆盖超类成员,隐藏了超类的成员;子类不能继承超类的private成员变量,如果希望超类的成员变量不被子类访问,那么就声明为私有的,充分体现了面向对象编程的封装原则。第12页,本讲稿共59页【例4.1】子类继承超类的成员变量源程序Person1.java中定义类Person与S
8、tudent,程序如下publicclassPersonStringname;/姓名姓名intage;/年龄年龄classStudentStringname;/姓名姓名intage;/年龄年龄Stringdept;/系别系别这样的定义有大量的重复,利这样的定义有大量的重复,利用继承原则,从新定义这两个类用继承原则,从新定义这两个类publicclassPersonStringname;/姓名姓名intage;/年龄年龄classStudentextendsPersonStringdept;/系别系别利用继承原则:子类从超类继承了利用继承原则:子类从超类继承了非私有成员变量非私有成员变量name
9、、age,同时,同时增加了新的成员变量增加了新的成员变量dept第13页,本讲稿共59页【例4.2】子类继承超类的成员方法源程序Person.java中定义类Person与Student,子类Student除了继承超类Person的成员,还增加了自己的成员dept:publicclassPersonprotectedStringname;protectedintage;voidsetdata(Stringn1,inta1)name=n1;age=a1;publicvoidprint()System.out.println(name+,+age);/数据成员数据成员/成员方法成员方法/成员方法成
10、员方法第14页,本讲稿共59页类的继承规则类的继承规则2.子类继承超类的成员方法子类继承超类的成员方法子类可继承超类的所有public、protected成员方法;子类可继承同一个包中超类的默认成员方法;如果子类成员方法与超类相同,称子类覆盖覆盖超类成员方法,即子类重新定义超类的同名方法;子类不能继承超类的private成员方法,不能继承超类的构造方法,但可以调用超类的构造方法。第15页,本讲稿共59页例5.5子类继承超类的成员方法Studen继承超类Person的成员,并增加了自己的成员dept:classStudentextendsPersonprotectedStringdept;pub
11、licstaticvoidmain(Stringargs)Personp1=newPerson();p1.setdata(李大广李大广,21);p1.print();Students1=newStudent();s1.setdata(陈小瑞陈小瑞,19);s1.dept=计算机系计算机系;s1.print();继承超类数据成员age、name成员方法:setdata()、print()/调用超类的成员方法调用超类的成员方法/访问本类的成员变量访问本类的成员变量存在两个问题存在两个问题:1.s1.setdata()无法为子类的无法为子类的dept赋值赋值改进方法是使用构造方法改进方法是使用构造方
12、法2.s1.print()无法输出的无法输出的dept的值的值改进方法是从新定义改进方法是从新定义print方法,方法,称之为称之为覆盖覆盖第16页,本讲稿共59页 4.2 4.2类的多态类的多态Java语言的多态指的是程序中同名的不同方法共存现象,多态是面向对象程序设计的核心特性;在面向对象程序设计中,利用多态可提高程序的抽象性,突出Java语言的继承性;Java语言通过两种方式实现多态:利用重载在同一个类中定义多个同名的不同方法;通过子类对超类方法的覆盖实现多态。第17页,本讲稿共59页 4.2.1 this 4.2.1 this引用引用Java有一个特殊的引用值this用来在非静态的成员
13、方法内部指向当前对象非静态的成员方法内部指向当前对象在程序执行时,通过对象调用实例方法时,系统会在程序执行时,通过对象调用实例方法时,系统会自动赋一个自动赋一个this引用指向该实例方法所属的当前对象;在类的定义中,如果类的实例方法需要引用本类的实例成员,系统也会默认地在实例成员前加上this,指向实例成员所属的当前对象第18页,本讲稿共59页 4.2.1 this 4.2.1 this引用引用1.this引用引用用来在一个成员函数内部指向当前的对象用来在一个成员函数内部指向当前的对象;作用作用:a.访问访问本类本类的成员变量与成员方法,格式:的成员变量与成员方法,格式:this.变量名;变量
14、名;this.方法名;方法名;b.调用本类的构造方法:调用本类的构造方法:this(参数表参数表)第19页,本讲稿共59页classUniversityStringname,city;voidinit(Stringname,Stringcity)this.name=name;this.city=city;publicclassTwoUniversityInitpublicstaticvoidmain(Stringargs)Universityu1=newUniversity();Universityu2=newUniversity();u1.init(北京大学,北京);u2.init(清华大学
15、,北京);System.out.println(大学:+u1.name+城市:+u1.city);System.out.println(大学:+u2.name+城市:+u2.city);例5.6this用法举例方法的入口参数与成员变量同名,必须使用this把它们区别开来调用方法init,实际参数把值最终传递给对象的实例成员变量第20页,本讲稿共59页 4.24.24.24.2.2.2 方法的重载方法的重载方法的重载方法的重载Java把多样性的概念引入面向对象的编程思想中,为Java设计了多态(多态(PolymorphismPolymorphism)机制)机制Java语言的多态多态是指程序中同名
16、的不同方法共存同名的不同方法共存的情况。多态多态是面向对象程序设计的又一个特性;我们知道,面向过程的程序设计中,过程或函数各具有一定的功能它们之间是不允许重名的;而面向对象程序设计中,则要利用这种多态多态来提高程序的抽象性,突出Java语言的继承性;实现多态途径:方法重载方法重载方法覆盖方法覆盖第21页,本讲稿共59页 4.2.3 方法重载方法重载1.成员方法的重载成员方法的重载在一个类的内部利用重载定义多个同名方法,可以向外提供统一的接口,使用者只需掌握方法调用时的参数,不需要了解其内部细节。如,定义求和方法add()intadd(intx,inty););/求两个整数的和intadd(in
17、tx,inty,inty););/求三个整数的和floatadd(floatx,floaty);/求两个实数的和方法重载必须满足方法重载必须满足:方法名字相同,参数必须不同方法名字相同,参数必须不同:参数型不同,或参数个数不同;返回类型返回类型可以不同,也可以相同;在调用同名方法时,系统在程序执行中会根据实际参数的个数与类型去匹配相应的方法第22页,本讲稿共59页【例4.3】成员方法的重载publicclassex_addpublicstaticintadd(intx,inty)/同名函数intsum=x+y;returnsum;publicstaticintadd(intx,inty,int
18、z)/同名函数intsum=x+y+z;returnsum;publicstaticvoidmain(Stringargs)int i=10,j=20,k=30;System.out.println(i=+i+tj=+j+ti+j=+add(i,j);System.out.println(i=+i+tj=+j+tk=+k+ti+j+k=+add(i,j,k);说明说明:由于在静态的main()方法中调用add()方法,所以add()必须声明为静态的。第23页,本讲稿共59页构造方法的重载构造方法的重载构造方法的重载构造方法的重载构造方法的重载在同一个类中定义多个参数列表不同的构造方法。创建对象
19、实例时,根据实际参数的个数和类型,使得对象自动匹配相应的构造方法来完成初始化在一个类中实现构造方法重载时,它们之间可以相互调用。当一个构造方法调用本类的另一个构造方法时需要使用this引用。第24页,本讲稿共59页publicclassPersonstaticintcount=0;protectedStringname;protectedintage;publicPerson(Stringn1,inta1)name=n1;age=a1;count+;publicPerson(Stringn1)this(n1,0);publicPerson(inta1)this(未知名,a1);publicPe
20、rson()this(未知名);publicvoidprint()System.out.print(this.getClass().getName()+);System.out.print(count=+this.count+);System.out.println(+name+,+age);【例4.4】构造方法的重载类Person,定义三个成员变量:计数count,姓名name,年龄age构造方法,实例化对象时,初始化对象:姓名,年龄构造方法重载,不知年龄,并调用本类的构造方法构造方法重载,不知姓名,并调用本类的构造方法构造方法重载,不知姓名也不知年龄,并调用本类的构造方法该类定义了四个构造
21、方法,同名而参数不同:即方法重载print方法,输出对象的信息:所属类、编号、姓名、年龄第25页,本讲稿共59页publicclassPersonstaticintcount=0;protectedStringname;protectedintage;publicPerson(Stringn1,inta1)publicPerson(Stringn1)publicPerson(inta1)publicPerson()publicvoidprint()publicstaticvoidmain(Stringargs)Person5p1=newPerson5(王小明王小明,21);p1.print()
22、;Person5p2=newPerson5(朱小安朱小安);p2.print();Person5p3=newPerson5(19);p3.print();Person5p4=newPerson5();p4.print();【例4.4】构造方法的重载利用构造方法的重载,初始化对象时更加灵活第26页,本讲稿共59页 4.2.3 super 4.2.3 super引用引用supersuper是一个特殊的引用,在子类中通过super实现对超类成员的调用;超类派生子类时,子类的成员变量与超类的成员变量可能相同,子类的成员方法也可能与超类的成员方法同名,这样子类的成员就隐藏了超类的成员,无法直接在子类中调
23、用超类的同名成员如果希望在子类中调用超类中同名的成员变量与成员方法,必须使用super引用指明对超类成员的调用注意:注意:子类不能继承超类的构造方法,很多情况下,子类需要调用超类的构造方法来完成对继承的超类成员变量的初始化,这时必须使用super引用。第27页,本讲稿共59页 4.2.3 super 4.2.3 super引用引用2.super引用引用用来引用被子类隐藏的用来引用被子类隐藏的超类超类成员变量与成员方法成员变量与成员方法;作用作用:a.引用被子类隐藏的超类成员变量与成员方法,格式:引用被子类隐藏的超类成员变量与成员方法,格式:super.变量名;变量名;super.方法名;方法名
24、;b.调用超类的构造方法调用超类的构造方法:super(参数表参数表)第28页,本讲稿共59页publicclassPerson4staticintcount=0;protectedStringname;protectedintage;publicPerson4(Stringn1,inta1)this.name=n1;this.age=a1;this.count+;publicintolderthen(Person4b)Person4a=this;returna.age-b.age;publicvoidprint()System.out.print(this.getClass().getNam
25、e()+);System.out.print(count=+this.count+);System.out.println(+this.name+,+this.age);【例4.5】super用法举例所有类对象共享的静态变量count,用来记录创建对象的个数Person4定义了三个成员变量,并且定义构造函数为对象初始化方法的入口参数与成员变量同名,必须使用this把它们区别开来olderthen方法,用来比较两个人的年龄,this用来引用方法所属的对象本身this.getClass().getName()方法返回当前对象所属类的名称print方法用来输出当前对象信息,以及对象属于第几个第29页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 继承 优秀 课件
限制150内