JAVA学习--第6章高级类特性.ppt_第1页
JAVA学习--第6章高级类特性.ppt_第2页
JAVA学习--第6章高级类特性.ppt_第3页
JAVA学习--第6章高级类特性.ppt_第4页
JAVA学习--第6章高级类特性.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

江苏大学计算机学院Version2.0,第6章高级类特性,Page2,本章内容,Static关键字创建final类、方法和变量创建和使用枚举的类型使用静态导入语句创建抽象类和方法创建和使用接字符串相关类(String、StringBuffer、StringBuilder)Math类(不重要)File类Date类、Calendar类,Page3,static关键字,在类中,用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时被初始化,对于该类的所以对象来说,static成员变量只有一份。publicclassCountprivateintserialNumber;publicstaticintcounter=0;publicCount()counter+;serialNumber=counter;publicclassTestCounterpublicstaticvoidmain(Stringargs)Count.counter=100;CountC1=newCount();CountC2=newCount();static变量在某些方面与其他语言的全局变量类似,Java编程语言中没有全局变量,但是static变量是一个可以被类的任何实例访问的变量,Page4,static关键字,用static声明的方法为静态方法(又称类方法),在调用该方法时,不会将对象的引用传递给它,所以在static方法中不可访问非static的成员。静态的方法不再是针对某个对象调用,所以不能访问非静态成员classCountprivateintserialNumber;publicstaticintcounter=0;publicCount()counter+;serialNumber=counter;publicstaticintgetCounter()returncounter;publicclassTestCounterpublicstaticvoidmain(Stringargs)System.out.println(Count.getCounter();CountC1=newCount();System.out.println(Count.getCounter();,可以通过对象引用或类名(不需要实例化)访问静态成员。,Page5,Static属性:publicstaticclass属性可没有类的实例从类的外部进行访问。Static方法:Static方法无需创建类的实例即可被调用。Static方法不能访问实例变量。Static初始化程序:类可在static块中包含在方法主体中不存在的代码。Static块代码在类被加载时仅执行一次。通常,static块用来初始化static(类)属性。,static关键字(续),Page6,final关键字,final关键字用于安全性原因。它用来创建充当标准的类。它实现了以下限制:不能获取final类的子类,即final类不能被继承。不能覆盖final方法。final变量是常量。在final类中的所有方法和数据成员是显式的。引用类型的final变量,不能引用任何其他变量,Page7,空final变量,final变量不在其声明中被初始化;其初始化被延迟:空final实例变量必须在构建器中被赋值。空final本地变量可在方法的主体内随时被设置。它仅可设置一次。,Page8,枚举的类型,enum类型字段由一组固定的常量组成。可使用enum关键字来定义enum类型。例如,指定一周每一天的enum类型:publicenumDaySUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAYenum类型只能取特定值的一个。所有enums从java.lang.Enum显示扩展。因为Java不支持多重继承,enum不能扩展为任何别的内容。,Page9,静态导入,J2SE5.0提供静态导入功能,能够不受限制的访问静态成员,而不必使用类的名字限制它们。从类中导入静态成员:importstatic.;或importstatic.*;单个或集中导入成员:importstaticcards.domain.Suit.SPADES;或importstaticcards.domain.Suit.*;无需确定静态常量的资格:PlayingCardcard1=newPlayingCard(SPADES,2);过度使用静态导入功能,使程序不可读或者无法维持,而且会破坏其命名空间和所有导入的静态成员,Page10,抽象类,用abstract关键字来修饰一个类时,这个类叫做抽象类;abstractclassclassname成员变量;成员方法;用abstract来修饰一个方法时,该方法叫做抽象方法。是只声明首部没有方法体的成员方法abstractreturnTypeabstractMethod(paramlist)含有抽象方法的类必须被声明为抽象类,抽象类必须被继承,抽象方法必须被重写。如果重写不了,应该声明自己为抽象。抽象方法只需声明,而不需实现,而且不允许使用final修饰abstract方法抽象类不能被实例化。但是它们可以被子类化。,Page11,抽象类,抽象类定义其他类的通用属性和行为。它用作基类来获取相同类型的特定类。例如:abstractclassAnimalprivateStringname;Animal(Stringname)=name;publicabstractvoidenjoy();AbstactclassCatextendsAnimalprivateStringeyesColor;Cat(Stringn,Stringc)super(n);eyesColor=c;publicAbstactvoidenjoy();上述抽象方法enjoy由Animal类的子类来继承。子类Cat、Dog和Monkey以不同的方式实现此方法。enjoy方法在Cat类中已被覆盖,classDogextendsAnimalprivateStringfurColor;Dog(Stringn,Stringc)super(n);furColor=c;publicvoidenjoy()System.out.println(“狗叫声.);classMonkeyextendsAnimalprivateStringhead;Monkey(Stringn,Stringc)super(n);head=c;publicvoidenjoy()System.out.println(“猴叫声.);,abstract类不能用new运算创建对象对于abstract类,我们不能使用new运算符创建该类的对象,需产生其子类,由子类创建对象,如果一个类是abstract类的子类,它必须具体实现父类的abstract方法,这就是为什么不允许使用final修饰abstract方法的原因。一个abstract类只关心它的子类是否具有某种功能,并不关心功能的具体行为,功能的具体行为由子类负责实现,抽象类中的抽象方法可以强制子类必须给出这些方法的具体实现。,抽象类,Page13,接口,接口(interface)是抽象方法和常量值的定义的集合。公共接口是在客户端代码和实现该接口的类之间的一种约定。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。抽象类仅用于在类之间有一种关系的情况。接口定义举例:,publicinterfaceRunnerpublicstaticfinalintid=1;publicvoidstart();publicvoidrun();publicvoidstop();,Page14,接口特性,接口可以多重实现;接口中声明的属性默认为publicstaticfinal的;也只能是publicstaticfinal的;接口中只能定义抽象方法,而且这些方法默认为public的、也只能是public的;接口可以继承其它的接口,并添加新的属性和抽象方法。,Page15,接口,多个无关的类可以实现同一个接口。一个类可以实现多个无关的接口。与继承关系类似,接口与实现类之间存在多态性。定义Java类的语法格式:classextendsimplements,*,Page16,接口举例,interfaceSingerpublicvoidsing();publicvoidsleep();classStudentimplementsSingerprivateStringname;Student(Stringname)=name;publicvoidstudy()System.out.println(studying);publicStringgetName()returnname;publicvoidsing()System.out.println(studentissinging);publicvoidsleep()System.out.println(studentissleeping);,Page17,接口举例,interfaceSingerpublicvoidsing();publicvoidsleep();interfacePainterpublicvoidpaint();publicvoideat();classStudentimplementsSingerprivateStringname;Student(Stringname)=name;publicvoidstudy()System.out.println(studying);publicStringgetName()returnname;publicvoidsing()System.out.println(studentissinging);publicvoidsleep()System.out.println(studentissleeping);,Page18,接口举例,classTeacherextendsObjectimplementsSinger,PainterprivateStringname;publicStringgetString()returnname;Teacher(Stringname)=name;publicvoidteach()System.out.println(teaching);publicvoidsing()System.out.println(teacherissinging);publicvoidsleep()System.out.println(teacherissleeping);publicvoidpaint()System.out.println(teacherispainting);publicvoideat()System.out.println(teacheriseating);,Page19,接口举例,publicclassTestpublicstaticvoidmain(Stringargs)Singers1=newStudent(le);s1.sing();s1.sleep();Singers2=newTeacher(steven);s2.sing();s2.sleep();Painterp1=(Painter)s2;/也可以当作Painter来看p1.paint();p1.eat();,输出结果:,studentissingingstudentissleepingteacherissingingteacherissleepingteacherispaintingteacheriseating,testI/Test.java,接口回调,接口回调是指:可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法.InterfaceShowMassagevoidshowInfo(Strings);classTVimplementsShowMassagepublicvoidshowInfo(Strings)System.out.println(s);PublicclassTestpublicstaticvoidmain(Stringargs)ShowMassagem;/声明接口m=newTV();/接口变量中存放对象的引用m.showInfo(“长虹电视机”);/接口回调,Page21,接口的使用:声明期望实现一个或更多的类的方法确定对象的编程接口而无需显示类的实际主体捕捉非相关类之间的相似性而无需强制类的关系通过声明实现几个接口的类来模拟多重继承,接口,Page22,接口用法总结,通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。(就像人拥有一项本领)通过接口可以指明多个类需要实现的方法。(描述这项本领的共同接口)通过接口可以了解对象的交互界面,而不需了解对象所对应的类。使用接口?还是抽象类?interface同时赋予了接口和抽象类的好处如果父类可以不带任何函数定义,或任何成员变量,那么优先使用接口。,内部类,Java支持在一个类中声明另一个类,这样的类称作内部类,而包含内部类的类称为外部类。内部类可以有自己的成员变量和方法使用内部类必须先了解内部类与包围它的外部类之间的关系,以及它们的成员之间如何实现相互访问内部类的类体中不可以声明类变量(静态成员变量)和类方法(静态成员方法)。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。,在内部类中访问外部类,外部类把内部类看做它的一个成员,内部类的身份如同外部类的其他成员变量和成员方法一样。内部类如同外部类的其他成员一样可以用public,private,protected和default修饰。一个类内部的内部成员之间可以相互访问,由于外部类把内部类看做它的一个成员,所以内部类也可以可以访问外部类的所有成员变量和成员方法,包括外部类的private成员和private方法;外部类通过创建内部类对象访问内部类的成员。外部类的main方法或者其他类中引用内部类必须使用内部类完整的类标识,在外部类中访问内部类,定义内部类的目的之一是为了实现封装,实现信息的隐藏。因为内部类的类名只能出现在外部类中,或者外部类方法的语句块内。内部类隐藏于外部类内。外部类的方法可以通过创建内部类对象来引用内部类成员。publicclassOuterClass/外部类classGetYear/内部类privateinti=2008;publicvoidshowYear()System.out.println(i);classGetInfor/内部类privateStringinf;GetInfor(Stringinf)this.inf=inf;publicvoidshowInfor()System.out.println(“Welcomto”+inf);publicvoiduserOuter(Stringinformation)/外部类方法GetYeary=newGetYear();/创建内部类对象y.showYear();GetInford=newGetInfor(information);/创建内部类对象d.showInfor();publicstaticvoidmain(Stringargs)OuterClassu=newOuterClass();u.useOuter(“Beijing”);,静态内部类的应用,如果一个内部类是静态的,那么这个类就自动成为顶级类,没有父类静态内部类的方法(不管是静态方法还是非静态方法)只能直接访问外部类中静态成员,要访问外部类中非静态成员则必须在内部类创建外部类对象,通过对象名访问外部静态成员。而且非静态内部类不能声明静态成员。由于内部类被声明为静态后无法正常访问外部类非静态成员,这收到了很大的限制。一般情况下,当一个内部类不需要访问外部类成员,或者是需要声明静态成员,或者是仅仅为了隐藏在外部类内时,可以把内部类声明为静态的。静态内部类的使用主要有几个方面原因:需要在内部类定义静态成员希望隐藏内部类避免类名重复。在开发大型的应用程序的时候需要设计大量的类,类存在重名的可能。为了避免这种情况,可以把可能重名的类设置为static、public的内部类。其他类在引用的时候要是有完整的内部类名标识(外部类名.内部类名),这样就可以避免重复。,静态内部类的应用,publicclassstaticInclasspublicstaticclassPersonprivateintage;privateStringname;staticintcount=0;Person(Stringn,inta)name=n;age=a;count+;publicvoiddis()System.out.println(count=+count+t+name+t+age);publicstaticvoidmain(Stringargs)staticInclass.Personp1=newstaticInclass.Person(John,20);p1.dis();staticInclass.Personp2=newstaticInclass.Person(Jone,22);p2.dis();staticInclass.Personp3=newstaticInclass.Person(Jim,21);p3.dis();,静态内部类的特殊用处,在开发应用程序的时候要编写大量的类,并需要对类进行调试。根据静态内部类的特点,编写一个类时,在类中可以定义一个静态内部类以提供一个独立的、可选的辅助功能,如用在代码测试和演示,这个方便而有效。publicclassOuter/外部类privateinti,j;staticints=1;Outer(inta,intb)i=a;j=b;publicvoiddis()System.out.println(i+“”+j);publicstaticclassTestOuter/含有静态main方法的静态内部类publicstaticvoidmain(Stringargs)/测试外部类Outert=newOuter(10,100);/创建外部类对象t.dis();System.out.println(s)/静态内部类可以访问外部类的静态成员为了测试外部类而定义的内部类必须是静态的,因为只有静态内部类才可以定义静态的main方法,在该方法完成对外部类的测试,String类,java.lang.String类代表不可变的字符序列。“xxxxx”为该类的一个对象。String类的常见构造方法:String(Stringoriginal)创建一个String对象为original的拷贝。String(charvalue)用一个字符数组创建一个String对象String(charvalue,intoffset,intcount)用一个字符数组从offset项开始的count个字符序列创建一个String对象,String类举例(1),publicclassTestpublicstaticvoidmain(Stringargs)Strings1=hello;Strings2=world;Strings3=hello;System.out.println(s1=s3);/trues1=newString(hello);s2=newString(hello);System.out.println(s1=s2);/falseSystem.out.println(s1.equals(s2);/truecharc=s,u,n,j,a,v,a;Strings4=newString(c);Strings5=newString(c,4,4);System.out.println(s4);/sunjavaSystem.out.println(s5);/java,String类常用方法(1),publiccharcharAt(intindex)返回字符串中第index个字符。publicintlength()返回字符串的长度。publicintindexOf(Stringstr)返回字符串中出现str的第一个位置publicintindexOf(Stringstr,intfromIndex)返回字符串中从fromIndex开始出现str的第一个位置publicbooleanequalsIgnoreCase(Stringanother)比较字符串与another是否一样(忽略大小写)publicStringreplace(charoldChar,charnewChar)在字符串中用newChar字符替换oldChar字符,String类举例(2),publicclassTestpublicstaticvoidmain(Stringargs)Strings1=sunjava,s2=SunJava;System.out.println(s1.charAt(1);/uSystem.out.println(s2.length();/8System.out.println(s1.indexOf(java);/4System.out.println(s1.indexOf(Java);/-1System.out.println(s1.equals(s2);/falseSystem.out.println(s1.equalsIgnoreCase(s2);/trueStrings=我是程序员,我在学java;Stringsr=s.replace(我,你);System.out.println(sr);/你是程序员,你在学java,String类常用方法(2),publicbooleanstartsWith(Stringprefix)判断字符串是否以prefix字符串开头publicbooleanendsWith(Stringsuffix)判断字符串是否以prefix字符串结尾publicStringtoUpperCase()返回一个字符串为该字符串的大写形式publicStringtoLowerCase()返回一个字符串为该字符串的小写形式publicStringsubstring(intbeginIndex)返回该字符串从beginIndex开始到结尾的子字符串publicStringsubstring(intbeginIndex,intendIndex)返回该字符串从beginIndex开始到endIndex结尾的子字符串publicStringtrim()返回将该字符串去掉开头和结尾空格后的字符串,String类举例(3),publicclassTestpublicstaticvoidmain(Stringargs)Strings=WelcometoJavaWorld!;Strings1=sunjava;System.out.println(s.startsWith(Welcome);/trueSystem.out.println(s.endsWith(World);/falseStringsL=s.toLowerCase();StringsU=s.toUpperCase();System.out.println(sL);/welcometojavaworld!System.out.println(sU);/WELCOMETOJAVAWORLD!StringsubS=s.substring(11);System.out.println(subS);/JavaWorld!Stringsp=s1.trim();System.out.println(sp);/sunjava,String类常用方法(3),静态重载方法publicstaticStringvalueOf()可以将基本类型数据转换为字符串;例如:publicstaticStringvalueOf(doubled)publicstaticStringvalueOf(inti)b+“”;方法publicStringsplit(Stringregex)可以将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组。,String类举例(4),publicclassTestpublicstaticvoidmain(Stringargs)intj=1234567;StringsNumber=String.valueOf(j);/j+”System.out.println(j是+sNumber.length()+位数。);Strings=Mary,F,1976;StringsPlit=s.split(,);for(inti=0;i弧度,File类,java.io.File类代表系统文件名(路径或文件名)。File类的常见构造方法:publicFile(Stringpathname)以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。File的静态属性Stringseparator存储了当前系统的路径分隔符。,通过File对象可以访问文件的属性。publicbooleancanRead()publicbooleancanWrite()publicbooleanexists()publicbooleanisDirectory()publicbooleanisFile()publicbooleanisHidden()publiclonglastModified()

温馨提示

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

评论

0/150

提交评论