第4讲面向对象继承精选文档.ppt

上传人:石*** 文档编号:47748411 上传时间:2022-10-03 格式:PPT 页数:59 大小:3.18MB
返回 下载 相关 举报
第4讲面向对象继承精选文档.ppt_第1页
第1页 / 共59页
第4讲面向对象继承精选文档.ppt_第2页
第2页 / 共59页
点击查看更多>>
资源描述

《第4讲面向对象继承精选文档.ppt》由会员分享,可在线阅读,更多相关《第4讲面向对象继承精选文档.ppt(59页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第4讲面向对象继承本讲稿第一页,共五十九页主讲:主讲:chenchen第第4 4章章 面向对象编程面向对象编程继承与多态继承与多态8 89 92022/10/1本讲稿第二页,共五十九页继承继承是由已有类创建新类的机制,是面向对象程序设计基础,是面向对象程序设计方法的一个重要手段通过继承可以更有效地组织程序结构,利用已有的类来完成更复杂的新类的设计与开发,充分实现代码重用Java只支持单一继承,即一个类只能有一个超类。多态多态是指一个程序中,同名的不同方法共存的情况。多态提高了类的抽象性和封装性,多态有两种表现形式:同一个类内的方法的重载重载和不同类间的子类对超类方法的覆盖覆盖。继承和多态是面向

2、对象编程的两个核心特点本章介绍继承与多态的实现技术。本章学习说明本章学习说明本讲稿第三页,共五十九页本章目标本章目标1.理解掌握面向对象的两个核心特性继承与多态的概念与应用2.掌握子类的定义,理解掌握子类构造方法的定义与调用原则3.掌握重载与覆盖的概念与应用以及二者的区别4.理解掌握最终类与最终方法、抽象类与抽象方法的概念与应用本讲稿第四页,共五十九页 4.1 4.1 类的继承类的继承当一个类可以自动拥有另一个类的成员变量和成员方法时,称这两个类之间存在继承关系被继承的类称为超类超类或父类,继承了超类成员的类称为子类子类,子类是由超类派生的类子类通过派生可以继承已有超类的成员,是实现类代码重用

3、和数据共享的重要机制若一个类有一个以上的超类则称为多重继承多重继承。一个类只有一个超类为单重继承单重继承JavaJava只支持单重继承只支持单重继承,即每个类只能有一个超类。Java的单重继承既体现了面向对象编程的思想,又降低了面向对象编程的难度。使Java面向对象编程变得更加简洁 本讲稿第五页,共五十九页 4.1.1子子类的声明类的声明在在Java类的声明中,使用关键字类的声明中,使用关键字extends实现继承,由已有实现继承,由已有的超类派生子类,格式如下:的超类派生子类,格式如下:修饰符修饰符classextends子类类体;子类类体;其中,其中,extends是关键字是关键字子类名是

4、新定义的类,是合法的子类名是新定义的类,是合法的Java标识符标识符超类名是已有的类。超类名是已有的类。本讲稿第六页,共五十九页例如例如classEagleextendsBird其中,其中,Eagle是新定义的子类是新定义的子类Bird是是Eagle的超类。的超类。4.1.1子子类的声明类的声明说明说明:在Java中每个类都有超类,如果一个类在定义时没有显式声明超类,系统默认其超类是java.lang包中的Object类,Object是系统预定义的一个类,是一切类的根类是一切类的根类。本讲稿第七页,共五十九页 4.1.2 Object类类如果一个类在定义时没有声明超类,它的超类默认如果一个类在

5、定义时没有声明超类,它的超类默认为为Object类;类;Object类是其他所有类的超类,是类层次的根;类是其他所有类的超类,是类层次的根;所有的类都拥有所有的类都拥有Object类预定义的一系列方法类预定义的一系列方法下面介绍下面介绍Object类中常用的方法。类中常用的方法。本讲稿第八页,共五十九页Object类 中 常 用 的 方 法1.publicfinalClassgetClass()2.publicbooleanequals(Objectobj)3.publicStringtoString()获得一个Class类的对象,该对象中含有当前对象的信息判断两个对象是否相等,有些教材认为该

6、方法是用来判断两个对象是否含有相同的信息,这种说法不够确切以字符串对象的形式返回对当前对象的描述:类名称对象所在内存地址。在实际编程时常常在自定义类中覆盖该方法,以返回更适合需求的信息4.publicinthashCode()获得当前对象的哈希码,系统运行时每个对象都将拥有一个唯一的哈希码标识该对象本讲稿第九页,共五十九页关于继承的说明关于继承的说明:子类继承超类成员的同时,子类还可以增加新的成员变量和成员函数,扩充或改造超类的成员,这是子类不同于超类的关键所在继承体现了子类对超类的扩展,子类是更加具体更加细化的类本讲稿第十页,共五十九页子类派生过程主要体现在三个方面子类派生过程主要体现在三个

7、方面:1.继承超类的成员变量和成员方法;继承超类的成员变量和成员方法;2.增加新的成员变量和成员方法;增加新的成员变量和成员方法;3.覆盖(修改)超类的成员方法,覆盖(修改)超类的成员方法,或隐藏(重载)超类的成员变量或隐藏(重载)超类的成员变量本讲稿第十一页,共五十九页类的继承规则类的继承规则1.子类继承的成员变量子类继承的成员变量子类可继承超类的所有public、protected 成员变量;子类可继承同一个包中超类的默认成员变量;如果子类成员变量名与超类相同,则称子类覆盖覆盖超类成员,隐藏了超类的成员;子类不能继承超类的private成员变量,如果希望超类的成员变量不被子类访问,那么就声

8、明为私有的,充分体现了面向对象编程的封装原则。本讲稿第十二页,共五十九页【例【例4.1】子类继承超类的成员变量】子类继承超类的成员变量源程序Person1.java中定义类Person与Student,程序如下publicclassPersonStringname;/姓名姓名intage;/年龄年龄classStudentStringname;/姓名姓名intage;/年龄年龄Stringdept;/系别系别这样的定义有大量的重复,利这样的定义有大量的重复,利用继承原则,从新定义这两个类用继承原则,从新定义这两个类publicclassPersonStringname;/姓名姓名intage;

9、/年龄年龄classStudentextendsPersonStringdept;/系别系别利用继承原则:子类从超类继承了利用继承原则:子类从超类继承了非私有成员变量非私有成员变量name、age,同时,同时增加了新的成员变量增加了新的成员变量dept本讲稿第十三页,共五十九页【例【例4.2】子类继承超类的成员方法子类继承超类的成员方法源程序Person.java中定义类Person与Student,子类Student除了继承超类Person的成员,还增加了自己的成员dept:publicclassPersonprotectedStringname;protectedintage;voidse

10、tdata(Stringn1,inta1)name=n1;age=a1;publicvoidprint()System.out.println(name+,+age);/数据成员数据成员/成员方法成员方法/成员方法成员方法本讲稿第十四页,共五十九页类的继承规则类的继承规则2.子类继承超类的成员方法子类继承超类的成员方法子类可继承超类的所有public、protected成员方法;子类可继承同一个包中超类的默认成员方法;如果子类成员方法与超类相同,称子类覆盖覆盖超类成员方法,即子类重新定义超类的同名方法;子类不能继承超类的private成员方法,不能继承超类的构造方法,但可以调用超类的构造方法。

11、本讲稿第十五页,共五十九页例例5.5子类继承超类的成员方法子类继承超类的成员方法Studen继承超类Person的成员,并增加了自己的成员dept:classStudentextendsPersonprotectedStringdept;publicstaticvoidmain(Stringargs)Personp1=newPerson();p1.setdata(李大广李大广,21);p1.print();Students1=newStudent();s1.setdata(陈小瑞陈小瑞,19);s1.dept=计算机系计算机系;s1.print();继承超类数据成员age、name成员方法:s

12、etdata()、print()/调用超类的成员方法调用超类的成员方法/访问本类的成员变量访问本类的成员变量存在两个问题存在两个问题:1.s1.setdata()无法为子类的无法为子类的dept赋值赋值改进方法是使用构造方法改进方法是使用构造方法2.s1.print()无法输出的无法输出的dept的值的值改进方法是从新定义改进方法是从新定义print方法,称方法,称之为之为覆盖覆盖本讲稿第十六页,共五十九页 4.2 4.2类的多态类的多态Java语言的多态语言的多态指的是程序中同名的不同方法共存现象,多态是面指的是程序中同名的不同方法共存现象,多态是面向对象程序设计的核心特性;向对象程序设计的

13、核心特性;在面向对象程序设计中,利用多态可提高程序的抽象性,在面向对象程序设计中,利用多态可提高程序的抽象性,突出突出Java语言的继承性;语言的继承性;Java语言通过两种方式实现多态:语言通过两种方式实现多态:利用利用重载重载在同一个类中定义多个同名的不同方法;在同一个类中定义多个同名的不同方法;通过子类对超类方法的通过子类对超类方法的覆盖覆盖实现多态。实现多态。本讲稿第十七页,共五十九页 4.2.1 this 4.2.1 this引用引用Java有一个特殊的引用值this用来在非静态的成员方法内部指向当前对象非静态的成员方法内部指向当前对象在程序执行时,通过对象调用实例方法时,系统会在程

14、序执行时,通过对象调用实例方法时,系统会自动赋一个自动赋一个this引用指向该实例方法所属的当前对象;在类的定义中,如果类的实例方法需要引用本类的实例成员,系统也会默认地在实例成员前加上this,指向实例成员所属的当前对象本讲稿第十八页,共五十九页 4.2.1 this 4.2.1 this引用引用1.this引用引用用来在一个成员函数内部指向当前的对象用来在一个成员函数内部指向当前的对象;作用作用:a.访问访问本类本类的成员变量与成员方法,格式:的成员变量与成员方法,格式:this.变量名;变量名;this.方法名;方法名;b.调用本类的构造方法:调用本类的构造方法:this(参数表参数表)

15、本讲稿第十九页,共五十九页classUniversityStringname,city;voidinit(Stringname,Stringcity)this.name=name;this.city=city;publicclassTwoUniversityInitpublicstaticvoidmain(Stringargs)Universityu1=newUniversity();Universityu2=newUniversity();u1.init(北京大学北京大学,北京北京);u2.init(清华大学清华大学,北京北京);System.out.println(大学大学:+u1.nam

16、e+城市城市:+u1.city);System.out.println(大学大学:+u2.name+城市城市:+u2.city);例例5.6this用法举例用法举例方法的入口参数与成员变量同名,必须使用this把它们区别开来调用方法init,实际参数把值最终传递给对象的实例成员变量本讲稿第二十页,共五十九页 4.24.2.2 方法的重载方法的重载Java把多样性的概念引入面向对象的编程思想中,为Java设计了多态(多态(PolymorphismPolymorphism)机制)机制Java语言的多态多态是指程序中同名的不同方法共存同名的不同方法共存的情况。多态多态是面向对象程序设计的又一个特性;

17、我们知道,面向过程的程序设计中,过程或函数各具有一定的功能它们之间是不允许重名的;而面向对象程序设计中,则要利用这种多态多态来提高程序的抽象性,突出Java语言的继承性;实现多态途径:方法重载方法重载方法覆盖方法覆盖本讲稿第二十一页,共五十九页 4.2.3 方法重载方法重载1.成员方法的重载成员方法的重载在一个类的内部利用重载定义多个同名方法,可以向外提供统一的接口,使用者只需掌握方法调用时的参数,不需要了解其内部细节。如,定义求和方法add()intadd(intx,inty););/求两个整数的和intadd(intx,inty,inty););/求三个整数的和floatadd(float

18、x,floaty);/求两个实数的和方法重载必须满足方法重载必须满足:方法名字相同,参数必须不同方法名字相同,参数必须不同:参数型不同,或参数个数不同;返回类型返回类型可以不同,也可以相同;在调用同名方法时,系统在程序执行中会根据实际参数的个数与类型去匹配相应的方法本讲稿第二十二页,共五十九页【例【例4.3】成员方法的重载成员方法的重载publicclassex_addpublicstaticintadd(intx,inty)/同名函数同名函数intsum=x+y;returnsum;publicstaticintadd(intx,inty,intz)/同名函数同名函数intsum=x+y+z

19、;returnsum;publicstaticvoidmain(Stringargs)inti=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()必须声明为静态的。本讲稿第二十三页,共五十九页构造方法的重载构造方法的重载构造方法的重载构造方法的重载在同一个类中定义多个参数列表不同的构造方法。创在同一个类中定义多个参数列表不同的构造方法。创建对象实例

20、时,根据实际参数的个数和类型,使得对建对象实例时,根据实际参数的个数和类型,使得对象自动匹配相应的构造方法来完成初始化象自动匹配相应的构造方法来完成初始化在一个类中实现构造方法重载时,它们之间可以相互在一个类中实现构造方法重载时,它们之间可以相互调用。当一个构造方法调用本类的另一个构造方法时调用。当一个构造方法调用本类的另一个构造方法时需要使用需要使用this引用。引用。本讲稿第二十四页,共五十九页publicclassPersonstaticintcount=0;protectedStringname;protectedintage;publicPerson(Stringn1,inta1)n

21、ame=n1;age=a1;count+;publicPerson(Stringn1)this(n1,0);publicPerson(inta1)this(未知名未知名,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

22、,年龄age构造方法,实例化对象时,初始化对象:姓名,年龄构造方法重载,不知年龄,并调用本类的构造方法构造方法重载,不知姓名,并调用本类的构造方法构造方法重载,不知姓名也不知年龄,并调用本类的构造方法该类定义了四个构造方法,同名而参数不同:即方法重载print方法,输出对象的信息:所属类、编号、姓名、年龄本讲稿第二十五页,共五十九页publicclassPersonstaticintcount=0;protectedStringname;protectedintage;publicPerson(Stringn1,inta1)publicPerson(Stringn1)publicPerson(

23、inta1)publicPerson()publicvoidprint()publicstaticvoidmain(Stringargs)Person5p1=newPerson5(王小明王小明,21);p1.print();Person5p2=newPerson5(朱小安朱小安);p2.print();Person5p3=newPerson5(19);p3.print();Person5p4=newPerson5();p4.print();【例【例4.4】构造方法的重载构造方法的重载利用构造方法的重载,初始化对象时更加灵活本讲稿第二十六页,共五十九页 4.2.3 super 4.2.3 sup

24、er引用引用supersuper是一个特殊的引用,在子类中通过super实现对超类成员的调用;超类派生子类时,子类的成员变量与超类的成员变量可能相同,子类的成员方法也可能与超类的成员方法同名,这样子类的成员就隐藏了超类的成员,无法直接在子类中调用超类的同名成员如果希望在子类中调用超类中同名的成员变量与成员方法,必须使用super引用指明对超类成员的调用注意:注意:子类不能继承超类的构造方法,很多情况下,子类需要调用超类的构造方法来完成对继承的超类成员变量的初始化,这时必须使用super引用。本讲稿第二十七页,共五十九页 4.2.3 super 4.2.3 super引用引用2.super引用引

25、用用来引用被子类隐藏的用来引用被子类隐藏的超类超类成员变量与成员方法成员变量与成员方法;作用作用:a.引用被子类隐藏的超类成员变量与成员方法,格式:引用被子类隐藏的超类成员变量与成员方法,格式:super.变量名;变量名;super.方法名;方法名;b.调用超类的构造方法调用超类的构造方法:super(参数表参数表)本讲稿第二十八页,共五十九页publicclassPerson4staticintcount=0;protectedStringname;protectedintage;publicPerson4(Stringn1,inta1)this.name=n1;this.age=a1;th

26、is.count+;publicintolderthen(Person4b)Person4a=this;returna.age-b.age;publicvoidprint()System.out.print(this.getClass().getName()+);System.out.print(count=+this.count+);System.out.println(+this.name+,+this.age);【例【例4.5】super用法举例用法举例所有类对象共享的静态变量count,用来记录创建对象的个数Person4定义了三个成员变量,并且定义构造函数为对象初始化方法的入口参数与

27、成员变量同名,必须使用this把它们区别开来olderthen方法,用来比较两个人的年龄,this用来引用方法所属的对象本身this.getClass().getName()方法返回当前对象所属类的名称print方法用来输出当前对象信息,以及对象属于第几个本讲稿第二十九页,共五十九页classStudent4extendsPerson4protectedStringdept;Student4(Stringn1,inta1,Stringd1)super(n1,a1);dept=d1;publicstaticvoidmain(Stringargs)Person4p1=newPerson4(李大广李

28、大广,21);p1.print();Student4s1=newStudent4(陈小瑞陈小瑞,19,计算机系计算机系);s1.print();System.out.println(年龄差年龄差=+p1.olderthen(s1);定义子类Student4,并增加新的成员变量dept子类不能继承超类的构造方法在子类构造方法中使用super调用超类的构造方法调用print方法输出当前对象信息,以及对象属于第几个调用olderthen得两个人的年龄差不足之处不足之处:调用超类的print()方法,仍然无法输出子类的dept的值本讲稿第三十页,共五十九页 4.2.4 4.2.4 方法覆盖方法覆盖如果

29、子类与超类的方法同名,则不能继承超类的方法,而是子类覆盖覆盖了超类的方法覆盖要注意如下几点覆盖要注意如下几点:子类不能覆盖超类中的子类不能覆盖超类中的final或或static方法;方法;如果超类的如果超类的abstract在子类中必须覆盖,要声明为在子类中必须覆盖,要声明为abstract;子类覆盖超类方法时,必须满足子类覆盖超类方法时,必须满足:同名、返回值相同、参数个数相同同名、返回值相同、参数个数相同方法覆盖与继承有密切关系,体现了子类补充或改变补充或改变超类方法的能力;通过覆盖使一个方法在不同子类中表现为不同行为一个方法在不同子类中表现为不同行为本讲稿第三十一页,共五十九页 4.2.

30、4 4.2.4 方法覆盖方法覆盖1.成员变量的覆盖(隐藏)成员变量的覆盖(隐藏)Java的子类可以继承超类中的非私有成员变量,同时子类还可以添加新的成员变量,新添加的成员变量是对超类的扩展,也是对子类更具体的描述如果新添加的成员变量与超类成员变量同名,将会隐藏超类的同名成员变量。如果希望在子类中引用超类中被隐藏的成员变量,要使用super引用:super.variablesuper.variable;/variable是超类的同名成员变量在实际的程序设计中,子类隐藏超类的成员变量的情况很少。如果不是很必要,建议不要在子类隐藏超类的成员变量,因为这样会增加系统开销,降低程序的可读性 本讲稿第三十

31、二页,共五十九页2.成员变量的覆盖(隐藏)成员变量的覆盖(隐藏)在继承机制中,子类可以继承超类中能被子类访问的超类成员方法,同时,子类也可以添加新的成员方法:添加超类中没有的,新的成员方法,通过扩展超类增加子类的行为;增加与超类同名的成员方法,即成员方法的覆盖。这源于继承的超类成员方法无法完整描述子类,要扩充修改这样的成员方法以适合对子类的描述。既可以在超类定义的基础上增加新的功能,也可以完全重新定义从超类继承的同名成员方法;子类覆盖超类的成员方法,必须满足同名、返回值相同、同名、返回值相同、参数相同参数相同。如果子类的一个成员方法只是与超类的成员方法同名,而不是完全相同的首部,则称为重载(子

32、类有两个同名方法)。本讲稿第三十三页,共五十九页classApublicintx,y;A(inta,intb)x=a;y=b;publicvoiddisplay()intz;z=x+y;System.out.println(add=+z);classBextendsAB(inta,intb)super(a,b);publicvoiddisplay()intz;z=x*y;System.out.println(product=+z);/定义类A/构造方法/定义成员变量/定义子类B/构造方法/调用超类的构造方法/重新定义方法,子类方法覆盖覆盖了超类方法【例【例4.6】覆盖举例覆盖举例本讲稿第三十四

33、页,共五十九页publicclassCextendsBC(intx,inty)super(x,y);publicstaticvoidmain(Stringargs)An1=newA(7,14);Bn2=newB(7,14);Cn3=newC(7,14);n1.display();n2.display();n3.display();/构造方法,并调用超类构造方法/定义子类B/分别创建三个类的对象/三个对象都调用display方法本讲稿第三十五页,共五十九页classPersonstaticintcount=0;protectedStringname;protectedintage;publicP

34、erson(Stringn1,inta1)name=n1;age=a1;this.count+;publicStringtoString()returnthis.name+,+this.age;publicvoidprint()System.out.println(本类名=+this.getClass().getName()+超类名=+this.getClass().getSuperclass().getName()+);System.out.print(Person.count=+this.count+);System.out.print(Student.count=+Student.cou

35、nt+);Objects1=this;if(s1instanceofPerson)System.out.println(s1.toString()+是Person类对象。);if(s1instanceofStudent)System.out.println(s1.toString()+是Student类对象。);/静态变量,统计对象个数/构造方法/统计Person对象个数/输出Person以及其子类对象新型/判断对象属于哪个类【例【例4.7】覆盖举例覆盖举例本讲稿第三十六页,共五十九页publicclassStudentextendsPersonstaticintcount=0;protect

36、edStringdept;protectedStudent(Stringn1,inta1,Stringd1)super(n1,a1);dept=d1;this.count+;publicStringtoString()returnsuper.toString()+,+dept;publicvoidprint()super.print();System.out.println(super.count=+super.count);System.out.println(this.count=+this.count);publicstaticvoidmain(Stringargs)Personp1=n

37、ewPerson(王小明,21);p1.print();Students1=newStudent(陈小瑞,19,计算机系);s1.print();/隐藏了超类的count/调用超类的构造方法/子类对象计数/覆盖覆盖超类的同名方法/调用超类的同名方法/调用超类的方法/引用超类变量本讲稿第三十七页,共五十九页publicclassStudentextendsPersonpublicstaticvoidmain(Stringargs)Personp1=newPerson(王小明,21);p1.print();Students1=newStudent(陈小瑞,19,计算机系);s1.print();本

38、讲稿第三十八页,共五十九页使用覆盖需要注意的问题使用覆盖需要注意的问题子类不能覆盖超类中的子类不能覆盖超类中的final或或static方法;方法;超类超类abstract方法在子类中必须覆盖,除非也声明为方法在子类中必须覆盖,除非也声明为abstract(后面章节介绍);(后面章节介绍);子类覆盖超类方法时,必须满足:同名、返回值相同、子类覆盖超类方法时,必须满足:同名、返回值相同、参数相同参数相同本讲稿第三十九页,共五十九页需要注意以下问题 类变量不但可以通过对象名引用,还可以类变量不但可以通过对象名引用,还可以通过类名引用,这是因为类变量在创建类通过类名引用,这是因为类变量在创建类的对象

39、之前,已经分配了存储空间的对象之前,已经分配了存储空间;本讲稿第四十页,共五十九页 4.2.5 4.2.5 子类对象也是超类对象子类对象也是超类对象子类的对象也是超类的对象,反之不成立。子类的对象也是超类的对象,反之不成立。如在如在【例【例4.7】中中Person是是Student的超类,可以说的超类,可以说“学生(学生(Student)也是人()也是人(Person)”。这显然是正确的,如果这样说,。这显然是正确的,如果这样说,人将失去其独特的属性与行为。人将失去其独特的属性与行为。但,不能说但,不能说“人(人(Person)也是学生()也是学生(Student)”,这显然,这显然是不正确的

40、。是不正确的。表现在程序设计中:在子类创建一个对象,该对象也是超类的对象,表现在程序设计中:在子类创建一个对象,该对象也是超类的对象,可把这个对象的引用赋值给超类对象可把这个对象的引用赋值给超类对象参考参考P71例例4-6本讲稿第四十一页,共五十九页 4.2.6 4.2.6 子类构造方法的定义子类构造方法的定义使用使用new运算符调用构造方法,才能创建类的对象;运算符调用构造方法,才能创建类的对象;如果定义类的时候不显式声明一个构造方法,如果定义类的时候不显式声明一个构造方法,Java会自动创建一个会自动创建一个不带参数的默认构造方法;不带参数的默认构造方法;只要在类中定义了构造方法,无论带参

41、数与否,只要在类中定义了构造方法,无论带参数与否,Java运行时系运行时系统不会再自动生成默认构造方法。统不会再自动生成默认构造方法。本讲稿第四十二页,共五十九页子类构造方法子类构造方法在Java继承机制中,子类对象的初始化过程一般开始于一系列的构造方法调用子类不能继承超类的构造方法,而子类的构造方法要对从超类继承的成员变量初始化,而对子类继承的超类成员的初始化可由超类的构造方法完成,子类虽然不能继承超类的构造方法,但可以调用;子类构造方法在对新添加的成员变量执行初始化之前,都将显示地(通过super)或隐式地(调用超类的默认构造方法或无参构造方法)调用其直接超类的构造方法同样,如果其直接超类

42、也派生于另一个类,则要求直接超类调用类层次结构中的上一层的构造方法,以此类推在调用请求中,最后调用的构造方法总是根类Object类的构造方法。子类的构造方法最后才会执行对新添加成员变量的初始化。本讲稿第四十三页,共五十九页classAnimalprotectedStringname;publicAnimal(Stringn)name=n;publicvoidShowInfo()System.out.print(theanimalt);System.out.print(name+t);publicclassFishextendsAnimalintSwimSpeed;Fish(Stringn,in

43、ts)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.8】子类构造方法的定义子类构造方法的定义说明:由于超类Animal已显式定义了带参构造方法,Java运行时系统不会再自动生成默认构造方法;子类构造方法

44、又隐式调用超类的无参构造方法,编译时会出错;问题在于超类没有可供子类构造方法调用的无参构造方法本讲稿第四十四页,共五十九页classAnimalprotectedStringname;publicAnimal(Stringn)name=n;publicvoidShowInfo()System.out.print(theanimalt);System.out.print(name+t);publicclassFishextendsAnimalintSwimSpeed;Fish(Stringn,ints)super(name);SwimSpeed=s;publicvoidShowInfo()Sys

45、tem.out.print(theFisht+name+t);System.out.print(Swimmingspeed:t+SwimSpeed);publicstaticvoidmain(Stringargs)Fisha=newFish(Nemo,60);a.ShowInfo();/超类定义带参构造方法/显式地调用超类的构造方法/方法覆盖【例【例4.8】子类构造方法的定义子类构造方法的定义1、修改说明:在子类构造方法第一条语句显式加上对超类构造方法的调用本讲稿第四十五页,共五十九页classAnimalprotectedStringname;/*publicAnimal(Stringn)n

46、ame=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+SwimSpeed);publicstaticvoidmain(Stringargs)Fisha=newF

47、ish(Nemo,60);a.ShowInfo();/超类定义带参构造方法/隐式地调用超类的无参构造方法/方法覆盖【例【例4.8】子类构造方法的定义子类构造方法的定义2、修改说明:在超类Animal中去掉带参构造方法的定义,这时超类的无参构造方法系统会自动生成;本讲稿第四十六页,共五十九页classAnimalprotectedStringname;publicAnimal(Stringn)name=n;publicAnimal()name=null;publicvoidShowInfo()System.out.print(theanimalt);System.out.print(name+t

48、);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.8】子类构造方法的定义子类构造方法

49、的定义3、修改说明:在超类添加一个无参的构造方法,程序体为空(当然也可以不为空,添加语句name=null)本讲稿第四十七页,共五十九页 4.3 4.3 抽象类与最终类抽象类与最终类本讲稿第四十八页,共五十九页 4.3 4.3 抽象类与最终类抽象类与最终类1.最终类最终类如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承如果希望类不被继承就把他声明为final类,如finalclassmyClass.classyourClassextendsmyClass./错误a.最终方法最终方法如果觉得定义最终类没必要,只是希望类中的方法不希望被子类修改(覆盖),可以在类中,把

50、方法定义为最终方法,如:Finalvoidfun()./最终方法,不能被子类修改本讲稿第四十九页,共五十九页finalfinal的用法的用法final类不能被继承;类不能被继承;final方法不能被覆盖;方法不能被覆盖;final域不能被修改(常量)域不能被修改(常量)本讲稿第五十页,共五十九页抽象类抽象类1.抽象方法抽象方法在一个类中声明为抽象方法时,意味着这个方法必须在子类中被重新定义(覆盖),格式如下:abstractvoidf();构造方法不能为抽象的,抽象与最终不能同时存在;抽象方法一般是仅有方法头而没有方法体的方法;抽象方法为该类的子类定义一个方法的接口标准,子类必须根据需要从新定

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com