资源预览内容
第1页 / 共61页
第2页 / 共61页
第3页 / 共61页
第4页 / 共61页
第5页 / 共61页
第6页 / 共61页
第7页 / 共61页
第8页 / 共61页
第9页 / 共61页
第10页 / 共61页
亲,该文档总共61页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章 类与对象(续)16、方法重载在Java(和C+)里,多个构造方法都有相同的名字,它们被称为“重载”。方法重载即指多个方法可以享有相同的名字。但是这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。(但不能以返回值区分重载的方法)2例如,要打印不同类型的数据,int, float, String,不需要定义不同名的方法: printInt(int); printFloat(float); printString(String)。 利用方法重载,只需要定义一个方法名:println(),接收不同的参数: println(int); println(float); println(String);例:overloading.java37、this关键字this 关键字只能在方法内部使用,表示对“调用方法的当前对象”的引用。例:MyThis2.java,作为返回值使用:当需要返回对当前对象的引用时,就可以在return语句里使用this。例:this.java,MyThis1.java4This的另一种使用方法:调用构造方法可以使用this关键字在一个构造方法中调用另外的构造方法。代码更简洁,维护起来也更容易通常用参数个数比较少的构造方法调用参数个数最多的构造方法使用this关键字例子,MyThis3.java, BankAccount.java58、对象的回收与C+不同,Java额外提供了垃圾回收器,对于不再使用的内存资源,垃圾回收器能自动将其释放,无需再使用类似C+里的析构函数destructor。Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存Java运行时系统会在对对象进行自动垃圾回收前,自动调用对象的finalize()方法68.1 程序运行时的内部工作原理程序的最小单元变量一旦被定义以后就在内存占用一定的空间。C, C+都允许动态的(在运行时)分配存储空间。堆(heap)是一种运行时的数据结构,是一个大的存储区域,用于支持动态的内存管理。Java里所有引用类型的对象都存储在堆里。栈(stack)也是一种运行时的数据结构,为方法(函数)调用和返回处理提供存储空间。具体参考think in java第二章2.2节7 C Language Memory AllocationDynamic librariesUnitialized DataInitialized dataDATASEGMENTHeapStackgrowsgrowsText Segmentchar * p = malloc(1024);int iarray20;int iarray2 = 1,2,3 ;int main() . int myfunc(int x, float y) int z; 88.2 内存的分配与释放内存是一种紧缺的资源,不再需要时,应当尽快释放。C语言中,通过调用malloc() 动态分配内存,用free()释放内存。C+ 语言中,则用new()与delete()。这些都属于由程序员显示地管理内存资源。 如果程序员忘记释放内存,则容易造成内存泄漏甚至导致内存耗尽.Java中的所有对象都是基于堆分配内存,任何对象都可以从堆中分配不同的存储区域,也可以把它们返回堆中,这些操作没有固定的顺序,因而导致了内存产生很多碎片的问题。9Java采用系统管理资源,由系统跟踪内存的使用情况,释放不再使用的内存,这个处理过程称为垃圾回收(garbage collection)。垃圾收集器自动扫描对象的动态内存区,对不再使用的对象做上标记以进行垃圾回收10finalize()方法提供一个手动释放资源的机会,当资源可能被某些对象占用,Java的内存管理系统无法直接访问,也不能自动释放时,就采用此方法。程序员大部分时间都不会用到此方法,而运行程序库大多用这种方式控制某些资源。11finalize()方法在类java.lang.Object中声明,因此 Java中的每一个类都有该方法用于释放系统资源,如关闭打开的文件或socket等声明格式protected void finalize() throws protected void finalize() throws throwablethrowable129、包(package)(参考教材4.6,thinking in java 第5章)Java开发中,有时类名会相同,同名的类就可能发生冲突。为了解决这一问题,Java提供包来管理类名,在C+里用命名空间来管理。但远不如Java灵活方便。13开发人员往往需要一个好的文件组织形式,以便把文件放在一个目录结构里,创建自己的工具库,以供自己或开发团队其他成员使用。这就需要打“包”。Java用“包”来表示相关类的集合,这些相关类可以属于多个文件,(当然有自己独立的.java和.class),把它们一起放到一个组群中,形成一个程序库。Java程序包相当于其它语言中的库函数。打“包”149.1 包(package): 程序库单元包就是使用关键字import来导入整个程序库时那些变为可用的单元,如:import java.util.*这就把整个实用程序(utility)库都引入到程序中。J2SE里常用的程序库(包)有:java.lang, java.io, java.applet, java.awt, java.net等159.1.1类的打包Java中用package语句来将一个Java源文件中的类组合为一个包。 16声明一个包格式如下:package package mypackagemypackage; ; (包名使用小写字母)public class MyClass /17其他程序欲使用MyClass中的任何其他public 类,就需要使用import关键字。import mypackage.*;/Myclass m = new MyClass();18如何解决一个包里可以有许多.class文件,而且所有文件的名称必须保证是独一无二的,Java利用操作系统层次化的文件结构解决这个问题。9.1.2创建独一无二的包名19Java编译器把包对应于文件系统的目录管理,package语句中,用 “. ”来指明目录的层次。则包的定义格式为:package pkg1.pkg2.pkg3;20例如:包mypackage下有一个类Student,以及包mypackage.school,school下有类Professor, 类Student 。schoolPathProfessormypackageEclipse开发环境下的开发环境下的E:myjavaGraceWu(GraceWu Project name)StudentStudent21package mypackage.school;public class Professorpublic Professor()System.out.println(“professor”);Professor.javapackage mypackage.school;public class Studentpublic Student()System.out.println(“student”);Student.java22在Eclipse环境下,建立package建立包mypackage: 在project 例如GraceWu下,点击右键,选中package。输入包名: mypackage。在mypackage下定义类Student。建立子包mypackage.school于mypackage下。然后在mypackage.school下定义两个类Student及Professor。23于GraceWu下,创建类Cun,里面声明Professor, Student对象。/Cun.javaimport mypackage.school.*;public class Cunpublic static void main(String args)Professor chang = new Professor();Student li = new Student();.包的使用249.1.3创建Jar文件(压缩文件)参考教材4.6.3jar工具是个java应用程序,便于将java applet或应用程序打包成单个归档文件。在Eclipse环境下,选中欲打包的文件,点击右键,使用export即可把多个文件打包生成一个.jar.jar文件并放置于指定目录。2510、Java 基本类库教材4.6Java提供了用于语言开发的类库,称为Java基础类库(JFC,Java Foundational Class) ,也称应用程序编程接口(API,Application Programming Interface),分别放在不同的包中Java提供的包主要有java.lang,java.io,java.math,java.utiljava.applet,java.awt,java.awt.datatransferjava.awt.event,java.awt.image,java.beansjava.net,java.rmi,java.security,java.sql等2610.1java.lang语言包(java.lang)语言包java.lang提供了Java语言最基础的类,包括ObjectObject类类数据类型包装类数据类型包装类(the Data Type Wrapper)(前面已讲过)字符串类字符串类(String,StringBuffer)数学类数学类(Math)系统和运行时类系统和运行时类(System、Runtime)类操作类类操作类(Class,ClassLoader)2710.1.1Object 类教材:4.2Object类Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点包含了所有Java类的公共属性,其构造方法是Object( )。从Eclipse的Hierarchy view可以看出文件里所有类之间的继承关系。28Object类定义了所有对象必须具有的状态和行为,主要的6个方法如下public final Class getClass() 获取当前对象所属的类信息,返回Class对象(主要为系统编程人员提供)public String toString() (前面已讲)返回当前对象本身的有关信息,按字符串对象返回public boolean equals(Objectobj) 比较两个对象是否是同一对象,是则返回true29protected Object clone( ) 生成当前对象的一个拷贝,并返回这个复制对象Public int hashCode() 返回该对象的哈希代码值protected void finalize() throws Throwable 定义回收当前对象时所需完成的资源释放工作开发人员可以编写自己的方法,以替换这些基本的方法。30Java的String类进行特殊数组字符串处理。1)字符串声明及初始化Java中的字符串分常量和变量两种,常量初始化可由直接给一个String对象赋值完成,对于字符串变量,在使用前同样要进行声明,初始化。初始化过程一般为下面几种:直接用字符串常量来初始化字符串:String s3 = “Hello! Welcom to Java!”; 10.1.2字符串类(String)31由字符数组创建字符串: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”;32public class ArrayOfStringsDemo 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 three332)字符串运算符“+”“+”可以连接不同的字符串,即:”abc”+”def” = “abcdef”.如果在“+”两端有一个是字符串,Java就会将非字符串的数据转换为字符串,然后进行字符串连接运算。34public 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.14159262Hello,Jack35String类的常用方法1名称解释int length( )返回字符串中字符的个数返回字符串中字符的个数char charAt(int index)返回序号返回序号index处的字符处的字符int indexOf(String s)在接收者字符串中进行查找,如果在接收者字符串中进行查找,如果包含子字符串包含子字符串s s,则返回匹配的第一则返回匹配的第一个字符的位置序号,个字符的位置序号, 否则返回否则返回-1String substring(int begin, int end)返回接收者对象中序号从返回接收者对象中序号从begin开始开始到到end-1的子字符串的子字符串public String split(String regex)public String split(String regex, int limit)以指定字符为分隔符,分解字符串以指定字符为分隔符,分解字符串String concat(String s)返回接收者字符串与参数字符串返回接收者字符串与参数字符串s进进行连接后的字符串行连接后的字符串36String类的常用方法2名称解释String replace(char oldChar, char newChar); 将接收者字符串的将接收者字符串的oldChar替换为替换为newCharint compareTo(String s); 将接收者对象与参数对象进行比较将接收者对象与参数对象进行比较boolean equals(String s);接收者对象与参数对象的值进行比较接收者对象与参数对象的值进行比较String trim( ); 将接收者字符串两端的空字符串都去掉将接收者字符串两端的空字符串都去掉String toLowerCase()将接收者字符串中的字符都转为小写将接收者字符串中的字符都转为小写String toUpperCase()将接收者字符串中的字符都转为大写将接收者字符串中的字符都转为大写3710.1.3变量字符串类StringBufferStringBuffer类不同于String的地方在于,在实例化StringBuffer之后,可以改动其中的字符。也就是,如果你需要对字符串中的内容进行操作,如改变内容,就使用StringBuffer,但StringBuffer不支持单个字符检索或子串检索。38程序员经常使用String类,而非StringBuffer。String类的对象相比,执行效率要低一些该类的方法不能被用于String类的对象39生成StringBuffer类的对象new StringBuffer(); 生成容量为16的空字符串对象new StringBuffer(int size); 生成容量为size的空字符串对象new StringBuffer(String aString); 生成aString的一个备份,容量为其长度 +1640StringBuffer类的常用方法1名称解释int length ( )返回字符串对象的长度返回字符串对象的长度int capacity( )返回字符串对象的容量返回字符串对象的容量void ensureCapacity(int size)设置字符串对象的容量设置字符串对象的容量void setLength(int len)设置字符串对象的长度。如果设置字符串对象的长度。如果len的的值小于当前字符串的长度,则尾部值小于当前字符串的长度,则尾部被截掉被截掉char charAt(int index)返回返回index处的字符处的字符41StringBuffer类的常用方法2名称解释void setCharAt(int index, char c)将将index处的字符设置为处的字符设置为cvoid getChars(int start, int end, char charArray, int newStart)将接收者对象中从将接收者对象中从start位置到位置到end-1位置的字符拷贝到字符数组位置的字符拷贝到字符数组charArray中,从位置中,从位置newStart开开始存放始存放StringBuffer reverse( )返回将接收者字符串逆转后的字返回将接收者字符串逆转后的字符串符串StringBuffer insert(int index, Object ob)将将ob插入到插入到index位置位置StringBuffer append(Object ob)将将ob连接到接收者字符串的末尾连接到接收者字符串的末尾42例StringEditor.java:已知一个字符串,返回将字符串中的非字母字符都删除后的字符串例SbufferTest.java: StringBuffer 类常用方法的使用4310.1.4 数学类(math)数学类提供一组常量和数学函数,例如E和PI常数求绝对值的abs方法计算三角函数的sin方法和cos方法求最小值、最大值的min方法和max方法求随机数的random方法等其中所有的变量和方法都是静态的(static)是终结类(final),不能从中派生其他的新类4410.1.5系统和运行时类System、RuntimeSystem类访问系统资源arraycopy() 复制一个数组exit() 结束当前运行的程序currentTimeMillis() 获得系统当前日期和时间等访问标准输入输出流System.in 标准输入,表示键盘System.out 标准输出,表示显示器45Runtime类可直接访问运行时资源totalMemory() 返回系统内存总量freeMemory() 返回内存的剩余空间4610.1.6类操作类(Class、ClassLoader)Class类提供运行时信息,如名字、类型以及父类Object类中的getClass方法返回当前对象所在的类,返回类型是Class它的getName方法返回一个类的名称,返回值是String它的getSuperclass方法可以获得当前对象的父类ClassLoader类提供把类装入运行时环境的方法4710.2java.util (实用包)实用包(java.util)实现各种不同实用功能日期类:描述日期和时间DateCalendarGregorianCalendar48集合类Collection(无序集合)、Set(不重复集合)List(有序不重复集合)、Enumeration(枚举)LinkedList(链表)、Vector(向量)Stack(栈)、Hashtable(散列表)、TreeSet(树)StringTokenizer类允许以某种分隔标准将字符串分隔成单独的子字符串4911、类的访问控制Java提供了访问权限修饰词,以供开发人员向客户端程序员指名哪些是可用的,哪些是不可用的。访问权限控制的等级,从最大权限到最小权限依次为:public, public, protected, protected, 包访问权限(没有关键字),包访问权限(没有关键字),privateprivate.50Java访问权限修饰符poublicpoublic,protectedprotected以及privateprivate都置于类中每个成员的定义之前无论它们是一个数据成员,还是一个方法。每个访问权限修饰符都只对它后面修饰的特定定义有效,这与C+存在着显著不同。在C+中,访问权限修饰符控制着它后面的所有定义,直到又一个访问权限修饰符出现。Java,C+访问权限修饰符的区别51类的访问控制只有public(公共类)及无修饰符(默认类)两种。默认访问权限没有任何关键字,通常指包访问权限,即当前包中所有其他类对那个成员都有访问权限,但对于包以外的所有类,这个成员都是private。访问权限符与访问能力之间的关系如表类型无修饰public同一包中的类同一包中的类yesyes不同包中的类不同包中的类noyes52类成员的访问控制公有(public)可以被其他任何对象访问(前提是对类成员所在的类有访问权限) 保护(protected)只可被同一类及其子类的实例对象访问私有(private)只能被这个类本身访问,在类外不可见默认(default)仅允许同一个包内的访问;又被称为“包(package)访问权限”53当一个类可以被访问时,对类内的成员变量和成员方法而言,其应用范围可以通过施以一定的访问权限来限定。 同一个类中同一个类中同一个包中同一个包中不同包中的不同包中的子类子类 不同包中的不同包中的非子类(任非子类(任意类)意类)privateDefaultProtectedPublic54public 接口访问例子:/Student.javapackage mypackage.school; public class Student public Student() System.out.println(“Student constructor); void foo() System.out.println(foo); /55创建一个使用的程序:/: 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对象,因为它的构建方法是public的,而且类也是public的,然而,foo()成员不可在Cun.java内访问,因为foo()只有在mypackage.school包内才是可以访问的。56private: private: 例子例子/: /: IceCream.javaIceCream.java / Demonstrates private keyword / 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 Sundae(); Sundae x = Sundae.makeASundae(); /不能通过构建不能通过构建方法创建一个方法创建一个Sundae对象;对象;相反,必须调用相反,必须调用makeASundae()方法来实现方法来实现5712、Javadoc-Java文档生成器-参考ThinkingInJava2.8.1Javadoc 是用于提取注释的工具,能从java源文件中读取 格式为:/*/*/*/的注释,并能识别注释中用标识的一些特殊变量,制作成HtmlHtml格式的类说明文档。 javadoc不但能对一个java源文件生成注释文档,而且能对目录和包生成交叉链接的html格式的类说明文档,十分方便。58Javadoc可以为类,接口,方法,变量添加注释。Javadoc只能为publicpublic和protectedprotected成员进行文档的注释,private及包内访问权限成员的注释会被忽略。生成的文档为htmlhtml文件,可通过浏览器查看。59Javadoc注释由Javadoc标签(tag)和描述性文本组成 例如:/ * * see javadoc.tool.Car* version 1.0, 2005-04-12* author grace * since JDK1.3*/60标签标签 说明说明 author author 作者作者作者标识作者标识version version 版本号版本号 版本号版本号 paramparam 参数名参数名 描述描述 方法的入参名及描述信息,如入参有特别要方法的入参名及描述信息,如入参有特别要求,可在此注释。求,可在此注释。 return return 描述描述 对函数返回值的注释对函数返回值的注释 deprecated deprecated 过期文过期文本本 标识随着程序版本的提升,当前标识随着程序版本的提升,当前APIAPI已经过已经过期,仅为了保证兼容性依然存在,以此告之期,仅为了保证兼容性依然存在,以此告之开发者不应再用这个开发者不应再用这个APIAPI。 throwsthrows异常类名异常类名 构造函数或方法所会抛出的异常。构造函数或方法所会抛出的异常。 exception exception 异常类异常类名名 同同throwsthrows。 see see 引用引用 查看相关内容,如类、方法、变量等。查看相关内容,如类、方法、变量等。 since since 描述文本描述文本 APIAPI在什么程序的什么版本后开发支持。在什么程序的什么版本后开发支持。 linklink包包. .类类# #成员成员 标签标签 链接到某个特定的成员对应的文档中。链接到某个特定的成员对应的文档中。 61
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号