Java程序设计@第04章-继承_第1页
Java程序设计@第04章-继承_第2页
Java程序设计@第04章-继承_第3页
Java程序设计@第04章-继承_第4页
Java程序设计@第04章-继承_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

Java程序设计第04章继承本章内容CORE-C04-01类、父类与抽象CORE-C04-02类、子类与继承

CORE-C04-03根父类:Object类

CORE-C04-04继承设计与应用本章目标1、实现类的继承。2、能熟练使用Object中方法

第01节类、父类与抽象知识点预览#节知识点难点重点应用1CORE-C04-01类、父类与抽象1、类的共性抽象√√

2、类的层次结构√√

1、类的共性抽象面向对象的引入会提供软件项目实现的稳定性,稳定性的一个重要方面是软件项目模块可复用与扩展。Java提供继承的语法机制类实现模块的复用与扩展、升级。publicclassPerson{privateStringname;privatebyteage;publicvoidprintInfo(){ ……..}}publicclassStudent{privateStringname;privatebyteage;privateStringschool;publicvoidprintInfo(){ ……..}publicvoidstudy(){ ……..}}2、类的层次结构Person-name:String-age:byte+printInfo():voidStudent-school:String+study():voidTeacher-dept:String+teach():void第02节类、子类与继承

知识点预览#节知识点难点重点应用2CORE-C04-02类、子类与继承1、类的扩展

√√2、类的继承语法

√√3、子类对象实例化与构造器

√√4、super

√√5、覆盖与多态

√√6、覆盖与修饰符号

√√7、覆盖与异常转移√√√8、阻止继承与final修饰符号

√√9、类型转换

√√10、类型装箱与解箱

√√11、protected修饰符号

√√1、类的扩展子类与父类的关系:子类比起父类就是成员更加丰富:成员变量增加(扩展)。处理成员变量的成员方法增加(扩展)。class父类{ //成员变量 //成员方法}class子类{ //这样也可以描述子类 //父类成员变量 //父类成员方法 //扩展的成员变量 //扩展的成员方法}子类的描述方法明显两个缺点:1、描述重复。2、从代码无法反映父子关系。2、类的继承语法-1类扩展(继承)的语法机制class子类extends父类{ //扩展的成员变量 //构造方法 //扩展的成员方法}class父类{ //成员变量 //成员方法}class子类extends父类{ //扩展的成员变量 //扩展的成员方法}子类的描述方法明显解决了缺点:1、描述不重复。2、体现父子关系。2、类的继承语法-2子类对象也可以访问父类中的成员。classClsSuper{ publicintm_a=20; publicvoidshow(){ System.out.printf("m_a=%d\n",m_a); }}classClsSubextendsClsSuper{ publicintm_b=30; publicvoidprint(inta){

//使用父类成员变量像自己的成员变量一样,不需要通过方法(对成员方法亦然) System.out.printf(“m_a=%d,m_b=%d,参数=%d\n”,m_a,m_b,a); }}ClsSubobjsub=newClsSub();System.out.println(objsub.m_a); //访问父类的成员变量System.out.println(objsub.m_b);objsub.show(); //访问父类的成员方法objsub.print(999);2、类的继承语法-3子类对象的类型:依据常规白马是马的逻辑思路,子类对象肯定是父类型。在Java的语法规则上:可以把子类类型的对象赋值给父类类型的对象。依据马不一定是白马的逻辑思路,父类对象不一定是子类类型。在Java的语法规则上:不能把父类对象赋值给子类对象。classClsSubextendsClsSuper{ //ClsSuper是ClsSub的子类}

ClsSubsub=null;ClsSupersup=newClsSuper(); sub=sup; //语法错误sub=newClsSuper(); //语法错误sup=sub; //语法正确

2、类的继承语法-4子类对父类的扩展有几个重点必须清楚:尽管子类扩展父类,但子类与父类属于不同的类块,作用域不同,遵循不同作用域规则。子类的成员变量可以与父类的成员变量重名。子类的成员方法可以与父类的成员方法重名,甚至参数类型、顺序、个数都完全相同。classClsSuper{ publicintm_a=20; publicvoidshow(inta){ }}classClsSubextendsClsSuper{ publicintm_a=30; publicvoidshow(inta){ }}成员变量在父子类中重名的解决规则与成员方法是不同的2、类的继承语法-4子类的成员变量与父类的成员变量重名的访问规则:当使用对象访问,根据对象的申明类型来确认:对象申明为父类型,就访问父类中成员变量,声明为子类类型就访问子类中成员变量。子类中没有,就到父类中查找成员变量并访问。classClsSuper{ publicintm_a=20;}classClsSubextendsClsSuper{ publicintm_a=30;}ClsSupero1=newClsSuper();System.out.println(o1.m_a); //ClsSuper中成员。ClsSupero2=newClsSub();System.out.println(o2.m_a); //ClsSuper中成员。

ClsSubo3=newClsSub();System.out.println(o3.m_a); //ClsSub中成员。

3、子类对象实例化与构造器-1子类与父类是属于两个不同的块,也就是属于两个不同的作用域,作用域不同也意味着内存存储区域的差异。子类对象的空间分配也是分成两个部分:父类内存空间,子类内存空间。2030m_am_aClsSuperClsSubClsSupero2=newClsSub();System.out.println(o2.m_a); //ClsSuper中成员。

o2对象实际是访问位置

对象决定访问的开始位置,

类型决定访问的范围。3、子类对象实例化与构造器-2当子类扩展父类,子类对象可以访问父类的成员,但其中有一个必须要注意:父类的构造器不能初始化子类成员,子类构造器不能初始化父类成员。子类与父类的成员都是由自己的构造器完成初始化。子类对象化的时候,首先判定是否有父类,没有父类就直接调用构造器完成成员变量初始化。有则调用父类构造器完成父类成员变量的初始化,然后调用子类构造器初始化子类成员变量。不管父子类,他们的成员都使用自己的构造器来初始化自己的成员变量。子类的构造器不能初始化父类的成员,父类构造器不能初始化子类的成员。当子类初始化的时候,会调用父类构造器,但由于构造器重载,Java引入如下语法规则:当子类初始化的时候,默认调用父类的缺省构造器。但也可以指定构造器类初始化父类成员变量。3、子类对象实例化与构造器-3使用super指定父类构造器classClsSuper{ privateintm_a=20; publicClsSuper(){ } publicClsSuper(inta){ m_a=a; } }classClsSubextendsClsSuper{ privateintm_b=30; publicClsSub(intb,inta){

super(a); //调用ClsSuper(inta) m_b=b; } publicClsSub(intb){ //调用ClsSuper()构造器,m_a=20 m_b=b; }}Super必须在构造器的第一行。调用缺省构造器3、子类对象实例化与构造器-4当把子类对象赋值给父类对象,最后导致真正的类型无法确认。Java提供专门的语法来识别对象的真正类型。

对象instanceof类型ClsSupero2=newClsSub();if(o2instanceofClsSub){System.out.println(“o2是ClsSub类型”);}4、super关键字super除了当成构造器使用外,还可以作为作用域使用:当父类成员与子类成员冲突的时候,使用[super.成员]可以区分是父类中成员,不加super前缀或者加this前缀表示是当前类成员。当父类、子类成员不冲突的时候,不需要super前缀。注意:super作为构造器使用,必须放在构造器中,而且必须是第一行。super作为作用域使用,可以在构造器,也可以在成员方法内使用,可以放在任意行。5、覆盖与多态-1父类与子类的成员方法重名,冲突分成两种情况:在类内部不通过对象使用。可以使用this,super关键字区分。通过对象使用。Java语法的默认规则是:不管对象是什么类型,调用的方法都是new后构造器所在类的方法。(与对象的表现类型无关),称为覆盖(Override)classClsSuper{ publicvoidshow(){ }}classClsSubextendsClsSuper{ publicvoidshow(){ }}ClsSuperobjsuper=newClsSub();objsuper.show();先确认对象的实际类型。再确认类所在的方法,并调用。5、覆盖与多态-2Java提供的Override语法对程序的稳定结构有非常重要的作用。classClsSuper{ publicvoidshow(){ }}classClsSub1extendsClsSuper{ publicvoidshow(){ //实现1 }}classClsSub2extendsClsSuper{ publicvoidshow(){ //实现2 }}classMain{ publicstaticvoidmain(String[]args){ ClsSuperobj=newClsSub1(); //表现类型ClsSuper实际类型ClsSub1 call(obj); //call内部的调用因对象不同而不同。 } //称为多态(一个方法多种实现) publicstaticvoidcall(ClsSuperobj){ obj.show(); }}6、覆盖与修饰符号-1为了防止方法被覆盖,可以使用修饰符final。使用final修饰的方法是不能被覆盖的。为了防止覆盖方法因拼写原因,而没有覆盖,可以使用标注修饰让编译器做语法检测。@Override。 //注意区分大小写。

classClsSuper{ publicvoidshow(){ }}classClsSubextendsClsSuper{ @Override //如果show方法与父类不一样,会报编译错误。 publicvoidshow(){ } public@Overridevoidshow(){ //@Override作为修饰符,与其他修饰符不分先后。 }}6、覆盖与修饰符号-2在override语法中,子类中的override方法的修饰符功能弱于父类中的方法。修饰符的强弱按照如下顺序排列:public

缺省 (什么修饰符都不要)protectedprivate7、覆盖与异常转移覆盖的异常列表在设计上是希望逐步处理,所以子类的override方法的异常列表中的异常类不能多于父类的异常列表中的异常类型。classClsSuper{ publicvoidshow()throwsException{ }}classClsSubextendsClsSuper{ @Override publicvoidshow(){ //语法合法 }

publicvoidshow()throwIOException{ //语法非法,多于父类的异常列表 }}8、阻止继承与final修饰符号除了防止方法被覆盖,Java还引入了防止继承的语法机制:在class前加final修饰符。finalclassClsSuper{ //classClsSuper不能再被继承。 publicvoidshow(){ }}9、类型转换-1从前面的语法知道,把子类类型的对象赋值给父类类型的对象是合法的,类型是自动转换的。这种转换是合理的。因为类型转换实际的作用是改变了对象空间的访问范围。子类对象的访问范围大于父类类型的范围。子类类型的对象赋值给父类类型的对象,只是从大的范围限制在小的范围。当从父类类型的对象赋值给子类类型的对象,等同于从小范围扩大访问范围,扩大的部分空间可能是合法,也可能不合法,所以父类对象赋值给子类对象是不允许的。但如果程序员确保扩大的空间是合法的,想转换对象的类型,Java也提供语法进行把父类类型的对象转换为子类类型的对象。

2030m_am_aClsSuperClsSub9、类型转换-2强制类型转换使用强制类型转换,可以把父类类型对象转换以后赋值给子类类型对象,但实际程序运行的时候可能访问不到可能不存在的扩展空间,这样导致错误。所以建议在对象强制转换前,先判定他的真正类型后再转换。ClsSupero1=newClsSuper(); //合法

ClsSubo2=newClsSub(); //合法ClsSupero3=newClsSub(); //合法ClsSubo4=newClsSuper(); //非法ClsSubo5=o1; //非法ClsSubo6=(ClsSub)o1; //合法,但实际对o1扩大访问范围的空间不存在

if(o1instanceofClsSub){

ClsSubo6=(ClsSub)o1;}else{ System.out.println(“不能转换”);}10、类型装箱与解箱在JDK1.5以后的版本中,Java语法中还引入了基本类型与Wrap类型之间的装箱(Box)与解箱(UnBox)的语法。传统方式装箱/解箱方式Integeri=newInteger(“2000”);intj=Value();Integeri=2000; //自动装箱

intj=i; //自动解箱11、protected修饰符号修饰符protected是专门争对父子继承类之间的访问限制的。使用protected修饰的成员,在类块外,只能由子类访问:不管是直接访问,还是使用对象访问。注意:子类包含子类的子类都可以访问。第03节根父类:Object类

知识点预览#节知识点难点重点应用3CORE-C04-03根父类:Object类1、认识Object类

√√2、equals方法使用与继承

√√3、HashCode方法使用与继承

√√4、toString方法使用与继承

√√1、认识Object类不管继承或者不继承,在Java中所有的类都继承自Object的类。Object类提供一个缺省构造器。提供一组基本方法。classClsSuper{ publicvoidshow(){ }}ClsSuperobj=newClsSuper();System.out.println(obj.toString()); //toString方法来自Object类。protectedObjectclone() //克隆booleanequals(Objectobj) //相等判定protectedvoidfinalize() //析构回调Class<?>getClass() //返回运行时类型inthashCode() //返回对象的hash码voidnotify() //唤醒当前对象监视的等待线程voidnotifyAll() //唤醒当前对象监视的所有的等待线程StringtoString() //把对象转换为字符串,println打印对象会自动调用voidwait() //让当前线程等待voidwait(longtimeout) //让当前线程等待timeout毫秒voidwait(longtimeout,intnanos)//让当前线程等待timeout毫秒+纳秒2、equals方法使用与继承对象相等的判定使用==只能判定两个对象是否使用同一空间。无法判定两个对象的内容是否相等。Object提供equals方法用来判定两个对象的内容是否相等。equals默认的是判定对象的空间地址相等。可以override该方法来实现定制的相等判定规则。classClsSuper{ privateintm_score=20; booleanequals(Objectobj){ if(objinstanceofClsSuper){ ClsSupero=(ClsSuper)obj; if(o.m_score==this.m_score){//o.m_score可以访问私有成员 returntrue;//对象的分数相等,则对象等 } else{ returnfalse;//对象的分数不等,则对象不等。 } } else{ returnfalse; //类型不同,直接返回不等 } } }3、hashCode方法使用与继承hashCode()方法的作用:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode。规则:如果hashCode在equals方法中不提供比较信息,则最好保持返回值不变。一般不要求hashCode的值是不变的。如果两个对象通过equals判定相等,则hashCode返回值必须相等。如果两个对象通过equals判定不相等,而hashCode可以返回相等的值。但equ

温馨提示

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

评论

0/150

提交评论