Java核心技术上继承_第1页
Java核心技术上继承_第2页
Java核心技术上继承_第3页
Java核心技术上继承_第4页
Java核心技术上继承_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(优选)Java核心技术上继承目前一页\总数六十页\编于十四点2陈Q:3364613chw521@163.com我的联系方式目前二页\总数六十页\编于十四点3继承广东药学院目前三页\总数六十页\编于十四点面向对象的三大特征面向对象的程序设计有三大特征:封装:解决了数据的安全性问题继承:解决了代码的重用问题多态:解决了程序的扩展问题目前四页\总数六十页\编于十四点继承的概念在现实生活中的继承,可以理解为儿子继承了父亲的财产,即财产重用;面向对象程序设计中的继承,则是代码重用;继承是利用现有的类创建新类的过程,现有的类称作基类(baseclass)、超类(superclass)或父类(parentclass),创建的新类称作派生类(derivedclass)、子类(childclass)。基类方法和属性派生类基类方法+

附加方法目前五页\总数六十页\编于十四点人学生老师本科生研究生目前六页\总数六十页\编于十四点目前七页\总数六十页\编于十四点最高层是最普遍的、最一般的情况,往下每一层都比上一层更具体,并包含有高层的特征,通过这样的层次结构使下层的类能自动享用上层类的特点和性质;继承其实就是自动地共享基类中成员属性和成员方法的机制。目前八页\总数六十页\编于十四点在Java中实现继承在Java中实现继承需要使用到extends关键字;实现继承的一般语法是:

[访问修饰符]class派生类名extends基类名{

成员列表

}如:

classStudentextendsPerson { …… }目前九页\总数六十页\编于十四点classPerson{//定义人类

publicStringmName;//姓名

publicintmAge;//年龄

publicvoiddining(){System.out.println("吃饱了...");}//吃饭的方法}classStudentextendsPerson{//学生类继承于人类

publicfloatmGrade;//成绩

publicvoidexamination(){System.out.println("考试及格了...");}//考试的方法}classTeacherextendsPerson{//教师类继承于人类

publicfloatmSalary;//薪水

publicvoidprelection(){System.out.println("上课很累...");}//上课的方法}目前十页\总数六十页\编于十四点publicclassInheritanceDemo{//该类用于容纳main方法

publicstaticvoidmain(String[]args){Studentstd=newStudent();//实例化学生对象

std.mName="张三";std.mAge=18;//为姓名和年龄赋值,访问的是父类中的成员

std.dining();//调用吃饭的方法,访问的是父类中的成员

std.examination();//调用考试方法,访问的是子类中的成员

Teachertea=newTeacher();//实例化教师对象

tea.mName="陈伟";tea.mAge=38;tea.dining();tea.prelection();}}目前十一页\总数六十页\编于十四点继承的作用当今软件设计的特征:软件规模越来越大;软件设计者越来越多;软件设计分工越来越细。引入继承,实现了代码重用;引入继承,实现了递增式的程序设计。目前十二页\总数六十页\编于十四点继承的作用(续)继承是能自动传播代码和重用代码的有力工具;继承能够在某些比较一般的类的基础上建造、建立和扩充新类;能减少代码和数据的重复冗余度,并通过增强一致性来减少模块间的接口和界面,从而增强了程序的可维护性;能清晰地体现出类与类之间的层次结构关系。目前十三页\总数六十页\编于十四点与继承有关的注意事项继承是单方向的,即派生类可以继承和访问基类中的成员,但基类则无法访问派生类中的成员;在Java中只允许单一继承方式,即一个派生类只能继承于一个基类,而不能象C++中派生类继承于多个基类的多重继承方式。目前十四页\总数六十页\编于十四点继承中的构造方法父类中的构造方法不能被子类继承,即便它是public的;父类的构造方法负责初始化属于它的成员变量,而子类的构造方法则只需考虑属于自己的成员变量,不必去关注父类的情况。目前十五页\总数六十页\编于十四点继承中的构造方法示例classParentClass{//定义父类

publicParentClass(){//构造方法System.out.println("这是父类的构造方法。");}}classChildClassextendsParentClass{//子类继承于父类

publicChildClass(){//构造方法System.out.println("这是子类的构造方法。");}}public

classConstructorTest{//该类用于容纳main方法

public

static

voidmain(String[]args){ChildClasscc=newChildClass();//实例化子类对象}}目前十六页\总数六十页\编于十四点构造方法的执行顺序当实例化子类的对象时,必须先执行父类的构造方法,然后再执行子类的构造方法;如果父类还有更上级的父类,就会先调用最高父类的构造方法,再逐个依次地将所有继承关系的父类构造方法全部执行;如果父类的构造方法执行失败,那么子类的对象也将无法实例化。目前十七页\总数六十页\编于十四点例子classEmployee{privateStringname;privatedoublesalary;privateDatehireDay;publicEmployee(Stringn,doubles,intyear,intmonth,intday){name=n;salary=s;GregorianCalendarcalendar=newGregorianCalendar(year,month-1,day);hireDay=calendar.getTime();}...publicvoidraiseSalary(doublebyPercent){doubleraise=salary*byPercent/100;salary+=raise;}}目前十八页\总数六十页\编于十四点publicclassManagerextendsEmployee{

privatedoublebonus;

publicManager(Stringn,doubles,intyear,intmonth,intday)

{

super(n,s,year,month,day);

bonus=0;

}

publicdoublegetSalary()

{

doublebaseSalary=salary+bonus;(自行修改)

returnbaseSalary+bonus;

}

publicvoidsetBonus(doubleb)

{

bonus=b;

}}目前十九页\总数六十页\编于十四点super使用super来调用父类的方法或变量。super.getXXX();super.setXXX(xx);super.XXX=super在构造器中的应用super(param1,param2,...);这里的super表示调用父类的带参数的构造方法使用super调用构造器的语句必须是子类构造器的第一条语句。this的用途1.引用隐式参数(当前对象)2.调用该类其他的构造器super的用途1.调用父类的方法2.调用父类的构造器目前二十页\总数六十页\编于十四点示例Managerboss=newManager("CarlCracker",80000,1987,12,15);boss.setBonus(5000);Employee[]staff=newEmployee[3];//fillthestaffarraywithManagerandEmployeeobjectsstaff[0]=boss;staff[1]=newEmployee("HarryHacker",50000,1989,10,1);staff[2]=newEmployee("TommyTester",40000,1990,3,15);//printoutinformationaboutallEmployeeobjectsfor(Employeee:staff)System.out.println("name="+e.getName()+",salary="+e.getSalary());目前二十一页\总数六十页\编于十四点多态一个对象能够引用多种实际类型的现象称为多态,在运行时能够自动的选择调用那个方法的现象成为动态绑定。Java不支持多重继承,仅支持单继承。子类的每个对象都是超类的对象。程序中出现超类对象的任何都可以用子类对象置换。不能将一个超类的引用赋给子类变量。--Managerm=staff[i];目前二十二页\总数六十页\编于十四点动态绑定例如下面的大例子中,Emplyee类型的e可以引用Emplyee类型,Manager类型以及Boss类型的对象,当调用e.getSalary()的时候,编译器知道具体的e的实际类型,从而准确的调用该实际类型类的getSalary方法,如果不存在,那就调用其超类的该方法,这就是动态绑定。覆盖超类的方法时,子类方法不能低于超类方法的可见性。目前二十三页\总数六十页\编于十四点重载1)方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名方法同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就是多态性。3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。目前二十四页\总数六十页\编于十四点重写(覆盖)1)父类与子类之间的多态性,对父类的方法进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。3)子类方法的访问修饰权限不能小于父类的;目前二十五页\总数六十页\编于十四点重写方法的规则1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。目前二十六页\总数六十页\编于十四点而重载的规则:1、必须具有不同的参数列表;2、可以有相同的返回类型,只要参数列表不同就可以了;3、可以有不同的访问修饰符;4、可以抛出不同的异常;目前二十七页\总数六十页\编于十四点重写与重载的区别在于:重写对多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.目前二十八页\总数六十页\编于十四点classBextendsA{ privatevoida1(){ ... } publicvoida2(){ ... }}classA{ privatevoida1(){ .... } publicvoida2(){ ... } publicvoida2(intn){ ... }}目前二十九页\总数六十页\编于十四点阻止继承:final不允许扩展(被继承)的类被称为final类。加了final的方法,子类不能覆盖这个方法。加了final的属性,构造对象一不允许改变值。final类,方法自动成为final,属性不自动final。classEmployee{......publicfinalStringgetName(){returnname;}......}

finalclassManagerextendsEmployee{......}Manager类不可以再被继承了,而getName方法也不可被子类重写String类就是一个final类目前三十页\总数六十页\编于十四点强制类型转换(谨慎使用)进行强制类型转换的原因:在暂时忽视对象的实际类型之后,使用对象的全部功能。仅可以在继承链上从上向下进行转换,如把实际类型是Manager的Employee类型的staff[1]转换成Manager类型。Managerman=(Manager)staff[1];类型转换前先进行检查if(staff[1]instanceofManager){boss=(Manager)staff[1]....}目前三十一页\总数六十页\编于十四点抽象类抽象类就是一个专门用来扩展的祖先类,抽象类本身不能定义一个该类的对象,即抽象类不能被实例化。作用--通过继承它实现多态,后期绑定,提高代码重用目前三十二页\总数六十页\编于十四点抽象类中的方法有两种,一种是普通的,和一般类中的方法一样,另一种是抽象方法,起一个占位的作用,将来子类继承会实现这种方法。类即使不含抽象方法,也可以将类声明为抽象类。抽象类的抽象方法可以用来实现多态性目前三十三页\总数六十页\编于十四点publicabstractclassPerson{publicabstractStringgetDescription();privateStringname;publicPerson(Stringn){name=n;}publicStringgetName(){returnname;}}包含一个或多个abstract方法的类必须声明为抽象类。类即使不含抽象方法,也可以将类声明为抽象类目前三十四页\总数六十页\编于十四点publicclassStudentextendsPerson{privateStringmajor;/***@paramnthestudent'sname*@parammthestudent'smajor*/publicStudent(Stringn,Stringm){//passntosuperclassconstructorsuper(n);major=m;}publicStringgetDescription(){return"astudentmajoringin"+major;}}目前三十五页\总数六十页\编于十四点publicclassEmployeeextendsPerson{privatedoublesalary;privateDatehireDay;publicEmployee(Stringn,doubles,intyear,intmonth,intday){super(n);salary=s;GregorianCalendarcalendar=newGregorianCalendar(year,month-1,day);hireDay=calendar.getTime();}publicdoublegetSalary(){returnsalary;}publicDategetHireDay(){returnhireDay;}publicStringgetDescription(){returnString.format("anemployeewithasalaryof$%.2f",salary);}publicvoidraiseSalary(doublebyPercent){doubleraise=salary*byPercent/100;salary+=raise;}}目前三十六页\总数六十页\编于十四点publicclassPersonTest{publicstaticvoidmain(String[]args){Person[]people=newPerson[2];//Personpel=newPerson("ss");//fillthepeoplearraywithStudentandEmployeeobjectspeople[0]=newEmployee("HarryHacker",50000,1989,10,1);people[1]=newStudent("MariaMorris","computerscience");//printoutnamesanddescriptionsofallPersonobjectsfor(Personp:people){System.out.println(p.getName()+","+p.getDescription()); }}}目前三十七页\总数六十页\编于十四点在抽象类中定义了一个getDescription()方法,两个子类Employee和Student分别实现了它,但是用了不同的实现方法,当通过Person类型的p调用getDescription()方法时,就会根据p的实际实际类型来调用确定的方法。目前三十八页\总数六十页\编于十四点爱保护访问尽量将类的属性标记为private,方法标记为public但有时,希望超类中的某些方法或属性被子类访问,或允许子类的方法访问超类的某个属性,这时需要将方法或属性声明为protected.谨慎使用protected。目前三十九页\总数六十页\编于十四点类成员的访问控制权限信息隐藏是面向对象程序设计的重要特点之一,它可以:防止类的使用者意外损坏数据;对任何实现细节所作的修改不会影响到使用该类的其它代码;使类更易于使用。在Java中实现信息隐藏的是访问控制权限机制;访问控制权限包括4个访问修饰符:public、protected、private和缺省;可以使用上述访问修饰符修饰类的成员。目前四十页\总数六十页\编于十四点访问修饰符不受任何限制,本类或非本类均可随意访问。public本类及其子类可以访问(父子友好),同一个包中的其它类也可访问(包内友好)。protected只有相同包中的类可以访问(包内友好)。缺省只有本类可以访问,其余都不可以。private目前四十一页\总数六十页\编于十四点访问控制权限(列表)publicprotected缺省private本类可以可以可以可以同包子类可以可以可以不可以同包非子类可以可以可以不可以不同包子类可以可以不可以不可以不同包且非子类可以不可以不可以不可以访问修饰符位置目前四十二页\总数六十页\编于十四点课堂练习1源文件BaseClass.javapackagemypkg;public

classBaseClass{

public

intpubA;

protected

intproB;

intdefC;

private

intpriD;}源文件DerivedClass.javapackagemypkg;public

classDerivedClass

extendsBaseClass{

public

voidfun(){pubA=10;proB=20;defC=30;priD=40;}}√√√×目前四十三页\总数六十页\编于十四点课堂练习2源文件Frist.javapublic

classFrist{

public

intpubA;

protected

intproB;

intdefC;

private

intpriD;}public

classSecond{

public

voidfun(){Fristobj;obj=newFrist();obj.pubA=10;B=20;obj.defC=30;obj.priD=40;}}源文件Second.java√√×√目前四十四页\总数六十页\编于十四点课堂练习3源文件SuperClass.javapackageaaa;public

classSuperClass{

public

intpubA;

protected

intproB;

intdefC;

private

intpriD;}源文件SubClass.javapackagebbb;importaaa.SuperClass;public

classSubClass

extendsSuperClass{

public

voidfun(){pubA=10;proB=20;defC=30;priD=40;}}√√××目前四十五页\总数六十页\编于十四点类的访问权限还可以在定义类时为类添加访问修饰符,对类进行访问权限控制;对类使用的访问修饰符只有public和缺省两种;被public修饰的类可以从任何地方访问,不受限制;不加访问修饰符,缺省修饰的类只能从本包中访问,不同包则无法访问到;但要注意的是:在一个源文件中只能有一个被public修饰的类,并且文件名必须与public的类同名;如果要定义多个public的类,则必须分别写在不同的源文件中,一个源文件只写一个类是良好的编程习惯。目前四十六页\总数六十页\编于十四点ObjectObject类是Java类的始祖。只有primitivetypes不是对象。equals方法--用于检测一个对象是否等于另一个对象。检测this与otherObject是否引用一个对象:if(this==otherObject)returntrue;检测一个对象是否为nullif(otherObject==null)returnfalse;比较this与otherObject是否属于同一个类if(getClass()!=otherObject.getClass())returnfalse;目前四十七页\总数六十页\编于十四点hashCode方法--返回对象的散列码(正数或负数)。目前四十八页\总数六十页\编于十四点toString方法--返回对象值的字符串System.out.println("boss.toString():"+boss);--println方法直接会调用boss.toString();toString()是非常有用的调试工具。getClass()--返回包含对象信息的类对象。getName()--返回类的名字getSuperClass()--以class对象的形式返回这个类的超类信息。目前四十九页\总数六十页\编于十四点泛型数组列表ArrayList动态数组ArrayList<T>如:ArrayList<Employee>staff=newArrayList<Employee>();Java7:ArrayList<Employee>staff=newArrayList<>();@SuppressWarnings("unchecked")标注来标记变量能够接受类型转换。目前五十页\总数六十页\编于十四点ArrayList<T>()--构造一个空数组列表ArrayList<T>(intinitialCapacity)-用指定容量构造一个空数组列表booleanadd(Tobj)--在数组列表的尾端添加一个元素.永远返回trueintsize()--返回存储在数组列表中的当前元素数量voidensureCapacity(intcapacity)--确保数组列表在不重新分配存储空间的情况下就能够保存给定数量的元素。voidtrimToSize()--将数组列表的存储容量削减到当前尺寸目前五十一页\总数六十页\编于十四点访问泛型数组voidset(intindex,Tobj)--设置数组列表指定位置的元素值,这个操作将覆盖这个位置的原有内容Tget(intindex)--获得指定位置的元素值voidadd(intindex,Tobj)--向后移动元素,以便插入元素Tremove(intindex)--删除一个元素,并将后面的元素向前移动。被删除的元素由返回值返回。目前五十二页\总数六十页\编于十四点例:publicstaticvoidmain(String[]args){//fillthestaffarraylistwiththreeEmployeeobjectsArrayList<Employee>staff=newArrayList<>();staff.add(newEmployee("CarlCracker",75000,1987,12,15));staff.add(newEmployee("HarryHacker",50000,1989,10,1));staff.add(newEmployee("TonyTester",40000,1990,3,15));//raiseeveryone'ssalaryby5%for(Employeee:staff)e.raiseSalary(5);//printoutinformationaboutallEmployeeobjectsfor(Employeee:staff)System.out.println("name="+e.getName()+",salary="+e.getSalary()+",hireDay="+e.getHireDay());}目前五十三页\总数六十页\编于十四点对象包装器与自动装箱包装类是针对于原生数据类型的包装。所有的基本类型都有一个与之对应的类。如:Integer对应基本类型int将这些类称为包装器Integer、Long、Float、Double、Short、Byte、Character、Void和Boolean对象包装类是不可变的,即一旦构造了包装器,就不允许包装在其中的值。对象包装器类是final,不可被继承。目前五十四页\总数六十页\编于十四点Integer类将int类型的值包装到一个对象中Integer通过下面这个构造方法构造相应的整型数的对象:publicInteger(intvalue);publicintintValue()方法则返回这个包装类所包装的整型值。staticStringtoString(inti)--以一个新String对象的形式返回给定数值i的十进制表示staticintparseInt(Strings)staticintparseInt(Strings,intradix)返回字符串s表示的整型数值,给定字符串表示的是十进制的整数(radix参数进制的整数)staticIntegervalueOf(Strings)StaticIntegervalueOf(Strings,intrad

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论