《《类与对象续》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《类与对象续》PPT课件.ppt(61页珍藏版)》请在三一办公上搜索。
1、1,第三章 类与对象(续),2,6、方法重载,在Java(和C+)里,多个构造方法都有相同的名字,它们被称为“重载”。方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。(但不能以返回值区分重载的方法),3,例如,要打印不同类型的数据,int,float,String,不需要定义不同名的方法:printInt(int);printFloat(float);printString(String)。利用方法重载,只需要定义一个方法名:println(),接收不同的参数:println(int);println(float);println(S
2、tring);例:overloading.java,4,7、this关键字,this 关键字只能在方法内部使用,表示对“调用方法的当前对象”的引用。例:MyThis2.java,作为返回值使用:当需要返回对当前对象的引用时,就可以在return语句里使用this。例:this.java,MyThis1.java,5,This的另一种使用方法:调用构造方法,可以使用this关键字在一个构造方法中调用另外的构造方法。代码更简洁,维护起来也更容易通常用参数个数比较少的构造方法调用参数个数最多的构造方法使用this关键字例子,MyThis3.java,BankAccount.java,6,8、对象的回
3、收,与C+不同,Java额外提供了垃圾回收器,对于不再使用的内存资源,垃圾回收器能自动将其释放,无需再使用类似C+里的析构函数destructor。Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法,7,8.1程序运行时的内部工作原理,程序的最小单元变量一旦被定义以后就在内存占用一定的空间。C,C+都允许动态的(在运行时)分配存储空间。堆(heap)是一种运行时的数据结构,是一个大的存储区域,用于支持动态的内存管理。Java里所有引用类型的对象都存储在堆里。栈(stack)也是一种运行时的数据结
4、构,为方法(函数)调用和返回处理提供存储空间。具体参考think in java第二章2.2节,8,C Language Memory Allocation,Dynamic libraries,Unitialized Data,Initialized data,DATA,SEGMENT,Heap,Stack,grows,grows,Text Segment,char*p=malloc(1024);,int iarray20;,int iarray2=1,2,3;,int main().,int myfunc(int x,float y)int z;,9,8.2 内存的分配与释放,内存是一种紧缺
5、的资源,不再需要时,应当尽快释放。C语言中,通过调用malloc()动态分配内存,用free()释放内存。C+语言中,则用new()与delete()。这些都属于由程序员显示地管理内存资源。如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存耗尽.Java中的所有对象都是基于堆分配内存,任何对象都可以从堆中分配不同的存储区域,也可以把它们返回堆中,这些操作没有固定的顺序,因而导致了内存产生很多碎片的问题。,10,Java采用系统管理资源,由系统跟踪内存的使用情况,释放不再使用的内存,这个处理过程称为垃圾回收(garbage collection)。垃圾收集器自动扫描对象的动态内存区,对不再使
6、用的对象做上标记以进行垃圾回收,11,finalize()方法提供一个手动释放资源的机会,当资源可能被某些对象占用,Java的内存管理系统无法直接访问,也不能自动释放时,就采用此方法。程序员大部分时间都不会用到此方法,而运行程序库大多用这种方式控制某些资源。,12,finalize()方法在类中声明,因此 Java中的每一个类都有该方法用于释放系统资源,如关闭打开的文件或socket等声明格式protected void finalize()throws throwable,13,9、包(package)(参考教材4.6,thinking in java 第5章),Java开发中,有时类名会相
7、同,同名的类就可能发生冲突。为了解决这一问题,Java提供包来管理类名,在C+里用命名空间来管理。但远不如Java灵活方便。,14,开发人员往往需要一个好的文件组织形式,以便把文件放在一个目录结构里,创建自己的工具库,以供自己或开发团队其他成员使用。这就需要打“包”。Java用“包”来表示相关类的集合,这些相关类可以属于多个文件,(当然有自己独立的.java和.class),把它们一起放到一个组群中,形成一个程序库。Java程序包相当于其它语言中的库函数。,打“包”,15,9.1包(package):程序库单元,包就是使用关键字import来导入整个程序库时那些变为可用的单元,如:import
8、 java.util.*这就把整个实用程序(utility)库都引入到程序中。J2SE里常用的程序库(包)有:java.lang,java.io,java.applet,java.awt,等,16,9.1.1类的打包,Java中用package语句来将一个Java源文件中的类组合为一个包。,17,声明一个包格式如下:package mypackage;(包名使用小写字母)public class MyClass/,18,其他程序欲使用MyClass中的任何其他public 类,就需要使用import关键字。import mypackage.*;/Myclass m=new MyClass();
9、,19,如何解决一个包里可以有许多.class文件,而且所有文件的名称必须保证是独一无二的,Java利用操作系统层次化的文件结构解决这个问题。,9.1.2创建独一无二的包名,20,Java编译器把包对应于文件系统的目录管理,package语句中,用“.”来指明目录的层次。则包的定义格式为:package pkg1.pkg2.pkg3;,21,例如:包mypackage下有一个类Student,以及包mypackage.school,school下有类Professor,类Student。,school,Path,Professor,mypackage,Eclipse开发环境下的E:myjava
10、GraceWu(GraceWu Project name),Student,Student,22,package mypackage.school;public class Professorpublic Professor()System.out.println(“professor”);,Professor.java,package mypackage.school;public class Studentpublic Student()System.out.println(“student”);,Student.java,23,在Eclipse环境下,建立package,建立包mypac
11、kage:在project 例如GraceWu下,点击右键,选中package。输入包名:mypackage。在mypackage下定义类Student。建立子包mypackage.school于mypackage下。然后在mypackage.school下定义两个类Student及Professor。,24,于GraceWu下,创建类Cun,里面声明Professor,Student对象。/Cun.javaimport mypackage.school.*;public class Cunpublic static void main(String args)Professor chang=
12、new Professor();Student li=new Student();.,包的使用,25,9.1.3创建Jar文件(压缩文件)参考教材,jar工具是个java应用程序,便于将java applet或应用程序打包成单个归档文件。在Eclipse环境下,选中欲打包的文件,点击右键,使用export即可把多个文件打包生成一个.jar文件并放置于指定目录。,26,10、Java 基本类库教材4.6,Java提供了用于语言开发的类库,称为Java基础类库(JFC,Java Foundational Class),也称应用程序编程接口(API,Application Programming I
13、nterface),分别放在不同的包中Java提供的包主要有java.lang,java.io,java.math,java.utiljava.applet,java.awt,java.rmi,java.security,java.sql等,27,10.1java.lang,语言包(java.lang)语言包java.lang提供了Java语言最基础的类,包括Object类数据类型包装类(the Data Type Wrapper)(前面已讲过)字符串类(String,StringBuffer)数学类(Math)系统和运行时类(System、Runtime)类操作类(Class,ClassLo
14、ader),28,10.1.1Object 类教材:4.2,Object类Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点包含了所有Java类的公共属性,其构造方法是Object()。从Eclipse的Hierarchy view可以看出文件里所有类之间的继承关系。,29,Object类定义了所有对象必须具有的状态和行为,主要的6个方法如下public final Class getClass()获取当前对象所属的类信息,返回Class对象(主要为系统编程人员提供)public String toString()(前面已讲)返回当前对象本身的有关信息,按字符串对象返回
15、public boolean equals(Objectobj)比较两个对象是否是同一对象,是则返回true,30,protected Object clone()生成当前对象的一个拷贝,并返回这个复制对象Public int hashCode()返回该对象的哈希代码值protected void finalize()throws Throwable 定义回收当前对象时所需完成的资源释放工作开发人员可以编写自己的方法,以替换这些基本的方法。,31,Java的String类进行特殊数组字符串处理。1)字符串声明及初始化Java中的字符串分常量和变量两种,常量初始化可由直接给一个String对象赋
16、值完成,对于字符串变量,在使用前同样要进行声明,初始化。初始化过程一般为下面几种:直接用字符串常量来初始化字符串:String s3=“Hello!Welcom to Java!”;,字符串类(String),32,由字符数组创建字符串:char ch=s,t,o,r,y;String s2=new String(ch);或String s4=new String(“Hello”);字符串数组:String strArray;strArray=new String8;strArray0=Hello;strArray1=“World”;,33,public class ArrayOfString
17、sDemo public static void main(String args)String anArray=String One,String Two,String Three;for(int i=0;i anArray.length;i+)System.out.println(anArrayi.toLowerCase();,运行结果:string onestring twostring three,34,2)字符串运算符“+”“+”可以连接不同的字符串,即:”abc”+”def”=“abcdef”.如果在“+”两端有一个是字符串,Java就会将非字符串的数据转换为字符串,然后进行字符串
18、连接运算。,35,public class StrDemopublic static void main(String args)String st1=“Jack”,st2=“Brown”;String name=st1+“”+st2;System.out.println(“Name=”+name);double pi=3.1415926;String stt=“Hello,”+st1;System.out.println(stt+pi+2);System.out.println(pi+2+stt);运行结果为:Name=Jack BrownHello,Jack3.141592623.1415
19、9262Hello,Jack,36,String类的常用方法1,37,String类的常用方法2,38,10.1.3变量字符串类StringBuffer,StringBuffer类不同于String的地方在于,在实例化StringBuffer之后,可以改动其中的字符。也就是,如果你需要对字符串中的内容进行操作,如改变内容,就使用StringBuffer,但StringBuffer不支持单个字符检索或子串检索。,39,程序员经常使用String类,而非StringBuffer。String类的对象相比,执行效率要低一些该类的方法不能被用于String类的对象,40,生成StringBuffer类
20、的对象new StringBuffer();生成容量为16的空字符串对象new StringBuffer(int size);生成容量为size的空字符串对象new StringBuffer(String aString);生成aString的一个备份,容量为其长度+16,41,StringBuffer类的常用方法1,42,StringBuffer类的常用方法2,43,例StringEditor.java:已知一个字符串,返回将字符串中的非字母字符都删除后的字符串例SbufferTest.java:StringBuffer 类常用方法的使用,44,10.1.4数学类(math),数学类提供一组
21、常量和数学函数,例如E和PI常数求绝对值的abs方法计算三角函数的sin方法和cos方法求最小值、最大值的min方法和max方法求随机数的random方法等其中所有的变量和方法都是静态的(static)是终结类(final),不能从中派生其他的新类,45,10.1.5系统和运行时类System、Runtime,System类访问系统资源arraycopy()复制一个数组exit()结束当前运行的程序currentTimeMillis()获得系统当前日期和时间等访问标准输入输出流System.in 标准输入,表示键盘System.out 标准输出,表示显示器,46,Runtime类可直接访问运行
22、时资源totalMemory()返回系统内存总量freeMemory()返回内存的剩余空间,47,10.1.6类操作类(Class、ClassLoader),Class类提供运行时信息,如名字、类型以及父类Object类中的getClass方法返回当前对象所在的类,返回类型是Class它的getName方法返回一个类的名称,返回值是String它的getSuperclass方法可以获得当前对象的父类ClassLoader类提供把类装入运行时环境的方法,48,10.2java.util(实用包),实用包(java.util)实现各种不同实用功能日期类:描述日期和时间DateCalendarGre
23、gorianCalendar,49,集合类Collection(无序集合)、Set(不重复集合)List(有序不重复集合)、Enumeration(枚举)LinkedList(链表)、Vector(向量)Stack(栈)、Hashtable(散列表)、TreeSet(树)StringTokenizer类允许以某种分隔标准将字符串分隔成单独的子字符串,50,11、类的访问控制,Java提供了访问权限修饰词,以供开发人员向客户端程序员指名哪些是可用的,哪些是不可用的。访问权限控制的等级,从最大权限到最小权限依次为:public,protected,包访问权限(没有关键字),private.,51,
24、Java访问权限修饰符poublic,protected以及private都置于类中每个成员的定义之前无论它们是一个数据成员,还是一个方法。每个访问权限修饰符都只对它后面修饰的特定定义有效,这与C+存在着显著不同。在C+中,访问权限修饰符控制着它后面的所有定义,直到又一个访问权限修饰符出现。,Java,C+访问权限修饰符的区别,52,类的访问控制只有public(公共类)及无修饰符(默认类)两种。默认访问权限没有任何关键字,通常指包访问权限,即当前包中所有其他类对那个成员都有访问权限,但对于包以外的所有类,这个成员都是private。访问权限符与访问能力之间的关系如表,53,类成员的访问控制公
25、有(public)可以被其他任何对象访问(前提是对类成员所在的类有访问权限)保护(protected)只可被同一类及其子类的实例对象访问私有(private)只能被这个类本身访问,在类外不可见默认(default)仅允许同一个包内的访问;又被称为“包(package)访问权限”,54,当一个类可以被访问时,对类内的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。,55,public 接口访问例子:/Student.javapackage mypackage.school;public class Student public Student()System.out.prin
26、tln(“Student constructor);void foo()System.out.println(foo);/,56,创建一个使用的程序:/:Cun.java/Uses the library import mypackage.school.*;public class Cun public Cun()System.out.println(“Cun constructor);public static void main(String args)Student x=new Student();/!x.foo();/Cant access 在Cun里创建一个Student对象,因为它
27、的构建方法是public的,而且类也是public的,然而,foo()成员不可在Cun.java内访问,因为foo()只有在mypackage.school包内才是可以访问的。,57,private:例子/:IceCream.java/Demonstrates private keyword class Sundae private Sundae()static Sundae makeASundae()return new Sundae();public class IceCream public static void main(String args)/!Sundae x=new Sund
28、ae();Sundae x=Sundae.makeASundae();/,不能通过构建方法创建一个Sundae对象;相反,必须调用makeASundae()方法来实现,58,12、Javadoc-Java文档生成器-参考,Javadoc 是用于提取注释的工具,能从java源文件中读取 格式为:/*/的注释,并能识别注释中用标识的一些特殊变量,制作成Html格式的类说明文档。javadoc不但能对一个java源文件生成注释文档,而且能对目录和包生成交叉链接的html格式的类说明文档,十分方便。,59,Javadoc可以为类,接口,方法,变量添加注释。Javadoc只能为public和protected成员进行文档的注释,private及包内访问权限成员的注释会被忽略。生成的文档为html文件,可通过浏览器查看。,60,Javadoc注释由Javadoc标签(tag)和描述性文本组成 例如:/*see*version 1.0,2005-04-12*author grace*since JDK1.3*/,61,