《第4讲面向对象继承精选PPT.ppt》由会员分享,可在线阅读,更多相关《第4讲面向对象继承精选PPT.ppt(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4讲面向对象继承第1页,本讲稿共59页主讲:chen第第4 4章章章章 面向对象编程面向对象编程面向对象编程面向对象编程继承与多态继承与多态894/17/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 4.1.1子子子子类的声明类的声明在在Java类的声明中,使用关键字类的声明中,使用关键字extends实现继承,实现继承,由已有的超类派生子类,格式如下:由已有的超类派生子类,格式如下:修饰符修饰符classextends子类类体;子类类体;其中,其中,extends是关键字是关键字子类名是新定义的
4、类,是合法的子类名是新定义的类,是合法的Java标识符标识符超类名是已有的类。超类名是已有的类。第6页,本讲稿共59页例如例如classEagleextendsBird其中,其中,Eagle是新定义的子类是新定义的子类Bird是是Eagle的超类。的超类。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.继承超类的成员变量
7、和成员方法;2.增加新的成员变量和成员方法;3.覆盖(修改)超类的成员方法,或隐藏(重载)超类的成员变量第11页,本讲稿共59页类的继承规则类的继承规则1.子类继承的成员变量子类继承的成员变量子类可继承超类的所有public、protected 成员变量;子类可继承同一个包中超类的默认成员变量;如果子类成员变量名与超类相同,则称子类覆盖覆盖超类成员,隐藏了超类的成员;子类不能继承超类的private成员变量,如果希望超类的成员变量不被子类访问,那么就声明为私有的,充分体现了面向对象编程的封装原则。第12页,本讲稿共59页【例4.1】子类继承超类的成员变量源程序Person1.java中定义类P
8、erson与Student,程序如下publicclassPersonStringname;/姓名姓名intage;/年龄年龄classStudentStringname;/姓名姓名intage;/年龄年龄Stringdept;/系别系别这样的定义有大量的重复,利这样的定义有大量的重复,利用继承原则,从新定义这两个类用继承原则,从新定义这两个类publicclassPersonStringname;/姓名姓名intage;/年龄年龄classStudentextendsPersonStringdept;/系别系别利用继承原则:子类从超类继承了利用继承原则:子类从超类继承了非私有成员变量非私有成
9、员变量name、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:classStudentextendsPersonprotectedStringd
11、ept;publicstaticvoidmain(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 4.2 4.2类的多态类的多态类的多态类的多态Java语言的多态指的是程序中同名的不同方法共存现象,多态是面向对象程序设计的核心特性;在面向对象程序设计中,利用多态可提高程序的抽象性,突出Java语言的继承性;Java语言通过两种方式实现多态:利用重载在同一个类中定义多个同名的不同方法;通过子类对超类方法的覆盖实现多态。第17页,本讲稿共59页 4.2.1 this 4.2.1 this引用引用Jav
13、a有一个特殊的引用值this用来在非静态的成员方法内部指向当前对象非静态的成员方法内部指向当前对象在程序执行时,通过对象调用实例方法时,系统会在程序执行时,通过对象调用实例方法时,系统会自动赋一个自动赋一个this引用指向该实例方法所属的当前对象;在类的定义中,如果类的实例方法需要引用本类的实例成员,系统也会默认地在实例成员前加上this,指向实例成员所属的当前对象第18页,本讲稿共59页 4.2.1 this 4.2.1 this引用引用1.this引用引用用来在一个成员函数内部指向当前的对象用来在一个成员函数内部指向当前的对象;作用作用:a.访问访问本类本类的成员变量与成员方法,格式:的成
14、员变量与成员方法,格式:this.变量名;变量名;this.方法名;方法名;b.调用本类的构造方法:调用本类的构造方法:this(参数表参数表)第19页,本讲稿共59页classUniversityStringname,city;voidinit(Stringname,Stringcity)this.name=name;this.city=city;publicclassTwoUniversityInitpublicstaticvoidmain(Stringargs)Universityu1=newUniversity();Universityu2=newUniversity();u1.ini
15、t(北京大学,北京);u2.init(清华大学,北京);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)
16、机制)机制Java语言的多态多态是指程序中同名的不同方法共存同名的不同方法共存的情况。多态多态是面向对象程序设计的又一个特性;我们知道,面向过程的程序设计中,过程或函数各具有一定的功能它们之间是不允许重名的;而面向对象程序设计中,则要利用这种多态多态来提高程序的抽象性,突出Java语言的继承性;实现多态途径:方法重载方法重载方法覆盖方法覆盖第21页,本讲稿共59页 4.2.3 4.2.3 方法重载方法重载1.成员方法的重载成员方法的重载在一个类的内部利用重载定义多个同名方法,可以向外提供统一的接口,使用者只需掌握方法调用时的参数,不需要了解其内部细节。如,定义求和方法add()intadd(i
17、ntx,inty););/求两个整数的和intadd(intx,inty,inty););/求三个整数的和floatadd(floatx,floaty);/求两个实数的和方法重载必须满足方法重载必须满足:方法名字相同,参数必须不同方法名字相同,参数必须不同:参数型不同,或参数个数不同;返回类型返回类型可以不同,也可以相同;在调用同名方法时,系统在程序执行中会根据实际参数的个数与类型去匹配相应的方法第22页,本讲稿共59页【例4.3】成员方法的重载publicclassex_addpublicstaticintadd(intx,inty)/同名函数intsum=x+y;returnsum;pub
18、licstaticintadd(intx,inty,intz)/同名函数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(未
20、知名,a1);publicPerson()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(王小明王小明
22、,21);p1.print();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.变量名;变量
24、名;super.方法名;方法名;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.ge
25、tClass().getName()+);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方法用来输出当前对象信
26、息,以及对象属于第几个第29页,本讲稿共59页classStudent4extendsPerson4protectedStringdept;Student4(Stringn1,inta1,Stringd1)super(n1,a1);dept=d1;publicstaticvoidmain(Stringargs)Person4p1=newPerson4(李大广,21);p1.print();Student4s1=newStudent4(陈小瑞,19,计算机系);s1.print();System.out.println(年龄差=+p1.olderthen(s1);定义子类Student4,并增加
27、新的成员变量dept子类不能继承超类的构造方法在子类构造方法中使用super调用超类的构造方法调用print方法输出当前对象信息,以及对象属于第几个调用olderthen得两个人的年龄差不足之处不足之处:调用超类的print()方法,仍然无法输出子类的dept的值第30页,本讲稿共59页 4.2.4 4.2.4 4.2.4 4.2.4 方法覆盖方法覆盖方法覆盖方法覆盖如果子类与超类的方法同名,则不能继承超类的方法,而是子类覆覆盖盖了超类的方法覆盖要注意如下几点覆盖要注意如下几点:子类不能覆盖超类中的子类不能覆盖超类中的final或或static方法;方法;如果超类的如果超类的abstract在
28、子类中必须覆盖,要声明为在子类中必须覆盖,要声明为abstract;子类覆盖超类方法时,必须满足子类覆盖超类方法时,必须满足:同名、返回值相同、参数个数相同同名、返回值相同、参数个数相同方法覆盖与继承有密切关系,体现了子类补充或改变补充或改变超类方法的能力;通过覆盖使一个方法在不同子类中表现为不同行为一个方法在不同子类中表现为不同行为第31页,本讲稿共59页 4.2.4 4.2.4 4.2.4 4.2.4 方法覆盖方法覆盖方法覆盖方法覆盖1.成员变量的覆盖(隐藏)成员变量的覆盖(隐藏)Java的子类可以继承超类中的非私有成员变量,同时子类还可以添加新的成员变量,新添加的成员变量是对超类的扩展,
29、也是对子类更具体的描述如果新添加的成员变量与超类成员变量同名,将会隐藏超类的同名成员变量。如果希望在子类中引用超类中被隐藏的成员变量,要使用super引用:super.variablesuper.variable;/variable是超类的同名成员变量在实际的程序设计中,子类隐藏超类的成员变量的情况很少。如果不是很必要,建议不要在子类隐藏超类的成员变量,因为这样会增加系统开销,降低程序的可读性 第32页,本讲稿共59页2.成员变量的覆盖(隐藏)成员变量的覆盖(隐藏)在继承机制中,子类可以继承超类中能被子类访问的超类成员方法,同时,子类也可以添加新的成员方法:添加超类中没有的,新的成员方法,通过
30、扩展超类增加子类的行为;增加与超类同名的成员方法,即成员方法的覆盖。这源于继承的超类成员方法无法完整描述子类,要扩充修改这样的成员方法以适合对子类的描述。既可以在超类定义的基础上增加新的功能,也可以完全重新定义从超类继承的同名成员方法;子类覆盖超类的成员方法,必须满足同名、返回值相同、同名、返回值相同、参数相同参数相同。如果子类的一个成员方法只是与超类的成员方法同名,而不是完全相同的首部,则称为重载(子类有两个同名方法)。第33页,本讲稿共59页classApublicintx,y;A(inta,intb)x=a;y=b;publicvoiddisplay()intz;z=x+y;System
31、.out.println(add=+z);classBextendsAB(inta,intb)super(a,b);publicvoiddisplay()intz;z=x*y;System.out.println(product=+z);/定义类A/构造方法/定义成员变量/定义子类B/构造方法/调用超类的构造方法/重新定义方法,子类方法覆盖覆盖了超类方法【例4.6】覆盖举例第34页,本讲稿共59页publicclassCextendsBC(intx,inty)super(x,y);publicstaticvoidmain(Stringargs)An1=newA(7,14);Bn2=newB(7
32、,14);Cn3=newC(7,14);n1.display();n2.display();n3.display();/构造方法,并调用超类构造方法/定义子类B/分别创建三个类的对象/三个对象都调用display方法第35页,本讲稿共59页classPersonstaticintcount=0;protectedStringname;protectedintage;publicPerson(Stringn1,inta1)name=n1;age=a1;this.count+;publicStringtoString()returnthis.name+,+this.age;publicvoidpr
33、int()System.out.println(本类名=+this.getClass().getName()+超类名=+this.getClass().getSuperclass().getName()+);System.out.print(Person.count=+this.count+);System.out.print(Student.count=+Student.count+);Objects1=this;if(s1instanceofPerson)System.out.println(s1.toString()+是Person类对象。);if(s1instanceofStudent
34、)System.out.println(s1.toString()+是Student类对象。);/静态变量,统计对象个数/构造方法/统计Person对象个数/输出Person以及其子类对象新型/判断对象属于哪个类【例4.7】覆盖举例第36页,本讲稿共59页publicclassStudentextendsPersonstaticintcount=0;protectedStringdept;protectedStudent(Stringn1,inta1,Stringd1)super(n1,a1);dept=d1;this.count+;publicStringtoString()returnsu
35、per.toString()+,+dept;publicvoidprint()super.print();System.out.println(super.count=+super.count);System.out.println(this.count=+this.count);publicstaticvoidmain(Stringargs)Personp1=newPerson(王小明,21);p1.print();Students1=newStudent(陈小瑞,19,计算机系);s1.print();/隐藏了超类的count/调用超类的构造方法/子类对象计数/覆盖覆盖超类的同名方法/调用
36、超类的同名方法/调用超类的方法/引用超类变量第37页,本讲稿共59页publicclassStudentextendsPersonpublicstaticvoidmain(Stringargs)Personp1=newPerson(王小明,21);p1.print();Students1=newStudent(陈小瑞,19,计算机系);s1.print();第38页,本讲稿共59页使用覆盖需要注意的问题使用覆盖需要注意的问题子类不能覆盖超类中的final或static方法;超类abstract方法在子类中必须覆盖,除非也声明为abstract(后面章节介绍);子类覆盖超类方法时,必须满足:同名
37、、返回值相同、参数相同第39页,本讲稿共59页需要注意以下问题 类变量不但可以通过对象名引用,还可以通过类名引用,这是因为类变量在创建类的对象之前,已经分配了存储空间;第40页,本讲稿共59页 4.2.5 4.2.5 4.2.5 4.2.5 子类对象也是超类对象子类对象也是超类对象子类对象也是超类对象子类对象也是超类对象子类的对象也是超类的对象,反之不成立。子类的对象也是超类的对象,反之不成立。如在如在【例【例4.7】中中Person是是Student的超类,可以说的超类,可以说“学生(学生(Student)也)也是人(是人(Person)”。这显然是正确的,如果这样说,人将失去其独特的属。这
38、显然是正确的,如果这样说,人将失去其独特的属性与行为。性与行为。但,不能说但,不能说“人(人(Person)也是学生()也是学生(Student)”,这显然是不正确的。,这显然是不正确的。表现在程序设计中:在子类创建一个对象,该对象也是超类的对表现在程序设计中:在子类创建一个对象,该对象也是超类的对象,可把这个对象的引用赋值给超类对象象,可把这个对象的引用赋值给超类对象参考P71例4-6第41页,本讲稿共59页 4.2.6 4.2.6 子类构造方法的定义子类构造方法的定义使用使用new运算符调用构造方法,才能创建类的对象;运算符调用构造方法,才能创建类的对象;如果定义类的时候不显式声明一个构造
39、方法,如果定义类的时候不显式声明一个构造方法,Java会自会自动创建一个不带参数的默认构造方法;动创建一个不带参数的默认构造方法;只要在类中定义了构造方法,无论带参数与否,只要在类中定义了构造方法,无论带参数与否,Java运运行时系统不会再自动生成默认构造方法。行时系统不会再自动生成默认构造方法。第42页,本讲稿共59页子类构造方法子类构造方法在Java继承机制中,子类对象的初始化过程一般开始于一系列的构造方法调用子类不能继承超类的构造方法,而子类的构造方法要对从超类继承的成员变量初始化,而对子类继承的超类成员的初始化可由超类的构造方法完成,子类虽然不能继承超类的构造方法,但可以调用;子类构造
40、方法在对新添加的成员变量执行初始化之前,都将显示地(通过super)或隐式地(调用超类的默认构造方法或无参构造方法)调用其直接超类的构造方法同样,如果其直接超类也派生于另一个类,则要求直接超类调用类层次结构中的上一层的构造方法,以此类推在调用请求中,最后调用的构造方法总是根类Object类的构造方法。子类的构造方法最后才会执行对新添加成员变量的初始化。第43页,本讲稿共59页classAnimalprotectedStringname;publicAnimal(Stringn)name=n;publicvoidShowInfo()System.out.print(theanimalt);Sys
41、tem.out.print(name+t);publicclassFishextendsAnimalintSwimSpeed;Fish(Stringn,ints)name=n;SwimSpeed=s;publicvoidShowInfo()System.out.print(theFisht+name+t);System.out.print(Swimmingspeed:t+SwimSpeed);publicstaticvoidmain(Stringargs)Fisha=newFish(Nemo,60);a.ShowInfo();/超类定义带参构造方法/隐式地调用超类的无参构造方法/方法覆盖【例4
42、.8】子类构造方法的定义说明:由于超类Animal已显式定义了带参构造方法,Java运行时系统不会再自动生成默认构造方法;子类构造方法又隐式调用超类的无参构造方法,编译时会出错;问题在于超类没有可供子类构造方法调用的无参构造方法第44页,本讲稿共59页classAnimalprotectedStringname;publicAnimal(Stringn)name=n;publicvoidShowInfo()System.out.print(theanimalt);System.out.print(name+t);publicclassFishextendsAnimalintSwimSpeed;
43、Fish(Stringn,ints)super(name);SwimSpeed=s;publicvoidShowInfo()System.out.print(theFisht+name+t);System.out.print(Swimmingspeed:t+SwimSpeed);publicstaticvoidmain(Stringargs)Fisha=newFish(Nemo,60);a.ShowInfo();/超类定义带参构造方法/显式地调用超类的构造方法/方法覆盖【例4.8】子类构造方法的定义1、修改说明:在子类构造方法第一条语句显式加上对超类构造方法的调用第45页,本讲稿共59页cla
44、ssAnimalprotectedStringname;/*publicAnimal(Stringn)name=n;*/publicvoidShowInfo()System.out.print(theanimalt);System.out.print(name+t);publicclassFishextendsAnimalintSwimSpeed;Fish(Stringn,ints)name=n;SwimSpeed=s;publicvoidShowInfo()System.out.print(theFisht+name+t);System.out.print(Swimmingspeed:t+S
45、wimSpeed);publicstaticvoidmain(Stringargs)Fisha=newFish(Nemo,60);a.ShowInfo();/超类定义带参构造方法/隐式地调用超类的无参构造方法/方法覆盖【例4.8】子类构造方法的定义2、修改说明:在超类Animal中去掉带参构造方法的定义,这时超类的无参构造方法系统会自动生成;第46页,本讲稿共59页classAnimalprotectedStringname;publicAnimal(Stringn)name=n;publicAnimal()name=null;publicvoidShowInfo()System.out.pr
46、int(theanimalt);System.out.print(name+t);publicclassFishextendsAnimalintSwimSpeed;Fish(Stringn,ints)name=n;SwimSpeed=s;publicvoidShowInfo()System.out.print(theFisht+name+t);System.out.print(Swimmingspeed:t+SwimSpeed);publicstaticvoidmain(Stringargs)Fisha=newFish(Nemo,60);a.ShowInfo();/超类定义带参构造方法/隐式地
47、调用超类的无参构造方法/方法覆盖【例4.8】子类构造方法的定义3、修改说明:在超类添加一个无参的构造方法,程序体为空(当然也可以不为空,添加语句name=null)第47页,本讲稿共59页 4.3 4.3 4.3 4.3 抽象类与最终类抽象类与最终类抽象类与最终类抽象类与最终类第48页,本讲稿共59页 4.3 4.3 抽象类与最终类抽象类与最终类1.最终类最终类如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承如果希望类不被继承就把他声明为final类,如finalclassmyClass.classyourClassextendsmyClass./错误a.最终方法
48、最终方法如果觉得定义最终类没必要,只是希望类中的方法不希望被子类修改(覆盖),可以在类中,把方法定义为最终方法,如:Finalvoidfun()./最终方法,不能被子类修改第49页,本讲稿共59页finalfinal的用法的用法final类不能被继承;类不能被继承;final方法不能被覆盖;方法不能被覆盖;final域不能被修改(常量)域不能被修改(常量)第50页,本讲稿共59页抽象类抽象类1.抽象方法抽象方法在一个类中声明为抽象方法时,意味着这个方法必须在子类中被重新定义(覆盖),格式如下:abstractvoidf();构造方法不能为抽象的,抽象与最终不能同时存在;抽象方法一般是仅有方法头
49、而没有方法体的方法;抽象方法为该类的子类定义一个方法的接口标准,子类必须根据需要从新定义它第51页,本讲稿共59页抽象类抽象类a.抽象类抽象类任何含有抽象方法的类必须声明为抽象类任何含有抽象方法的类必须声明为抽象类;抽象类是不能实例化的类,即不能直接用new操作符生成实例;抽象类只能被子类继承,格式:publicabstractclassmyclass第52页,本讲稿共59页例5.8本例程说明抽象类和抽象方法的声明abstractclassShapepublicfinaldoublePI=3.14;publicShape()System.out.println(Ashapewascreated
50、.);voiddraw()System.out.println(Drawashape);abstractdoublearea();抽象类Shape;常量成员PI抽象方法area:只定义了方法的头部,子类必须从新定义area第53页,本讲稿共59页abstractclassShape.PI=3.14;publicShape().voiddraw().abstractdoublearea();子类Circle,描述圆的类classCircleextendsShapeintcenterX;/圆心圆心X坐标坐标intcenterY;/圆心圆心Y坐标坐标intradius;/圆的半径圆的半径public