




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1大家好1大家好第一章Java语言概述华中科技大学IBM技术中心2008第一章Java语言概述华中科技大学IBM技术中心200833445566Java程序相关问题——Java虚拟机Java虚拟机——在真实机器中用软件模拟实现的一种抽象的机器。(Java虚拟机规范)Java虚拟机主要由五个部分组成:指令系统、寄存器、栈、存储区、碎片回收区解释和执行Java程序编译后产生的字节码
7Java程序相关问题——Java虚拟机Java虚拟机——在真Java程序相关问题——JavaAPIJavaAPI是Java系统提供的预先定义好的软件组件的集合,它们提供了许多可供程序员调用的常用功能丰富的API为程序员提供了极大的方便,但也是学习的难点要学会使用JavaAPI手册(TheJava
2PlatformAPISpecification)
8Java程序相关问题——JavaAPIJavaAPI是JJava程序相关问题——Java程序的运行机制操作系统源代码可执行代码目标码编译连接运行源代码字节码编译解释执行Java解释器传统语言的运行机制Java语言的运行机制9Java程序相关问题——Java程序的运行机制操作系统源代Java程序相关问题——Java程序类型
Java应用程序(JavaApplication)是独立完整的程序在命令行调用独立的解释器软件即可运行主类必须有main方法,这也是程序的入口Java小程序JavaApplet——是指在客户端运行的Java小程序,一般来说客户端是指用户所使用的浏览器
JavaServlet——是在服务器端执行的Java小程序,为了能够支持Servlet的运行,服务器端必须安装包含Java虚拟机的服务器软件,这种能够支持服务端小程序的服务器一般被称为应用服务器10Java程序相关问题——Java程序类型Java应用程序(Java开发环境JDK/J2SDK(JavaDeveloperKit)JDK1.02JDK1.1.xJDK1.2/J2SDK1.3/J2SDK1.4/JDK5.0(J2SDK1.5)Java集成开发环境(IDE)NetBeansJBuilderEclipseJCreatorForteforJavaVisualJ++WSAD……11Java开发环境JDK/J2SDK(JavaDevelopJDK的安装与设置从可以下载相关版本的JDK(本课程采用J2SDK1.3以上版本)在Windows平台上运行安装程序,以安装JDK设置PATH(文件路径)参数。由于JDK提供的实用程序都在安装目录下的子目录bin下,为了能在任何目录下直接使用文件名调用这些程序,必须设置操作系统的文件路径参数
12JDK的安装与设置从可以下载相关版本的JDK(本课程采用J环境设置在Windows环境下,为了快速进入指定目录的命令行窗口,可在注册表中增加项目:[HKEY_CLASSES_ROOT\Directory\shell\进入命令行\command]默认值设为:cmd/k"cd%1"13环境设置在Windows环境下,为了快速进入指定目录的命令行JDK的目录结构bin目录中包含了所有JDK5.0提供的实用程序demo目录中包含了JDK5.0自带的实例程序inculde目录中包含了一些支持Javanative方法的C\C++头文件jre目录中包含了Java运行环境所需的所有文件,这个目录中所包含的java运行环境是JDK私有的,它只为JDK的实用程序提供支持lib目录中包含了Java开发环境所需的库文件,它们以jar文件的形式保存sample目录中包含的是体现JDK5.0新特性的一些例程14JDK的目录结构bin目录中包含了所有JDK5.0提供的实用JDK实用程序简介javac:Java编译器,将Java源代码编译为字节码;java:Java解释器,用来解释执行Java程序的字节码文件;appletviewer(小程序浏览器):一种执行HTML文件上的Java小程序类的Java浏览器;javadoc:根据Java源代码与其说明语句生成的HTML文档;jdb:Java调试器,可以逐行地执行程序、设置断点和检查变量;javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件;javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。15JDK实用程序简介javac:Java编译器,将Java源代Java程序的开发过程
编辑源代码编译源代码文件运行程序16Java程序的开发过程16Java程序的开发过程——编辑源代码一般情况下,我们可以使用系统平台下的任何文本编辑器进行源代码的编辑,在Windows平台下常用的是Window系统自带的“记事本”程序或“写字板”程序Java源码大小写敏感Java源码文件的扩展名:.javaJava源程序文件也不能随意命名,其文件名必须与程序中主类的类名完全相同,包括大小写在内publicclassMyFirstJavaApp{publicstaticvoidmain(String[]args){System.out.println(“ThisisMyFirstJavaApplication!”);}}17Java程序的开发过程——编辑源代码一般情况下,我们可以使用Java程序的开发过程——编译源代码使用JDK实用程序javac对源代码文件进行编译C:\MyJava>javacMyFirstJavaApp.java如果系统提示符再次出现并且没有任何消息产生,那么编译便成功了如果有系统报错消息产生,则表示程序编译出错,程序员必须阅读报错信息,并根据这些信息对程序进行修改程序成功编译后,在与源代码文件同一目录下会生成一个新的文件,其文件名与源代码文件名相同,扩展名为“.class”。这个文件就是源代码文件编译产生的程序字节码文件
MyFirstJava.class18Java程序的开发过程——编译源代码使用JDK实用程序javJava程序的开发过程——运行程序
要执行一个Java程序非常简单,只需在字节码文件所在目录下输入下列命令就可以了:java字节码文件名19Java程序的开发过程——运行程序要执行一个Java程序非Question?Question?第2章面向对象的编程概念华中科技大学IBM技术中心2006第2章面向对象的编程概念华中科技大学IBM技术中心2002222面向对象vs.面向过程面向对象(OOP)——Object-OrientedProgramming用类class封装数据以与与数据相关的操作用类的继承性来实现类的重用性多态性面向“对象”,由对象提供服务面向过程(POP)——Procedure-OrientedProgramming以功能为组织单元通过数据结构来描述具体的问题数据在功能(函数)之间以参数的形式被传送23面向对象vs.面向过程面向对象(OOP)——Object现实世界中的对象现实世界是由对象构成的现实世界中任何实体都可以看作是对象现实世界中的对象有两个共同特征:状态行为24现实世界中的对象现实世界是由对象构成的2425252626272728282929消息的性质同一对象可接收不同形式的多个消息,产生不同的响应同一个消息可以发给不同的对象,所做出的响应可以截然不同发送方不需要知道接受方如何对请求予以响应的30消息的性质同一对象可接收不同形式的多个消息,产生不同的响应33131实例(Instance)定义:特定类所描述的一个具体对象32实例(Instance)定义:特定类所描述的一个具体对象3233333434单重继承与多重继承单重继承:一个子类只有一个唯一确定的父类单重继承所构成的类的关系结构是一棵树多重继承:一个子类可以有多个不同的父类多重继承所构成的类的关系结构是一个格Java语言仅支持单重继承35单重继承与多重继承单重继承:一个子类只有一个唯一确定的父类3继承的作用使软件系统具有开放性更好地进行抽象与分类实现代码的复用提高可维护性36继承的作用使软件系统具有开放性36类型(Type)在面向数值的编程中,类型通常用作数据的表示。在Java这样的强类型语言中,在编译期,每一个变量和表达式都有一个类型与之相对应Java中的类型:基本类型、类、接口37类型(Type)在面向数值的编程中,类型通常用作数据的表示。接口(Interface)接口和类一样也是一种类型,也同样包含一些方法的定义。但与类不同的是:接口中所定义的所有方法都是抽象方法(即没有实现的方法)。接口中所定义的方法由实现(implement)该接口的类来实现,一个类可以同时实现多个接口接口机制使Java的面向对象编程变得更加灵活。解决了单重继承带来的问题接口定义了对象的行为模型,相当于一个协议。实现接口的各个类负责实现接口所定义的行为。虽然实现细节各不相同,但对用户来说是一样的行为。38接口(Interface)接口和类一样也是一种类型,也同样包面向对象的示例本例中包含很多对象:点、窗口、颜色、点击事件……
代码:ClickMeApp.java,ClickMe.java,Spot.java39面向对象的示例本例中包含很多对象:点、窗口、颜色、点击事件…Spot类publicclassSpot{//instancevariablesprivateintsize;publicintx,y;
//constructorpublicSpot(){x=-1;y=-1;size=1;}//methodsforaccesstothesizeinstancevariablepublicvoidsetSize(intnewSize){if(newSize>=0){size=newSize;}}publicintgetSize(){returnsize;}}40Spot类publicclassSpot{40Spot对象privateSpotspot=null;...spot=newSpot();
41Spot对象privateSpotspot=null示例中的消息g2d.setColor(Color.WHITE);g2d.fillRect(0,0,getWidth()-1,getHeight()-1);
42示例中的消息g2d.setColor(Color.WHITE示例中的继承和接口publicclassClickMeextendsJComponentimplementsMouseListener{...}
publicclassClickMeextendsJComponentimplementsMouseListener{...//MethodsrequiredbytheMouseListenerinterface.publicvoidmousePressed(MouseEventevent){if(spot==null){spot=newSpot();spot.setSize(RADIUS);}spot.x=event.getX();spot.y=event.getY();repaint();}publicvoidmouseClicked(MouseEventevent){}publicvoidmouseReleased(MouseEventevent){}publicvoidmouseEntered(MouseEventevent){}publicvoidmouseExited(MouseEventevent){}}
}
43示例中的继承和接口publicclassClickMe欢迎提问Question!欢迎提问Question!第三章Java语言基础华中科技大学IBM技术中心第三章Java语言基础华中科技大学IBM技术中心变量(Variable)
对象将它的状态存储在变量中定义:
变量是一个由标识符命名的数据项变量名必须是一个合法的标识符
--一个以字母开头的无限制的Unicode字符序列。变量的声明:类型名称[=初始值];inti;doublepi=3.1415926;Stringname;46变量(Variable)对象将它的状态存储在变量中46数据类型
每个变量都必须有一个数据类型.一个变量的数据类型决定了它能容纳的值和在它上面可以进行什么操作。Java编程语言有两大类数据类型:原始类型(primitive)
引用类(reference)47数据类型每个变量都必须有一个数据类型.一个变量的数据类型4848原始类型变量包含单个值,其大小和格式与它的类型匹配:数字、字符或布尔值。Java语言没有unsigned类型0xFFFF和0xFF谁大?Java语言必须强制类型转换floatf=0.1;booleanb=1;原始类型
49原始类型变量包含单个值,其大小和格式与它的类型匹配:数字、字引用类型数组,类和接口就是引用数据类型.与原始类型变量的值不同的是,引用类型变量的值是对应变量代表的一个值或一组值的引用(也就是其地址)在其他语言里引用被称为指针或者内存地址。Java不支持显示地使用地址,而是使用变量的名称代替。50引用类型数组,类和接口就是引用数据类型.与原始类型变量的值不变量的引用
通过变量名引用变量的值简单名称:由单个标识符组成的名称限定名称:通过类名或对象名引用改类或对象中的成员变量System.out.println(i+spot.x);51变量的引用通过变量名引用变量的值51作用范围
变量的作用范围是可以通过简单名称引用该变量的程序区域作用范围也决定了系统为该变量创建和释放内存的时间52作用范围变量的作用范围是可以通过简单名称引用该变量的程序区例子
inti=10;if(i>0){inti=20;System.out.println(“Thevalueofi=”+i);}System.out.println(“Thevalueofi=”+i);53例子inti=10;53最终变量
你可以在任意范围里将一个变量定义为最终变量(final)最终变量的值一经初始化就不能改变类似于C语言中的常量(const)finalintaFinalVar=0;
finalintblankfinal;...blankfinal=0;54最终变量你可以在任意范围里将一个变量定义为最终变量(fin操作符、表达式、语句和块自学!55操作符、表达式、语句和块自学!55第四章对象基础和简单数据对象华中科技大学IBM技术中心第四章对象基础和简单数据对象华中科技大学IBM技术中心5757对象的生命周期58对象的生命周期58CreateObjectDeompublicclassCreateObjectDemo{publicstaticvoidmain(String[]args){//创建一个Point对象和两个Rectangle对象Pointorigin_one=newPoint(23,94);Rectanglerect_one=newRectangle(origin_one,100,200);Rectanglerect_two=newRectangle(50,100);//显示rect_one的宽、高以与面积System.out.println("Widthofrect_one:"+rect_one.width);System.out.println("Heightofrect_one:"+rect_one.height);System.out.println("Areaofrect_one:"+rect_one.area());rect_two.origin=origin_one;//设置rect_two的位置//显示rect_two的位置System.out.println("XPositionofrect_two:"+rect_two.origin.x);System.out.println("YPositionofrect_two:"+rect_two.origin.y);//移动rect_two并且显示它的新位置rect_two.move(40,72);System.out.println("XPositionofrect_two:"+rect_two.origin.x);System.out.println("YPositionofrect_two:"+rect_two.origin.y);}}59CreateObjectDeompublicclassC6060616162626363对象创建的实例publicclassPoint{publicintx=0;publicinty=0;publicPoint(intx,inty){this.x=x;this.y=y;}}Pointorigin_one=newPoint(23,94);64对象创建的实例publicclassPoint{Poi6565构造器的重载(Overload)publicclassRectangle{publicintwidth=0;publicintheight=0;publicPointorigin;publicRectangle(){origin=newPoint(0,0);}publicRectangle(Pointp){origin=p;}publicRectangle(intw,inth){this(newPoint(0,0),w,h);}publicRectangle(Pointp,intw,inth){origin=p;width=w;height=h;}…….}一个类可以包含多个构造器,这种情况成为构造器的重载同一个类中的多个构造器通过参数的数目与类型的不同来区分66构造器的重载(Overload)publicclassR6767实例成员与类成员实例成员包括实例变量与实例方法实例成员依赖于实例存在同一个类的不同实例都拥有一份实例变量的拷贝,对某个实例的实例变量的操作不影响到其它实例实例变量遵循对象的生命周期,随着对象的创建而创建,随着对象的消亡而消亡必须通过实例的引用来调用实例方法类成员包括类变量与类方法类成员不依赖于实例存在同一个类的不同实例共享同一个类变量,对类变量的改变会影响到所有实例类变量的生存期不依赖于对象,其它类可以不用通过创建该类的实例,直接通过类名访问它们。同样,类方法也可以直接通过类名访问。68实例成员与类成员实例成员包括实例变量与实例方法68实例成员与类成员classABCD{chardata;staticintshare_data;}classDemo{ABCDa,b,c,d;…//实例化}69实例成员与类成员classABCD{69实例变量的引用简单名称
当实例变量处在作用域内(即对象的类的代码内)的时候限定名称objectReference.variableName
当实例变量处在作用域外时使用限定名称System.out.println("Widthofrect_one:"+rect_one.width);System.out.println("Heightofrect_one:"+rect_one.height);intheight=newRectangle().height;70实例变量的引用简单名称System.out.println(关于变量访问的说明建议不要通过其它对象或类直接操作对象的变量,可能引起无效值理想情况下,类会提供一些方法,其他对象可以通过他们检查或修改变量,确保值有效,而且如果变量的类型和名称发生了变化,不会影响它的使用者在某些情况下,可以允许对对象变量的直接访问,以使类更小更简单,也可使变量适用于更广泛范围;JAVA编程语言提供了一个访问控制机制,通过这种机制,类可以决定那些其它的类可以直接访问它的变量(第五章中介绍)。71关于变量访问的说明建议不要通过其它对象或类直接操作对象的变量调用对象的方法使用限定名称来调用对象的方法 objectReference.methodName(argumentList);
或者 objectReference.methodName();
System.out.println("Areaofrect_one:"+rect_one.area());rect_two.move(40,72);intareaOfRectangle=newRectangle(100,50).area();72调用对象的方法使用限定名称来调用对象的方法System.o关于方法调用方法被声明为public,就可以被任何其它的类所访问。有时,类需要限制对它的方法的访问类可以使用与控制变量访问相同的机制来对它的方法进行访问控制(第五章中介绍)
73关于方法调用方法被声明为public,就可以被任何其它的类所对象的清除JAVA运行时环境在当对象不再被使用的时候清除它们,这个过程就是所谓的“垃圾收集”(garbagecollection)Java的垃圾收集器自动扫描对象的动态内存区,对被引用的对象加标记,然后把没有引用的对象作为垃圾收集起来并释放。垃圾收集器作为一个线程运行。当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行。否则垃圾收集器在系统空闲时异步地执行。74对象的清除JAVA运行时环境在当对象不再被使用的时候清除它们无用对象的判定当某个对象不在被任何引用变量引用时,该对象是无用对象,将被清除。一般有如下两种情况:引用变量超出了作用域{StringBuffers=newStringBuffer(“thisisatest”);……}//超出对象作用域……引用变量引用了其它对象或引用了空对象StringBuffers=newStringBuffer(“test1”);……s=newStringBuffer(“test2”);//引用了新的对象……s=null;//引用为空75无用对象的判定当某个对象不在被任何引用变量引用时,该对象是无finalize()方法在对对象进行垃圾收集前,Java运行时系统会自动调用对象的finalize()方法来释放系统资源。某些情况下,程序员可能需要实现该方法来释放不由垃圾收集器所控制的资源。但这种情况非常少见finalize()方法是在Object中有缺省实现,在用户自定义的类中,它可以被覆盖,但一般在最后要调用父类的finalize()方法来清除对象所使用的所有资源76finalize()方法在对对象进行垃圾收集前,Java运行问题一下列程序的运行结果?publicclassSomethingIsWrong{publicstaticvoidmain(String[]args){RectanglemyRect;myRect.width=40;myRect.height=50;System.out.println("myRect'sareais"+myRect.area());}}77问题一下列程序的运行结果?publicclassSome问题二现有一个Point和Rectangle对象,代码执行后有多少引用指向它们?有没有对象需要垃圾收集?Pointpoint=newPoint(2,4);Rectanglerectangle=newRectangle(point,20,20);point=null;78问题二现有一个Point和Rectangle对象,代码执行后字符和字符串JavaAPI提供了三个处理字符数据的类:Character:这个类的实例可以容纳单一的字符数值。该类还定义了一些简洁的方法来操作或者检查单一字符数据。String:这个类用于处理由多个字符组成的不可变数据。StringBuffer:这个类用于存储和操作由多个字符组成的可变数据。79字符和字符串JavaAPI提供了三个处理字符数据的类:79字符类(Character)字符类的对象包含单个字符值当需要使用对象时,可以用字符对象替代原始的char类型的变量80字符类(Character)字符类的对象包含单个字符值80字符类——构造器和方法Character(char)-Character类唯一的构造器,它创建一个字符对象,其中包含由参数提供的值,一旦创建了Character对象,它包含的值就不能改变。compareTo(Character)-这个实例方法比较两个字符对象包含的值,这个方法返回一个整数值,表示当前对象中的值是大于、等于还是小于参数所包含的值81字符类——构造器和方法Character(char)-Cha字符类——构造器和方法equals(Object)-这个实例方法比较当前对象包含的值与参数对象包含的值,如果两个对象包含的值相等,那么这个方法返回truetoString()-这个实例方法将此对象转换为字符串charValue()-这个实例方法以原始char值的形式返回此字符对象包含的值isUpperCase()-这个实例方法判断一个原始char值是否是大写字母82字符类——构造器和方法equals(Object)-这个实例字符类——例程publicclassCharacterDemo{publicstaticvoidmain(Stringargs[]){Charactera=newCharacter('a');Charactera2=newCharacter('a');Characterb=newCharacter('b');intdifference=pareTo(b);if(difference==0){System.out.println("aisequaltob.");}elseif(difference<0){System.out.println("aislessthanb.");}elseif(difference>0){System.out.println("aisgreaterthanb.");}System.out.println("ais"+((a.equals(a2))?"equal":"notequal")+"toa2.");System.out.println("Thecharacter"+a.toString()+"is"+(Character.isUpperCase(a.charValue())?"upper":"lower")+"case.");}}程序的输出:aislessthanb.aisequaltoa2.Thecharacteraislowercase.83字符类——例程publicclassCharacterD字符类——类方法84字符类——类方法84问题Charactera=newCharacter('a');Characterb=newCharacter('a');下列boolean表达式的值是true还是false?(1)pareTo(b)==0(2)a.equals(b)(3)a==b85问题Charactera=newCharacter(字符串和字符串缓冲区Java平台提供两个类String和StringBuffer,它们用于存储和操作字符串-由多个字符组成的字符数据。String类用于其值不能改变的字符串;StringBuffer类用于被修改的字符串,通常用来动态的构造字符数据。字符串是常量,比字符串缓冲区更高效,而且字符串可以被共享。86字符串和字符串缓冲区Java平台提供两个类String和St字符串(String)使用字符串常量时,需要创建String对象,和其它对象不同,String对象可以通过简单赋值语句创建:Stringname=“Petter”;此外,也可根据String类的构造函数创建String对象:Stringname=newString(“Petter”);对于程序任何位置出现的双引号标记的字符串,系统都会自动创建一个String对象。可通过String对象的方法对字符串进行操作87字符串(String)使用字符串常量时,需要创建String字符串——构造器88字符串——构造器88字符串的不可变性?String类用于其值不能改变的字符串观察下列程序:publicclassStringTest{publicstaticvoidmain(String[]args){Strings="abc";s=s+“defg";System.out.println(s);}}程序运行结果是abc还是abcdefg?89字符串的不可变性?String类用于其值不能改变的字符串pu9090字符串缓冲区(StringBuffer)String对象表示的是不可更改的字符串对象,如果需要修改String对象所表示的内容,必须重新创建一个对象:Stringstr=“Petter”;str=str+“&Bob”+“&Tom”;当修改操作频繁,或字符串的值很大时,会额外分配大量内存因此,Java语言引入了一个StringBuffer类,用来表示内容可以扩充和修改字符串对象91字符串缓冲区(StringBuffer)String对象表示StringBuffer——构造器必须使用new操作符创建字符串缓冲区Strings="DotsawIwasTod";StringBufferdest=newStringBuffer(s);92StringBuffer——构造器必须使用new操作符创建字访问器方法用于获取关于对象的信息的方法被称为访问器方法。字符串和字符串缓冲区都可以使用的一个访问器方法就是length方法。length方法返回字符串和字符串缓冲区中包含的字符数。Stringpalindrome="DotsawIwasTod";intlen=palindrome.length();93访问器方法用于获取关于对象的信息的方法被称为访问器方法。St容量在StringBuffer类中还有一个capacity()方法,它返回分配给这个字符串缓冲区的容量,而不是使用量。使用量会改变,但是容量始终是不变的。94容量在StringBuffer类中还有一个capacity(通过索引得到字符charAt()访问器方法,通过索引从字符串或者字符串缓冲区得到字符,索引值从零开始。StringanotherPalindrome="Niagara.Oroaragain!";charaChar=anotherPalindrome.charAt(9);95通过索引得到字符charAt()访问器方法,通过索引从字符串substring方法如果要从字符串或者字符串缓冲区得到多个字符,可以使用substring方法。Stringsubstring(int)Stringsubstring(int,int)StringanotherPalindrome="Niagara.Oroaragain!";Stringroar=anotherPalindrome.substring(11,15);96substring方法如果要从字符串或者字符串缓冲区得到多个searchstring类提供两个访问器方法,返回特定的字符或者子字符串在字符串中的位置。indexOf()方法从字符串的开头查找;lastindexOf()方法从字符串的末尾查找;stringBuffer类不支持indexOf()和lastindexOf()方法。97searchstring类提供两个访问器方法,返回特定的字符search98search98searchexamplepublicclass{privateStringfullPath;privatecharpathSeparator,extensionSeparator;public(Stringstr,charsep,charext){fullPath=str;pathSeparator=sep;extensionSeparator=ext;}publicStringextension(){intdot=fullPath.lastIndexOf(extensionSeparator);returnfullPath.substring(dot+1);}publicString(){intdot=fullPath.lastIndexOf(extensionSeparator);intsep=fullPath.lastIndexOf(pathSeparator);returnfullPath.substring(sep+1,dot);}publicStringpath(){intsep=fullPath.lastIndexOf(pathSeparator);returnfullPath.substring(0,sep);}}99searchexamplepublicclass{9searchexamplepublicclass{publicstaticvoidmain(String[]args){myHomePage=new("/home/mem/index.html",'/','.');System.out.println("Extension="+myHomePage.extension());System.out.println("="+myHomePage.());System.out.println("Path="+myHomePage.path());}}程序输出:Extension=html=indexPath=/home/mem100searchexamplepublicclass{程比较字符串和字符串缓冲区101比较字符串和字符串缓冲区101操作字符串102操作字符串102修改字符串缓冲区103修改字符串缓冲区103数字类Number类与其子类主要用于处理数字Number类的对象包含了原始类型的数值并且提供了一些有用的变量和方法,用于对数值进行处理104数字类Number类与其子类主要用于处理数字104类型包装器类(Type-Wrapperclass)数字类、Boolean、Character和void类统称为类型包装器类在需要对象的地方,可将原始类型的值存储在类型包装器对象中这些类定义了一些有用的变量,提供关于数据类型的一般信息这些类还定义了一些有用的方法,用于将值转换为其他类型、转换为字符串等等这些类用于反射,反射这种java机制允许程序收集关于JVM中任何对象或类的信息此外,BigInteger和BigDecimal还扩展了原始数据类型105类型包装器类(Type-Wrapperclass)数字类、例程publicclassNumberDemo{publicstaticvoidmain(Stringargs[]){FloatfloatOne=newFloat(14.78f-13.78f);FloatfloatTwo=Float.valueOf("1.0");DoubledoubleOne=newDouble(1.0);intdifference=floatOpareTo(floatTwo);if(difference==0){System.out.println("floatOneisequaltofloatTwo.");}elseif(difference<0){System.out.println("floatOneislessthanfloatTwo.");}elseif(difference>0){System.out.println("floatOneisgreaterthanfloatTwo.");}System.out.println("floatOneis“+((floatOne.equals(doubleOne))?"equal":"notequal")+"todoubleOne.");}}floatOneisequaltooneAgain.floatOneisnotequaltodoubleOne.106例程publicclassNumberDemo{fl107107数组数组是一个固定长度的结构,它存储多个相同类型的值数组直接被JAVA语言所支持,所以没有一个数组类数组的长度在数组创建的时候就已经确定。数组元素就是数组中的一个数值,可以通过数组中的位置来访问它。108数组数组是一个固定长度的结构,它存储多个相同类型的值108创建数组声明一个引用变量来引用一个数组格式:type[]引用变量名
type引用变量名[](允许但不推荐)数组变量的声明并不创建数组创建一个数组使用new操作符显示地创建数组格式:newelementType[arraySize]数组初始化器可以使用简写的语法创建并初始化数组:type[]引用变量名={数组元素值…};
109创建数组声明一个引用变量来引用一个数组109使用数组访问数组元素引用变量名(数组名)[index]得到数组大小引用变量名(数组名).length110使用数组访问数组元素110例程publicclassArrayDemo{publicstaticvoidmain(String[]args){int[]anArray;anArray=newint[10];for(inti=0;i<anArray.length;i++){anArray[i]=i;System.out.print(anArray[i]+"");}System.out.println();}}111例程publicclassArrayDemo{111对象数组数组元素可以是基本类型也可以是引用类型当数组元素是引用类型时(也即数组元素为对象时需要注意:数组元素也必须要被创建和初始化Integer[]anArray=newInteger[5];for(inti=0;i<anArray.length;i++){System.out.println(anArray[i]);}112对象数组数组元素可以是基本类型也可以是引用类型Integer数组的数组数组的数组可以看作是“数组引用”的数组与对象数组一样,必须显示地在数组中创建子数组子数组的长度并不相同例:int[][]aMatrix=newint[4][];
……
aMatrix[1]=newint[5];
aMatrix[2]=newint[10];113数组的数组数组的数组可以看作是“数组引用”的数组113复制数组publicstaticvoidarraycopy(Objectsource,intsrcIndex,Objectdest,intdestIndex,intlength)114复制数组publicstaticvoidarrayco例程publicclassArrayCopyDemo{publicstaticvoidmain(String[]args){char[]copyFrom={'d','e','c','a','f','f','e', 'i','n','a','t','e','d'};char[]copyTo=newchar[7];System.arraycopy(copyFrom,2,copyTo,0,7);System.out.println(newString(copyTo));}}115例程publicclassArrayCopyDemo{问题publicclassWhatHappens{publicstaticvoidmain(String[]args){StringBuffer[]stringBuffers=newStringBuffer[10];for(inti=0;i<stringBuffers.length;i++){stringBuffers[i].append("StringBufferatindex"+i);}}}
116问题publicclassWhatHappens{1欢迎提问Question!欢迎提问Question!第六章接口和包华中科技大学IBM技术中心第六章接口和包华中科技大学IBM技术中心119119Java接口的引入Java语言只支持单重继承,它的程序中的类的层次结构是树状结构,在处理复杂问题时单重继承显得力不从心。为了使Java程序的类层次结构更加合理,更符合实际问题的需要,我们把用于完成特定功能的若干属性组织成相对独立的属性集合,这种属性的集合就是接口。120Java接口的引入Java语言只支持单重继承,它的程序中的类Java接口定义定义:接口是一个有名称的方法定义和常量定义的集合,但没有方法的实现。接口定义了一个行为协议,类层次结构中任何地方的任何类都可以实现.接口是由常量和抽象方法组成的特殊类:接口中的属性都是用final修饰的常量接口中的方法都是用abstract修饰的没有方法体的抽象方法。121Java接口定义定义:接口是一个有名称的方法定义和常量定义的Java语言的接口接口功能的真正实现是由实现接口的各个类来定义接口中各个抽象方法的具体方法体。Java语言通过接口实现了类间的多重继承功能。122Java语言的接口接口功能的真正实现是由实现接口的各个类来定Java接口实现多重继承单一继承指明了子类和父类的层次关系和各自
的行为。多重继承是指一个类有多个父类,这使得类的
层次关系不清楚。接口则把方法的定义同类的层次区分开来,通
过接口可以在运行中动态地定位所调用的方
法,同时一个类可以实现多个接口,使得接口
提供了比多重继承更简单、更灵活的功能。123Java接口实现多重继承单一继承指明了子类和父类的层次关系和接口vs抽象类接口不可以实现任何方法,而抽象类可以;类可以实现多个接口,但父类仅只有一个;接口和继承无关,不是类层次结构的一部分。无关的类可以实现相同接口。124接口vs抽象类接口不可以实现任何方法,而抽象类可以;1定义接口125定义接口125完整的接口定义规范126完整的接口定义规范126接口定义接口包括接口声明和接口体两部分:[public]interface接口名[extends父接口名列表]{[public][static][final]类型变量名=常量值;[public][abstract][native]返回值类型方法名(参数列表)[throws异常列表];}publicinterfaceMyInterface{intMAXSIZE=1024;publicabstractmyMethod(Stringname);}127接口定义接口包括接口声明和接口体两部分:publicint接口定义的说明声明接口的关键字interface引导着所定义的接口名字(符合Java标识符规定);声明接口也需要给出访问控制符;接口具有继承性,通过关键字extends声明该新接口是某父接口的派生接口;一个接口可以有多个父接口,它们之间用逗号分隔,形成父接口列表。
128接口定义的说明声明接口的关键字interface引导着所定义接口体的说明接口体的定义有两个部分:对接口中属性的声明对接口中方法的声明;系统默认:接口中的所有属性都是public,static和final(公共,静态和最终);系统默认:接口中的所有方法都是public和abstract(公共和抽象);接口中方法的方法体可用Java语言书写,也可用其它语言书写(加native修饰)。129接口体的说明接口体的定义有两个部分:129实例定义一个股票监视器。一旦股票价格变化,立即通知观察者watcher。Watcher是一个接口,它只有一个方法,valueChanged知道股票变化的类必须实现此方法。从而必须实现StockWatcher接口不仅仅是StockMointer的超类,其它类只要实现此接口,就可以享受股票价格变化通知服务。publicclassStockMonitor{publicvoidwatchStock(StockWatcherwatcher,StringtickerSymbol,doubledelta){}}130实例定义一个股票监视器。一旦股票价格变化,立即通知观察者wa实现接口具体地实现接口所规定的功能,需要某个类为接口中的所有抽象方法编写实在的方法体。在类的声明(定义)中用implements关键字说明该类将要实现哪些接口;如果实现某个接口的类不是abstract的抽象类,则在类的定义部分必须为所有抽象方法定义具体方法体,方法头部分应该与接口中的定义完全一致;131实现接口具体地实现接口所规定的功能,需要某个类为接口中的所实现接口如果实现某接口的类是abstract的抽象类,则在类的定义部分可以不具体实现接口中的所有方法;一个类在实现某个接口的抽象方法时,必须使用完全相同的方法声明。接口的抽象方法访问修饰符为public,所以,类在实现方法时必须使用修饰符public,否则,系统将警告;因为缩小了接口中定义的方法的访问控制范围。132实现接口如果实现某接口的类是abstract的抽象类,则在类实例publicclassStockAppletextendsAppletimplementsStockWatcher{...publicvoidvalueChanged(StringtickerSymbol,doublenewValue){if(tickerSymbol.equals(sunTicker)){...}elseif(tickerSymbol.equals(oracleTicker)){...}elseif(tickerSymbol.equals(ciscoTicker)){...}}}133实例publicclassStockAppletext接口功能不能简单扩大例如:要加个报股价的方法在接口里,此时所有实现它的类不能正常工作。publicinterfaceStockWatcher{finalStringsunTicker="SUNW";finalStringoracleTicker="ORCL";finalStringciscoTicker="CSCO";voidvalueChanged(StringtickerSymbol,doublenewValue);voidcurrentValue(StringtickerSymbol,doublenewValue);}134接口功能不能简单扩大例如:要加个报股价的方法在接口里,此时所用继承来扩大接口如果需要增加接口的功能,可以利用继承来实现:publicinterfaceStockTrackerextendsStockWatcher{voidcurrentValue(StringtickerSymbol,doublenewValue);}135用继承来扩大接口如果需要增加接口的功能,可以利用继承来实现:问题实现java.util.Iterator接口的类必须实现哪些方法?Next,hasnextandremove下面的接口有什么错误?publicinterfaceSomethingIsWrong{publicvoidaMethod(intaValue){System.out.println("HiMom");}}136问题实现java.util.Iterator接口的类必须实现问题如何更正上面接口的错误?下面的接口是正确的吗?publicinterfaceMarker{}137问题如何更正上面接口的错误?publicinterfaceJava语言的包引入的原因:容易找到和使用类避免名称冲突控制访问定义:包是一个相关的类和接口的集合,它可以提供访问保护和名称空间管理。
138Java语言的包引入的原因:138Java语言的包Java平台中的类和接口是各种包的成员,这些类和接口是按照功能绑定的;例如:基本的类在java.lang中;再例如:用于输入和输出的类在java.io中。139Java语言的包Java平台中的类和接口是各种包的成员,这些Java语言的包包是一种松散的类的集合,通常把需要在一起工作的类(互相访问)放入一个包。在Java语言程序设计中,通常需要定义许多类;就像利用“文件夹”把许多文件组织在一起,使硬盘管理的文件更清晰、更有条理一样;Java利用“包”把一些需要在一起操作的类组织在一起,以便程序员更好地管理操作这些类。140Java语言的包包是一种松散的类的集合,通常把需要在一起工作无名包系统自动建立“无名包”,也就是默认包或缺省包在缺省情况下,系统会为每一个(.java)源文件创建一个无名(noname)包,这个源文件中定义的所有类都隶属于这个无名包,它们之间可以相互引用非private(私有)的域或方法;无名包中的类不能被其它包中的类所引用或复用。141无名包系统自动建立“无名包”,也就是默认包或缺省包141无名包缺省包一般只用于临时程序或测试程序.建议在实际系统开发中,为每个类指定有名的包。Java使用文件系统来存储包,包的名称必须和程序文件所在目录名完全一样(大小写敏感)。如果定义了一个多级结构的包,其结构也必须和文件系统的目录结构完全一致。142无名包缺省包一般只用于临时程序或测试程序.142有名包创建有名包的语句格式为package<包名>;语句功能:该语句将创建一个具有指定名字的包,该包将把当前.java文件中的所有类集合到这个包内。创建有名包,应该先创建一个子文件夹(同包名)以便存放当前.java文件和对应的.class文件。143有名包创建有名包的语句格式为143有名包例如:packagecardclasses;
该语句是将当前类置于包cardclassess中,需要在当前文件夹下创建一个名为cardclasses的子文件夹。再例如:packagecardsystem.cardclasses;
该语句将当前类置于cardsystem.cardclasses中,需要在当前文件夹下创建子文件cardsystem并在cardsystem下再创建的子文件cardclasses,当前类存放在这个文件夹里。144有名包例如:packagecardclasses;144使用包成员只有公共的包成员可以从定义它们的包外访问,要从包外访问公共的包成员,必须采用以下的方法:用成员的限定名引用;导入包成员;导入成员所属的整个包。145使用包成员只有公共的包成员可以从定义它们的包外访问,要从包外使用包成员使用包名作为类名前缀:java.util.Vectorvc=newjava.util.Vector()加载需要使用的类importjava.util.Vector;
……Vectorvc=newVector();146使用包成员使用包名作为类名前缀:146使用包成员加载整个包importjava.util.*;
……Vectorvc=newVector();消除名称的二义性使用成员的限定名;使用环境变量classpathsetclasspath=……javac–classpath……MyClass.javajava–classpath……MyClass147使用包成员加载整个包147使用包成员在使用import语句的时候,可以使用通配符一次导入一个包中的所有类,如:importjava.util.*;这样,我们在使用java.util包中的任何类时,就可以直接使用简单类名。需要注意的是,import语句要么导入一个类,要么导入一个完整包。不能使用通配符标记包的子集或多个包,下面三条语句均无法通过编译:importjava.applet.A*;importjava.*.*;importjava.*.io;148使用包成员在使用import语句的时候,可以使用通配符一次导使用包成员为了简化代码,Java语言规定在以下情况时无需使用import语句导入包:使用缺省包中的类使用java.lang包中的类使用和当前类在同一个包中的其他类149使用包成员为了简化代码,Java语言规定在以下情况时无需使用管理源代码文件将类或者接口的源代码放在一个文本文件中,文件名为类或者接口的简单名;将源代码文件放在一个目录中,目录名反映的是类或者接口所属的包的名称。例如:150管理源代码文件将类或者接口的源代码放在一个文本文件中,文件名管理源代码文件包成员的限定名称与文件的路径是对应的,它们的对应关系为:151管理源代码文件包成员的限定名称与文件的路径是对应的,它们的对管理类文件与源代码文件一样,字节码文件也可以通过包来进行管理;字节码文件不必和源代码文件位与相同的目录中,可以单独管理;这样做的目的可以隐藏源代码文件。152管理类文件与源代码文件一样,字节码文件也可以通过包来进行管理类路径定义:类路径是一个目录或zip文件的有序列表,用于搜索类文件。类路径中列出的每个目录都是包含包目录的顶层目录,编译器和解释器可以根据类的包名称和类名从顶层目录开始构造路径的其余部分。例如:上图所示的目录结构的类路径项目包含classes,但是不包含com或者com以下的任何目录,编译器和解释器用.class文件的完整包名构造它的路径名。153类路径定义:类路径是一个目录或zip文件的有序列表,用于搜索问题假设你已经写了一些类,并且需要将这些类放进三个包中,如下所示:为了将这些类放到正确的包中,需要在每个源代码中增加什么代码?154问题假设你已经写了一些类,并且需要将这些类放进三个包中,如下问题InClient.javaadd:pac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025个人房屋借款合同(16篇)
- 五月的夜晚 (教学设计)-2024-2025学年人教版(2012)音乐六年级上册
- 2025养老院志愿者服务活动总结(4篇)
- 班长竞选演讲稿500字范文(15篇)
- 2025年银行职员工作总结范文(19篇)
- 统整“在线沟通交流方式”单元教学锻炼学生信息关键能力
- 学期年度工作计划模板汇编(10篇)
- 小学二年级下册德育工作总结(4篇)
- 北京市装修合同范文(5篇)
- 小学科学大象版 (2017)一年级上册3 不一样的豆子教学设计
- 湖北省武汉市2025届高中毕业生四月调研考试语文试卷及答案(武汉四调)
- 2025-2030中国汽车金融行业市场深度调研及发展策略与投资前景研究报告
- 2025年铁路车辆钳工(高级)职业技能鉴定参考试题库(含答案)
- 跨越高原勇敢前行 课件 2025届高考学习的高原期主题班会
- 2025年中国共青团入团团员必知知识考试题与答案
- 2024年郑州铁路职业技术学院单招职业倾向性测试题库必考题
- 2025年山东省济南市平阴县中考一模英语试题(原卷版+解析版)
- 移动业务代办协议书
- 2025年CSCO胃癌诊疗指南解读
- 2025届广东省高三一模生物学试卷(原卷版+解析版)
- 成人脑室外引流护理-中华护理学会团体 标准
评论
0/150
提交评论