JAVA语言入门.doc_第1页
JAVA语言入门.doc_第2页
JAVA语言入门.doc_第3页
JAVA语言入门.doc_第4页
JAVA语言入门.doc_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

JAVA语言入门 独孤求败整理JAVA语言入门(独孤求败二零零四年二月一日整理于深圳市南山区)第一章 Java语言的产生及其特点1.1 Java产生的历史与现状1.1.1 Java产生的历史Java来自于Sun公司的一个叫Green的项目,其原先的目的是为家用消费电子产品开发一个分布式代码系统,这样我们可以把E-mail发给电冰箱、电视机等家用电器,对它们进行控制,和它们进行信息交流。开始,准备采用C+,但C+太复杂,安全性差,最后基于C+开发一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾依此投标一个交互式电视项目,但结果是被SGI打败。可怜的Oak几乎无家可归,恰巧这时MarkArdreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编制了HotJava浏览器,得到了Sun公司首席执行官ScottMcNealy的支持,触发了Java进军Internet。Java的取名也有一趣闻,有一天,几位Java成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一个人灵机一动说就叫Java怎样,得到了其他人的赞赏,于是,Java这个名字就这样传开了。1.1.2 Java的现状Java是Sun公司推出的新的一代面向对象程序设计语言,特别适合于Internet应用程序开发,它的平台无关性直接威胁到Wintel(Windows Internet的缩写)的垄断地位。一时间,“连Internet,用Java编程”,成为技术人员的一种时尚。虽然新闻界的报导有些言过其实,但Java作为软件开发的一种革命性的技术,其地位已被确立,这表现在以下几个方面:1)、计算机产业的许多大公司购买了Java的许可证,包括IBM,Apple,DEC,Adobe,SiliconGraphics,HP,Oracel,Toshiba,以及最不情愿的Microsoft。这一点说明,Java已得到了工业界的认可。2)、众多的软件开发商开始支持Java的软件产品。例如:Borland公司开发的基于Java的快速应用程序开发环境Latte,在1996年中期发布。Borland公司的这一举措,推动了Java进入PC机软件市场。Sun公司自己的Java开发环境JavaWorkshop已经发布。数据库厂商如:Illustra,Sysbase,Versant,Oracle都在开发CGI接口,支持HTML和Java。今天是以网络为中心的计算时代,不支持HTML和Java,应用程序的应用范围只能限于同质的环境(相同的硬件平台。3)、Intranet正在成为企业信息系统最佳的解决方案,而其中Java将发挥不可替代的作用。Intranet的目的是把Internet用于企业内部的信息系统,它的优点表现在:便宜,易于使用和管理。用户不管使用何种类型的机器和操作系统,界面是统一的Internet浏览器,而数据库、Web页面、应用程序(用Java编的Applet)则存在WWW服务器上,无论是开发人员,还是管理人员,抑或是用户都可以受益于该解决方案。Java语言正在不断发展和完善,Sun公司是主要的发展推动者,较通用的编译环境有JDK(JavaDevelopKit)与JWS(JavaWorkshop)。还有很多其他公司正在开发Java语言的编译器与集成环境,预计不久Java语言的正确性与效率都将会提高,用户用Java编程和现在用C+编程一样方便。1.2 Java语言的特点Java到底是一种什么样的语言呢?Java是一种简单的面象对象的分布式的解释的健壮的安全的结构中立的可移植的性能很优异的多线程的动态的语言。1.2.1 简单Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单性主要体现在以下三个方面:1)、Java的风格类似于C+,因而C+程序员是非常熟悉的。从某种意义上讲,Java语言是C及C+语言的一个变种,因此,C+程序员可以很快就掌握Java编程技术。2)、Java摒弃了C+中容易引发程序错误的地方,如指针和内存管理。3)、Java提供了丰富的类库。1.2.2 面向对象面向对象可以说是Java最重要的特性。Java语言的设计完全是面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及重用。单从面向对象的特性来看,Java类似于SmallTalk,但其它特性、尤其是适用于分布式计算环境的特性远远超越了SmallTalk。1.2.3 分布式Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。为分布环境尤其是Internet提供动态内容无疑是一项非常宏伟的任务,但Java的语法特性却使我们很容易地实现这项目标。1.2.4 健壮Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大缩短了开发Java应用程序的周期。1.2.5 结构中立另外,为了建立Java作为网络的一个整体,Java将它的程序编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。现在,Java运行系统有Solaris2.4(SPARC),Win32系统(Windows系列操作系统)等。Java源程序被编译成一种高层次的与机器无关的byte-code格式语言,这种语言被设计在虚拟机上运行,由机器相关的运行调试器实现执行。1.2.6 安全Java的安全性可从两个方面得到保证。一方面,在Java语言里,象指针和释放内存等C+功能被删除,避免了非法内存操作。另一方面,当Java用来创建浏览器时,语言功能和一些浏览器本身提供的功能结合起来,使它更安全。Java语言在你的机器上执行前,要经过很多次的测试。它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及试图改变一个对象的类型。 Byte-code校验如果byte-code通过代码校验,没有返回错误,我们可知道:代码没有堆栈上溢出和下溢出所有操作代码参数类型都是正确的没有发生非法数据转换,如将整数转换成指针。访问对象操作是合法的类装载ClassLoader通过将本机类与网络资源类的名称分开,来保持安全性。因为调入类时总要经过检查,这样避免了特洛伊木马现象的出现。从网络上下载的类被调进一个与源相关的私有的名字域。当一个私有类访问另一个类时,build-in(本机类)首先被检查,然后检查相关的类。这样就避免了破坏本机类情况的出现。1.2.7 可移植的同体系结构无关的特性使得Java应用程序可以在配备了Java解释器和运行环境的任何计算机系统上运行,这成为Java应用软件便于移植的良好基础。但仅仅如此还不够。如果基本数据类型设计依赖于具体实现,也将为程序的移植带来很大不便。例如在Windows3.1中整数(Integer)为16bits,在Windows95中整数为32bits,在DECAlpha中整数为64bits,在Intel486中为32bits。通过定义独立于平台的基本数据类型及其运算,Java数据得以在任何硬件平台上保持一致。Java语言的基本数据类型及其表示方式如下:byte8-bit二进制补码short16-bit二进制补码int32-bit二进制补码long64-bit二进制补码float32-bitIEEE754浮点数double32-bitIEEE754浮点数char16-bitUnicode字符在任何Java解释器中,数据类型都是依据以上标准具体实现的。因为几乎目前使用的所有CPU都能支持以上数据类型、864位整数格式的补码运算和单/双精度浮点运算。Java编译器本身就是用Java语言编写的。Java运算系统的编制依据POSIX方便移植的限制,用ANSIC语言写成。Java语言规范中也没有任何同具体实现相关的内容。1.2.8 解释的Java解释器(运行系统)能直接运行目标代码指令。链接程序通常比编译程序所需资源少,所以程序员可以在创建源程序上花上更多的时间。1.2.9 高性能如果解释器速度不慢,Java可以在运行时直接将目标代码翻译成机器指令。Sun用直接解释器一秒钟内可调用300,000个过程。翻译目标代码的速度与C/C+的性能没什么区别。1.2.10 多线程Java提供的多线程功能使得在一个程序里可同时执行多个小任务。线程有时也称小进程是一个大进程里分出来的小的独立的进程。因为Java实现的多线程技术,所以比C和C+更键壮。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh等),在开发难易程度和性能上都比单线程要好。任何用过当前浏览器的人,都感觉为调一副图片而等待是一件很烦恼的事情。在Java里,你可用一个单线程来调一副图片,而你可以访问HTML里的其它信息而不必等它。1.2.11 动态Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是C+语言进行面向对象程序设计所无法实现的。在C+程序设计过程中,每当在类中增加一个实例变量或一种成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从如下几方面采取措来解决这个问题。Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,一个在存储器生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定的。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。Java还简化了使用一个升级的或全新的协议的方法。如果你的系统运行Java程序时遇到了不知怎样处理的程序,没关系,Java能自动下载你所需要的功能程序。1.3 与C和C+语言的异同Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C+安全性不好,但C和C+还是被大家所接受,所以Java设计成C+形式,让大家很容易学习。Java去掉了C+语言的许多功能,让Java的语言功能很精炼,并增加了一些很有用的功能,Java去掉了以下几个C和C+功能和特征:指针运算结构typedefs#define需要释放内存全局变量的定义这些功能都是很容易引起错误的地方。1.4 Java的应用简介1.4.1 Web浏览Web浏览是现在国际网甚至局域网的主要使用方式。文档能很容易地显示文本和各种图片,他还能提供超文本链接。这些浏览器调用HTML语言写的文档,HTML/WWW浏览器技术只限于文本和图象。如果你想播放一种声音或运行一个演示程序,你不得不下载那个文件并用你本机上的能理解和运行那个文件格式的程序来播放它。Java程序和它的浏览器HotJava,提供了可让你的浏览器运行程序的方法。你能从你的浏览器里直接播放声音。你还能播放页面里的动画。Java还能告诉你的浏览器怎样处理新的类型文件。当我们能在2400baud线上传输视频图象时,HotJava将能显示这些视频。1.4.2 网络应用系统Java是一种与平台无关的语言,因此用Java开发的网络应用系统可以在各种平台上运行,大大增加了开发效率,减少重复劳动。而且,Java集成的网络功能有利于开发网络应用系统。本章小结:1、Java的产生与流行是当今internet发展的客观要求2、java是一门各方面性能都很好的编程语言,它的基本特点是简单、面象对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的。适合在internet环境上开发应用系统。3、java可以制作大部分网络应用程序系统,而且与当今流行的WWW浏览器结合得很好。第二章 Java程序开发与运行环境2.1 JDK环境Java不仅提供了一个丰富的语言和运行环境,而且还提供了一个免费的Java开发工具集(JavaDevelopersKits,简称JDK)。编程人员和最终用户可以利用这个工具来开发java程序或调用Java内容。JDK包括以下工具:javacJava语言编译器,输出结果为Java字节码javaJava字节码解释器javapDisassembeler:Java字节码分解程序,本程序返回Java程序的成员变量及方法等信息。javaprof资源分析工具,用于分析Java程序在运行过程中调用了哪些资源,包括类和方法的调用次数和时间,以及各数据类型的内存使用情况等。javahc代码处理工具,用于从Java类调用C+代码javaAppletViewer小应用程序浏览工具,用于测试并运行Java小应用程序javaDebuggerAPIJava调试工具APIPrototypeDebuggerJava调试工具原型Java开发环境还包括Java类库(包括I/O类库、用户界面类库、网络类库等)和HotJavaWWW浏览器。其中,HotJava浏览器提供了在WWW环境下运行Java代码的一个运行系统,而且还为WWW开发人员提供了一个Java开发框架。Java解释器是面向Java程序的一个独立运行系统,它可以一种稳定、高性能方式运行那些独立于平台的Java字节码,Java编译器则用于生成这些字节码。2.1.1 Java程序的编译Java程序的编译程序是javac.exe。javac命令将Java程序编译成字节码,然后你可用java解释器java命令来解释执行这些字节码。Java程序源码必须存放在后缀为.java的文件里。Java程序里的每一个类,javac都将生成与类相同名称但后缀为.class文件。编译器把.class文件放在.java文件的同一个目录里,除非你用了-d选项。当你引用到某些自己定义的类时,必须指明它们的存放目录,这就需要利用环境变量参数CLASSPATH。环境变量CLASSPATH是由一些被分号隔开的路径名组成。如果传递给javac编译器的源文件里引用到的类定义在本文件和传递的其它文件中找不到,则编译器会按CLASSPATH定义的路径来搜索。例如:CLASSPATH=.;C:javaclasses则编译器先搜索当前目录,如果没搜索到,则继续搜索C:javaclasses目录。注意,系统总是将系统类的目录缺省地加在CLASSPATH后面,除非你用classpath选项来编译。javac_g是一个用于调试的未优化的编译器,功能与用法和javac一样。javac的用法如下:javac-g-O-debug-depend-nowarn-verbose-classpathpath-nowrite-ddirfile.java.以下是每个选项的解释。选项解释:-classpathpath定义javac搜索类的路径。它将覆盖缺省的CLASSPATH环境变量的设置。路径是由一些由逗号隔开的路径名组成,一般格式如下:.;例如:.;C:javadocclasses;C:toolsjavaclasses表示编译器遇到一个新类,它先在本文件中查找它的定义,如果没有,则在本文件所处目录下其它文件中查找它的定义,如果还没有,则继续搜索C:javadocclasses目录中的所有文件,以此类推。-ddirectory指明类层次的根目录,格式如下:javac-dMyProgram.java这样将MyProgram.java程序里的生产的.class文件存放在my_dir目录里.-g带调试信息编译,调试信息包括行号与使用java调试工具时用到的局部变量信息。如果编译没有加上-O优化选项,只包含行号信息。-nowarn关闭警告信息,编译器将不显示任何警告信息。-O优化编译static,final,private函数,注意你的类文件可能更大。-verbose让编译器与解释器显示被编译的源文件名和被加载的类名。环境变量CLASSPATH用来提供给系统搜索用户定义的类的缺省路径。各路径由分号隔开,例如:.;C:javadocclasses;C:toolsjavaclasses表示编译器遇到一个新类,它先在本文件中查找它的定义,如果没有,则在本文件所处目录下其它文件中查找它的定义,如果还没有,则继续搜索C:javadocclasses目录中的所有文件,以此类推。2.1.2 Java程序的调试使用java调试器jdb导游在早期前Betal版的Java调试器jdb是命令行形式的,如用Sun公司的dbx调试器。用jdb来调试Java应用程序,在调试前,要确证你的应用程序是带标志g编译的。例如:javac-gHelloWorld.javahelp命令将显示jdb里的可用命令列表。helpthreadsthreadgroup-列出线程thread设置缺省线程Suspendthreadsid(s)将线程挂起resumethreadid(s)重新启动线程whereid|a1|打印线程的堆栈threadgroups-列出线程组号threadgroup设置当前线程组printid(s)打印对象或域dumpid(s)打印所有对象信息locals打印当前堆栈所有局部变量classes列出当前所知的类methods列出一个类的成员函数stopin.在一个成员函数里设置断点stopat:在一行里设置断点upnframes在线程堆栈里往上移downnframes在线程堆栈里往下移clear:清除一个断点step执行当前行cont从断点处继续执行catch为指定的情况中断ignor为指定的情况忽略listlinenumber打印源程序useSourcefilepath显示或改变源路径memeory报告内存使用情况loadclassname加载Java类以便调试run开始执行加载的类!重复以上的命令help(?)列出所有的命令exit(orquit)离开调试器2.1.3 Java程序的执行java-java语言解释器java命令解释java字节码语法:javaoptionsclassnamejava_goptionsclassname描述:java命令由java编译器javac输出的Java字节码。classname参数是要执行的类名称。注意任意在类名称后的参数都将传递给要执行类的main函数。java执行完main函数后推出,除非main函数创建了一个或多个线程。如果main函数创建了其它线程,java总是等到最后一个线程推出才推出。选项:-cs,-checksource当一个编译过的类调入时,这个选项将比较字节码更改时间与源文件更改时间,如果源文件更改时间靠后,则重新编译此类并调入此新类。-classpathpath定义javac搜索类的路径。它将覆盖缺省的CLASSPATH环境变量的设置。路径是由一些由逗号隔开的路径名组成,一般格式如下:.;例如:.;C:javadocclasses;C:toolsjavaclasses表示解释器遇到一个新类,它先在本文件中查找它的定义,如果没有,则在本文件所处目录下其它文件中查找它的定义,如果还没有,则继续搜索C:javadocclasses目录中的所有文件,以此类推。-mxx设置最大内存分配池,大小为x,x必须大于1000bytes。缺省为16兆。-msx设置垃圾回收堆的大小为x,x必须大于1000bytes。缺省为1兆。-noasyncgc关闭异步垃圾回收功能。此选项打开后,除非显式调用或程序内存溢出,垃圾内存都不回收。本选项不打开时,垃圾回收线程与其它线程异步同时执行。-ssx每个Java线程有两个堆栈,一个是java代码堆栈,一个是C代码堆栈。-ss选项将线程理C代码用的堆栈设置成最大为x。-ossx每个Java线程有两个堆栈,一个是java代码堆栈,一个是C代码堆栈。-oss选项将线程理java代码用的堆栈设置成最大为x。-v,-verbose让java解释器在每一个类被调入时,在标准输出打印相应信息。环境变量CLASSPATH用来提供给系统搜索用户定义的类的缺省路径。各路径由分号隔开,例如:.;C:javadocclasses;C:toolsjavaclasses表示解释器遇到一个新类,它先在本文件中查找它的定义,如果没有,则在本文件所处目录下其它文件中查找它的定义,如果还没有,则继续搜索C:javadocclasses目录中的所有文件,以此类推。2.2 JWS环境JavaWorkShop是SUN公司的一个新产品,它是一个集成的java语言开发环境,它包括以下工具:lPortfolio和Project管理器、源文件编辑器、Build管理工具、调试器、项目测试、扩展在线超文本连接到帮助文件。这些工具在JavaWorkShop的第一页都有类似Web页面的超级连接。注意,JavaWorkShop采用的是当今浏览器的界面风格,你想作什么,只需找到相应的超级连接就可以了,具体编译及调试功能是用嵌如到HTML文档里的Applet实现的,因此,对习惯于用internet浏览方式的用户来说,这种界面很容易接受。2.2.1 Portfolio和Project管理器Protfolios是一些java应用程序或Applet的集中。它让你更好的管理更多的projects。一个project是portfolio里的一个子集,它包含了以下信息:1)、怎样编译本项目2)、怎样调试和浏览本项目3)、怎样运行本项目4)、怎样发布本项目2.2.2 源文件编辑器源文件编辑器可以从build管理器、调试器和源文件浏览器里的超级连接进入。在这个模块里,你可以输入源文件。2.2.3 Build管理工具本模块是项目的编译器,你可以点build按钮直接进入本模块,如果某个文件出错,错误信息会提供一个超级连接,直接指到出错的源文件地点。2.2.4 VisulJava(图形界面构造)顾名思义,本模块能让你可视化建造一些复杂界面,如果你用过VisualBasic,你会发现它们很相似。2.2.5 调试器调试器能让你很方便地跟踪程序的执行与发现程序的错误。本章小结:Java语言有两个开发环境,一个是免费的JDK,是命令行方式的。还有一个JavaWorkShop,是开发java程序的集成环境。本章简要介绍了它们的使用方法。第三章 Java程序设计基础3.1 Java编程概况现在你可以复习一下Java语言的背景材料,它的基本结构象C/C+,但任何用面向过程语言编写过程序的人都可以了解Java语言的大部分结构.3.1.1 程序结构Java语言的源程序代码由一个或多个编译单元(compilationunit)组成,每个编译单元只能包含下列内容(空格和注释除外):1)、一个程序包语句(packagestatement)2)、入口语句(importstatements)3)、类的声明(classdeclarations)4)、界面声明(interfacedeclarations)每个Java的编译单元可包含多个类或界面,但是每个编译单元最多只能有一个类或者界面是公共的。Java的源程序代码被编译后,便产生了Java字节代码。Java的字节代码由一些不依赖于机器的指令组成,这些指令能被Java的运行系统(runtimesystem)有效地解释。Java的运行系统工作起来如同一台虚拟机。在当前的Java实现中,每个编译单元就是一个以.java为后缀的文件。每个编译单元有若干个类,编译后,每个类生成一个.class文件。.class文件是Java虚拟机能够识别的代码。3.1.2 注释三种类型如下:1)、/注释一行2)、/*一行或多行注释*/3)、/*文档注释*/文档注释一般放在一个变量或函数定义前,指示在任何自动生成文档系统中调入。这些注释都是声明条目的描述。3.1.3 标识符变量,函数,类和对象的名称都是标识符,程序员需要标识和使用的东西都需要标识符。在Java语言里,标识符以字符或_,$开头,后面可以包含数字,标识符是大小写有区别的,没有长度限制。有效的标识符myname;ict;_network;Hello;_sys;_path;$bill;例子:inta_number;char_onechar;float$bill;关键词:abstract;continue;for;new;switch;boolean;default;goto;null;synchronized;break;do;if;package;this;byte;double;implements;private;thread;safe;by;value;else;import;protected;throw;case;extends;instance of;public;transient;catch;false;int;return;true;char;final;interface;short;try;class;finally;long;static;void;const;float;native;super;while;其它保留词以下单词被保留使用:cast;future;generic;inner;operator;outer;restvar;3.1.4 数据类型Java使用五种基本类型:integer(整数),floating(浮点数),point(指针),Boolean(布尔变量),Character or String(字符或字符串)。1、integer整数,下边给出的数据表示都是整数的例子:4,15,089,0xAD00整数长度数据类型表示8bits,byte16bits,short32bits,int64bits,long2、floating浮点数,下边给出的数据表示都是浮点数的例子:6.37,3.7E15,3e8浮点数长度数据类型表示32bits,float64bits,double3、Boolean布尔变量,下边是布尔变量的两种可能取值:true,false4、Character字符,下边给出的都是字符的例子:a,t,uString字符串,下边给出的都是字符串的例子:Thisisastringliteral,中国科学院计算所数组,你可以定义任意类型的数组。chars,这是字符型数组;int,这是整型数组;你还可以定义数组的数组(多维数组),int block = newint23,数组边界在运行时被检测,避免堆栈溢出和内存崩溃。在Java里,数组实际上是一个对象,数组有一个成员变量:length。你可以用这个成员函数来查看任意数组的长度。int a = newint103,a.length = 10,a0.length = 3。创建数组,在Java里创建数组,你可使用两种基本方法1、 创建一个空数组:int list = newint50,2、你可以用初始数值填充数组。String names = Chenji,Yuan,Chun,Yang,相当于下面功能:String names; names = newString4;names0 = new String(Chenji);names1 = newString(Yuan);names2 = newString(Chun);names3 = newString(Yang);在编译时你不能象下例那样创建静态数组。intname50;/将产生一个编译错误你也不能用new操作去填充一个没定义大小的数组。int name;for(inti=0;i9;i+)namei=i;3.1.5 表达式Java语言的表达式和C语言非常类似。运算符,运算符(operator)优先级从高到底排列如下:.()+-!instanceof*/%+-=!=&|?:=op=,整数运算符在整数运算时,如果操作数是long类型,则运算结果是long类型,否则为int类型,绝不会是byte,short或char型。这样,如果变量i被声明为short或byte,i+1的结果会是int。如果结果超过该类型的取值范围,则按该类型的最大值取模。单目整数运算符是:运算符操作-单目非位补码+加1-减1+运算符用于表示直接加1操作。增量操作也可以用加运算符和赋值操作间接完成。+lvalue(左值)表示lvalue+=1,+lvalue也表示lvalue=lvalue+1(只要lvalue没有副作用)。-运算符用于表示减1操作。+和-运算符既可以作为前缀运算符,也可以做为后缀运算符。双目整数运算符是:运算符操作*+加-减*乘/除%取模&位与位或位异或右移(带符号)添零右移整数除法按零舍入。除法和取模遵守以下等式:(a/b)*b+(a%b)=a整数算术运算的异常是由于除零或按零取模造成的。它将引发一个算术异常。下溢产生零,上溢导致越界。例如:加1超过整数最大值,取模后,变成最小值。一个op=赋值运算符,和上表中的各双目整数运算符联用,构成一个表达式。整数关系运算符,=,=和!=产生boolean类型的数据。布尔运算符布尔(boolean)变量或表达式的组合运算可以产生新的boolean值。单目运算符!是布尔非。双目运算符,和是逻辑AND,OR和XOR运算符,它们强制两个操作数求布尔值。为避免右侧操作数冗余求值,用户可以使用短路求值运算符和。用户可以使用=和!=,赋值运算符也可以用&=、|=、=。三元条件操作符?:和C语言中的一样。浮点运算符浮点运算符可以使用常规运算符的组合:如单目运算符+、-,双目运算符+、-、*和/,以及赋值运算符+=,-=,*=,和/=。此外,还有取模运算:%和%=也可以作用于浮点数,例如:a%b和a-(int)(a/b)*b)的语义相同。这表示a%b的结果是除完后剩下的浮点数部分。只有单精度操作数的浮点表达式按照单精度运算求值,产生单精度结果。如果浮点表达式中含有一个或一个以上的双精度操作数,则按双精度运算,结果是双精度浮点数。数组运算符数组运算符形式如下:可给出数组中某个元素的值。合法的取值范围是从0到数组的长度减1。取值范围的检查只在运行时刻实行。运算符,以String对象实现。运算符+完成并操作,如果必要则自动把操作数转换为String型。如果操作数是一个对象,它可定义一个方法toString()返回该对象的String方式,例如floata=1.0print(“Thevalueofais”+a+“n”);+运算符用到上的例子Strings=“a=”+a;+=运算符也可以用于String。注意,左边(下例中的s1)仅求值一次。s1+=a;/s1=s1+a/若a非String型,自动转换为String型。对象运算符双目运算符instanceof测试某个对象是否是指定类或其子类的实例。例如:if(myObjectinstanceofMyClass)MyClassanothermyObject=(MyClass)myObject;是判定myObject是否是MyClass的实例或是其子类的实例。强制和转换Java语言和解释器限制使用强制和转换,以防止出错导致系统崩溃。整数和浮点数间可以来回强制转换,但整数不能强制转换成数组或对象。对象不能被强制为基本类型。3.1.6 Java流控制下面几个控制结构是从C语言借鉴的。分支结构if/else分支结构if(Boolean)statemanets;elsestatements;switch分支结构switch(expr1)caseexpr2:statements;break;caseexpr3:statements;break;default:statements;break;循环结构for循环结构for(initexpr1;testexpr2;incrementexpr3)statements;While循环结构While(Boolean)statements;Do循环结构dostatements;while(Boolean);一般顺序控制breaklabelcontinuelabelreutrnexpr;label:statement;for循环例子下面是一个程序例子,画几条线,分别用红,绿,蓝颜色,这段程序可能是Java函数的一部分:intcount;for(count=1;count=12;count+)switch(count%3)case0:setColor(Color.red);break;case1:setColor(Color.blue);break;case2:setColor(Color.green);break;g.drawLine(10,count*10,80,count*10);3.2 Java变量和函数的实例Java的类包含变量和函数。数据变量可以是一些原始的类型,如int,char等。成员函数是一些可执行的过程。例如,下面程序里:publicclassClassOneinti;publicClassOne()i=10;publicvoidAdd_i(intj)i=i+j;ClassOne包含一个变量i和两个成员函数,ClassOne(intfirst)和Add_i(intj)。成员函数成员函数是一些可被其它类或自己类调用的处理子程序。一个特殊的成员函数叫构造函数,这个函数名称一般与本类名程相同。它没有返回值。构造函数和成员函数当你在Java里定义一个类时,你可定义一个或多个可选的构造函数,当创建本类的一个对象时用某一个构造函数来初始化本对象。用前面的程序例子来说明,当ClassOne类创建一个新实例时,所有成员函数和变量被创建(创建实例)。构造函数被调用。ClassOnemc:mc=newClassOne();关键词new用来创建一个类的实例,一个类用new初始化前并不占用内存,它只是一个类型定义,当mc对象初始化后,mc对象里的i变量等于10。你可以通过对象名来引用变量i。(有时称为实例变量)mc.i+;/mc实例变量加1因为mc有ClassOne类的所有变量和成员函数,我们可以使用同样的语法来调用成员函数Add_i:Add_i(10);现在mc.i变量等于21.结束函数Java并不支持析构函数(C+里的定义),因为java本身提供对象无用时自动清除的功能,同时它也提供了一个自动拉圾箱的成员函数,在清除对象时被调用:Protectedvoidfinalize()close();3.3 对象有效范围和废物自动回收对象有一定的生命期并在它的生命期间使用资源,当一个对象不再被使用时,它应释放内存,避免内存溢出。在Java里,收集和释放内存是一个叫自动废品回收站的线程的责任。这个线程监视对象有效范围并给一个走出有效范围的对象作上标识。例如:Strings;/没有分配内存s=newString(oldstring);/分配内存s=newstring;/重新分配内存(创建新对象)我们将在以后访问String类时将更加明白它的工作过程,但它的快速工作过程是这样的:1.创建一个新的String类对象并填充以oldstring2.创建另一个String对象并填充以newstring注意我们创建了两个对象。Stirng对象oldstringStirng对象newstring在第三条语句里,第一个包括oldstring的叫做s的对象已走出了有效范围,没有任何方法可以再访问他,我们现在有一个新的对象也叫s,包含newstring。在下一个废品回收线程,前一个对象将被标识并清除。3.4 子类子类是利用存在的对象创建一个新对象的机制,比如,如果你有一个Horse类,你可以创建一个Zebra子类,Zebra是Horse的一种。classZebraextendsHorseintnumber_OF_stripes:关键词extends来定义对象有的子类.Zebra是Horse的子类。Horse类里的所有特征都将拷贝到Zebra类里,而Zebra类里可以定义自己的成员函数和实例变量。Zebra称为Horse的派生类或继承。另外,你也许还想覆盖基类的成员函数。用ClassOne说明,下面是一个派生类覆盖Add_i功能的例子.importClassOne;publicclassNewClassextendsClassOnepublicvoidAdd_i(intj)i=i+(j/2);当NewClass类的实例创建时,变量i初始化值为10,但调用Add_i产生不同的结果。NewClassmnc;mnc=newNewClass();mnc.Add_i(10);访问控制Java里当你创建一个新类时,你可以标明变量和成员函数的访问层次。publicpublicvoidAnyOneCanAccess()public实例变量和成员函数可以任意其它类调用。protectedprotectedvoidOnlySubClasses()protected实例变量和成员函数只能被其子类调用.privateprivateStringCreditCardNumber;private实例变量和成员函数只能在本类里调用.friendlyvoidMyPackageMethod()缺省的,如果没有定义任何防火控制,实例变量或函数缺省定义成friendly,意味着可以被本包里的任意对象防问,但其它包里的对象不可防问。静态成员函数和变量有些时候,你创建一个类,希望这个类的所有实例都公用一个变量。也就是说,所有这个类的对象都只有实例变量的同一个拷贝。这种方法的关键词是static,例如:classBlockstaticintnumber=50;所有从Block类创建的对象的number变量值都是相同的。无任在哪个对象里改变了number的值,所有对象的number都跟着改变。同样的,你可以定义static成员函数,但这个成员函数不能访问非static函数和变量。classBlockstaticintnumber=50;intlocalvalue;staticvoidadd_local()localvalue+;/没有运行staticvoidadd_static()number+;/运行3.5 this和super访问一个类的实例变量时,this关键词是指向这个类本身的指针,在前面ClassOne例子中,我们可以增加构造函数如下:publicclassClassOneinti;publicClassOne()i=10;publicClassOne(intvalue)this.i=value;publicvoidAdd_i(intj)i=i+j;这里,this指向ClassOne类的指针。如果在一个子类里覆盖了父类的某个成员函数,但又想调用父类的成员函数,你可以用super关键词指向父类的成员函数。importClassOne;publicclassNewClassextendsClassOnepublicvoidAdd_i(intj)i=i+(j/2);super.Add_i(j);下面程序里,i变量被构造函数设成10,然后15,最后被父类(ClassOne)设成25。NewClassmnc;mnc=newNewClass();mnc.Add_i(10);3.6类的类型至今为止,我用在类前面只用了一个public关键词,其实它有下面4种选择:abstract一个abstract类必须至少有一个虚拟函数,一个abstract类不能直接创建对象,必须继承子类后才能。final一个final类声明了子类链的结尾,用final声明的类不能再派生子类。publicpublic类能被其它的类访问。在其它包里,如果

温馨提示

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

评论

0/150

提交评论