第9讲-类继承的基本概念

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第9讲:类继承的概念与应用JAVA应用开发详解本章目标•掌握继承的基本概念及实现•掌握继承实现的各种限制为什么要有继承?Person--nameage:String:int++++getName()setName(Stringname)getAge()setAge(intage):String:void:int:voidStudent---nameageschool:String:int:String++++++getName()setName(Stringname)getAge()setAge(intage)getSchool()setSchool(Stringschool):String:void:int:void:String:void类的继承格式•在Java中使用extends关键字完成类的继承关系,操作格式:–class父类{}//定义父类–class子类extends父类{}//使用extends关键字实现继承继承的实现classPerson{//定义Person类privateStringname;//定义name属性privateintage;//定义age属性publicStringgetName(){//取得name属性returnname;}publicvoidsetName(Stringname){//设置name属性this.name=name;}publicintgetAge(){//取得age属性returnage;}publicvoidsetAge(intage){//设置age属性this.age=age;}}classStudentextendsPerson{//Student是Person的子类//此处任何代码都不编写}通过子类扩展父类的功能classPerson{//定义Person类privateStringname;//定义name属性privateintage;//定义age属性publicStringgetName(){//取得name属性returnname;}publicvoidsetName(Stringname){//设置name属性this.name=name;}publicintgetAge(){//取得age属性returnage;}publicvoidsetAge(intage){//设置age属性this.age=age;}}classStudentextendsPerson{//Student是Person的子类privateStringschool;//新定义的属性schoolpublicStringgetSchool(){//取得school属性returnschool;}publicvoidsetSchool(Stringschool){//设置school属性this.school=school;}}Person与Student的继承关系图继承的限制•在Java中只允许单继承,不能使用多重继承,即:一个子类只能继承一个父类。但是允许进行多层继承,即:一个子类可以有一个父类,一个父类还可以有一个父类。多重继承多层继承继承的类图表示访问限制•在使用继承的时候也应注意的是:子类是不能直接访问父类中的私有成员的,但是子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。子类访问限制classStudentextendsPerson{//Student是Person的子类publicvoidfun(){System.out.println(父类中的name属性:+name);//错误,无法访问System.out.println(父类中的age属性:+age);//错误,无法访问}}下一章内容继承的进一步研究本章目标•掌握子类对象的实例化过程•掌握方法覆写的概念及实现•掌握super关键字的作用子类对象实例化过程•在继承的操作中,对于子类对象的实例化也是有要求的:“子类对象在实例化之前必须首先调用父类中的构造方法之后再调用子类自己的构造方法”。观察子类对象的实例化过程classPerson{//定义父类PersonprivateStringname;//定义name属性privateintage;//定义age属性publicPerson(){System.out.println(父类Person中的构造。);//父类的构造方法}setter、getter...}classStudentextendsPerson{//Student是Person的子类,扩展父类的功能privateStringschool;//新定义的属性schoolpublicStudent(){System.out.println(子类Student中的构造。);//子类的构造方法}setter、getter...}publicclassInstanceDemo{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent();stu.setName(张三);//此时访问的方法是父类的,子类中并没有定义stu.setAge(30);//此时访问的方法是父类的,子类中并没有定义stu.setSchool(北京大学);//此方法是子类定义的System.out.println(姓名:+stu.getName()+,年龄:+stu.getAge()+,学校:+stu.getSchool());}}隐含的语句•对于以上的代码实际在子类的构造方法中隐含了一个super()的语法classStudentextendsPerson{//Student是Person的子类,扩展父类的功能privateStringschool;//新定义的属性schoolpublicStudent(){super();//加与不加此语句效果一致System.out.println(子类Student中的构造。);//子类的构造方法}publicStringgetSchool(){//取得school属性returnschool;}publicvoidsetSchool(Stringschool){//设置school属性this.school=school;}}方法的覆写•在继承的关系中也存在着方法覆写的概念,所谓的方法覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即:被子类覆写的方法不能拥有比父类方法更加严格的访问权限。•已学习过的三种访问权限:–关于访问权限,实际上前几章读者已经见过三种访问权限了:private、default、public,这三种访问权限的具体作用本书后面会有介绍,读者现在只需要记住大小关系即可:privatedefaultpublic。•所以,如果在父类中使用public定义的方法,子类的访问权限必须是public,否则程序会无法编译。方法的覆写classPerson{voidprint(){//定义一个默认访问权限的方法System.out.println(Person--voidprint(){});}}classStudentextendsPerson{//定义一个子类继承Person类publicvoidprint(){//覆写父类中的方法,扩大了权限System.out.println(Student--voidprint(){});}}publicclassOverrideDemo01{publicstaticvoidmain(Stringargs[]){newStudent().print();//此处执行的是被覆写过的方法}}错误的方法覆写•如果现在被子类覆写的方法权限缩小的话,则在编译时将出现错误提示。classPerson{publicvoidprint(){//定义一个默认访问权限的方法System.out.println(Person--voidprint(){});}}classStudentextendsPerson{//定义一个子类继承Person类voidprint(){//覆写父类中的方法,但缩小了权限,错误System.out.println(Student--voidprint(){});}}调用父类中被子类覆写过的方法•在子类中可以使用“super.方法()”的形式,从子类访问父类中的方法。classPerson{voidprint(){//定义一个默认访问权限的方法System.out.println(Person--voidprint(){});}}classStudentextendsPerson{//定义一个子类继承Person类publicvoidprint(){//覆写父类中的方法,扩大了权限super.print();//调用父类中的print()方法System.out.println(Student--voidprint(){});}}publicclassOverrideDemo03{publicstaticvoidmain(Stringargs[]){newStudent().print();//此处执行的是被覆写过的方法}}思考?•如果现在将父类的一个方法定义成private访问权限,在子类中将此方法声明为default访问权限,那么这样还叫做覆写吗?属性的覆盖•在继承中除了方法可以覆写之外,属性也可以覆盖,所谓的属性覆盖就是指子类声明了与父类同名的属性。classPerson{publicStringinfo=MLDN;//定义一个公共属性}classStudentextendsPerson{//定义一个子类继承Person类publicStringinfo=LXH;//此属性与父类中的属性名称一致publicvoidprint(){System.out.println(父类中的属性:+super.info);//访问父类中的info属性System.out.println(子类中的属性:+this.info);//访问本类中的info属性}}publicclassOverrideDemo05{publicstaticvoidmain(Stringargs[]){newStudent().print();//调用print()方法}}方法的重载与覆写的区别No.区别点重载覆写1单词OverloadingOverriding2定义方法名称相同,参数的类型或个数不同方法名称、参数的类型、返回值类型全部相同3对权限没有要求被覆写的方法不能拥有更严格的权限4范围发生在一个类中发生在继承类中super关键字的作用•使用super可以从子类中调用父类中的构造方法、普通方法、属性。使用super调用父类中的指定构造方法classPerson{//定义父类PersonprivateStringname;//定义name属性privateintage;//定义age属性publicPerson(Stringname,intage){//通过构造方法设置name和agethis.setName(name);//设置name属性内容this.setAge(age);//设置age属性内容}setter、getterpublicStringgetInfo(){//信息输出return姓名:+this.getName()+;年龄:+this.getAge();}}classStudentextendsPerson{//Student是Person的子类,扩展父类的功能privateStringschool;//新定义的属性schoolpublicStudent(Stringname,intage,Stringschool){super(name,age);//指定调用父类中的构造方法this.setSchool(school);}setter、getterpublicStringgetInfo(){//覆写父类中的方法returnsupe

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功