《孙鑫java从入门到精通课件整理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
学习Java前的准备工作主讲人:孙鑫经典java从入门到精通视频课件http://www.sunxin.orgDownload:http://www.cnxhacker.net 相关概念老师,什么是JDK啊?即JavaDevelopKit,Java开发工具包。老师,你们讲的是Java1还是Java2?1998年12月,SUN公司发布了JDK1.2,开始使用“Java2”这一名称,目前我们已经很少使用JDK1.1版本,所以我们所说的Java都是指Java2。J2SDK当然就是Java2SoftwareDevelopKit。老师,什么是JRE?JRE(JavaRuntimeEnvironment),即Java运行环境,通常已包含在J2SDK中了。如果我们仅仅是为了运行Java程序,而不是从事Java开发,我们可以直接下载JRE,在我们的系统上安装。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java的开发工具包(JDK)J2SE(Java2Platform,StandardEdition)标准版J2EE(Java2Platform,EnterpriseEdition)企业版J2ME(Java2Platform,MicroEdition)精简版http://www.sunxin.orgDownload:http://www.cnxhacker.net J2SEv1.4.2相关下载Java2Platform,StandardEdition,v1.4.2http://java.sun.com/j2se/1.4.2/download.htmlJ2SEv1.4.2Documentationhttp://java.sun.com/j2se/1.4.2/download.htmlJavaTutorialhttp://java.sun.com/docs/books/tutorial/information/download.htmlhttp://www.sunxin.orgDownload:http://www.cnxhacker.net Java技术与应用主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 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这个名字就这样传开了。Java的起源http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java因为Java是简单的面向对象的健壮的安全的解释的与平台无关的多线程的动态的语言http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java简单的Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单性主要体现在三个方面:1、Java的风格类似于C++,因而C++程序员初次接触Java语言,就会感到很熟悉。从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快地掌握Java编程技术。2、Java摒弃了C++中容易引发程序错误的一些特性,如指针、结构、枚举以及内存管理等。3、Java提供了丰富的类库,可以帮助我们很方便的开发Java程序。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java面向对象的面向对象可以说是Java最重要的特性,所以它支持继承、重载、多态等面向对象的特性。Java语言的设计是完全面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java健壮的Java致力于检查程序在编译和运行时的错误。Java也是一种强类型的语言,其类型检查比C++还要严格。类型检查帮助我们检查出许多开发早期出现的错误。Java自己负责内存管理,提供了垃圾内存回收机制,有效的避免了C++中最头疼的内存泄漏问题。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java安全的Java的安全性可从两个方面得到保证。一方面,在Java语言里,删除了指针和释放内存等C++功能,避免了非法内存操作。另一方面,通过Java的安全体系架构来确保Java代码的安全性。当我们从网上下载Java代码在本地执行时,Java的安全架构能确保恶意的代码不能随意访问我们本地计算机的资源,例如:删除文件,访问本地网络资源等操作都是被禁止的。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java解释的Java代码是解释执行的,我们使用Java编译器将Java代码编译成字节码,这是一种中间代码,然后由Java解释器解释执行。而C++程序是编译执行的,C++程序代码被编译为本地机器指令,然后执行。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java与平台无关的Java作为一种网络语言,其源代码被编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。Java源程序被编译成一种与机器无关的字节码格式,在Java虚拟机上运行。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java多线程的Java语言的一个重要特性就是在语言级支持多线程的程序设计。多线程就好像我们做一张桌子,如果你一个人完成这张桌子—就好像单线程,那么你需要先做桌面,做完桌面后,再做4个桌子腿,如果现在有5个人来做桌子—在程序中开辟5个线程,其中1个人做桌面,另外4个人分别做4个桌子腿,那么这两种方式效率的高低,相信大家都能区分出来。http://www.sunxin.orgDownload:http://www.cnxhacker.net 我们为什么要用Java动态的Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是我们采用C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一个成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从以下几个方面采取措施来解决这个问题。Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下来,传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。一个在存储器中生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。Java还简化了使用一个升级的或全新协议的方法。如果你的系统运行Java程序时遇到了不知怎样处理的程序,Java能自动下载你所需要的功能程序。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java跨平台的原理Java的跨平台是通过Java虚拟机(JVM)(JavaVirtualMachine)来实现的。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java跨平台的原理Java源文件的编译过程Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创建内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java跨平台的原理Java解释器的执行过程运行JVM字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验和代码的执行。装入代码的工作由“类装载器”(classloader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类,类之间没有其他办法可以影响其它类。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转换等多种错误。通过校验后,代码便开始执行了。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java跨平台的原理Java字节码的两种执行方式1、即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。2、解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。 通常采用的是第二种方法。由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代码的工作具有较高的效率。对于那些对运行速度要求较高的应用程序,解释器可将Java字节码即时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java跨平台的原理JVM规格描述JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提供很好的灵活性,同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java跨平台的原理Java程序执行与C/C++程序执行的对比分析如果把Java源程序想象成我们的C++源程序,Java源程序编译后生成的字节码就相当于C++源程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java开发工具包(JDK)的下载下载网址:http://java.sun.comhttp://www.sunxin.orgDownload:http://www.cnxhacker.net Java的面向对象编程主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向对象编程概述简单的说,面向对象编程(ObjectOrientedProgramming,简称OOP)描述的是对象之间的相互作用。面向对象编程与面向过程编程的区别:过程化程序设计先确定算法,再确定数据结构;面向对象编程先确定数据结构,再确定运算。面向过程编程的程序员,习惯于建立数据结构存放数据并定义方法(函数)来操作数据;面向对象编程的程序员则构造一个对象模型,将数据与方法组织在一起。http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象对象的状态对象的行为我们可以把现实世界的事物抽象成对象。对象一般都有两个特征:状态(state)和行为(behavior)。软件的对象概念是由现实世界对象抽象而来。把现实世界对象的状态保存在软件对象的变量中;现实世界对象的行为通过软件对象的方法(函数)来实现。http://www.sunxin.orgDownload:http://www.cnxhacker.net 类和对象把相似的对象划归成一个类。在软件中,类,就是一个模板,它定义了通用于一个特定种类的所有对象的状态(变量)和行为(方法)。类是创建对象的模板,对象是类的实例。http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向对象程序设计从程序设计的角度看,类是面向对象程序中最基本的程序单元。类实质上定义的是一种数据类型,这种数据类型就是对象类型。所以我们可以使用类名称来声明对象变量。声明对象变量之后,还不能使用对象。必须用运算符new创建对象实体之后,才能使用对象。http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向对象编程的难点掌握面向对象的困难之处在于思路的转换。我们通常习惯于考虑解决问题的方法,而不是考虑将问题抽象成对象再去解决它。http://www.sunxin.orgDownload:http://www.cnxhacker.net 一个简单的例子编写一个驾驶汽车的方法面向过程的程序设计:编写一个方法,voiddrivecar();面向对象的程序设计:将一辆汽车看成一个对象,将所有汽车对象的共性抽取出来,设计一个类Car,类中有一个方法voiddrive(),用Car这个类实例化一个具体的对象car,调用:car.drive()。http://www.sunxin.orgDownload:http://www.cnxhacker.net 类的构造方法构造方法的名字和类名相同,并且没有返回值。构造方法主要用于为类的对象定义初始化状态。我们不能直接调用构造方法,必须通过new关键字来自动调用,从而创建类的实例。Java的类都要求有构造方法,如果没有定义构造方法,Java编译器会为我们提供一个缺省的构造方法,也就是不带参数的构造方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net new关键字的作用为对象分配内存空间。引起对象构造方法的调用。为对象返回一个引用。http://www.sunxin.orgDownload:http://www.cnxhacker.net 缺省构造方法当我们用缺省的构造方法初始化对象时,系统用默认值初始化对象的成员变量。各种数据类型的默认值为:数值型0booleanfalsechar‘ ’对象nullhttp://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的重载(overload)重载构成的条件:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。http://www.sunxin.orgDownload:http://www.cnxhacker.net 特殊变量thisthis变量代表对象本身当类中有两个同名变量,一个属于类(类的成员变量),而另一个属于某个特定的方法(方法中的局部变量),使用this区分成员变量和局部变量。使用this简化构造函数的调用。http://www.sunxin.orgDownload:http://www.cnxhacker.net 特殊变量this关于实例方法和实例数据成员的进一步说明一个类所有的实例(对象)调用的成员方法在内存中只有一份拷贝,尽管在内存中可能有多个对象,而数据成员在类的每个对象所在内存中都存在着一份拷贝。this变量允许相同的实例方法为不同的对象工作。每当调用一个实例方法时,this变量将被设置成引用该实例方法的特定的类对象。方法的代码接着会与this所代表的对象的特定数据建立关联。http://www.sunxin.orgDownload:http://www.cnxhacker.net 关键字static静态方法和静态变量是属于某一个类,而不属于类的对象。静态方法和静态变量的引用直接通过类名引用。在静态方法中不能调用非静态的方法和引用非静态的成员变量。反之,则可以。可以用类的对象obj去调用静态的方法method(),如:obj.method()。http://www.sunxin.orgDownload:http://www.cnxhacker.net 常量的定义使用关键字final定义常量,例如:finaldoublePI=3.1415926;作为一种约定,在定义常量时,通常采用大写形式。final常量可以在声明的同时赋初值,也可以在构造函数中赋初值。为了节省内存,我们通常将常量声明为静态的(static)。http://www.sunxin.orgDownload:http://www.cnxhacker.net 类的继承理解继承是理解面向对象程序设计的关键。在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类)。在Java中,不允许多继承。http://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的覆盖(override)在子类中定义一个与父类同名、返回类型、参数类型均相同一个方法,称为方法的覆盖。覆盖发生在子类与父类之间。http://www.sunxin.orgDownload:http://www.cnxhacker.net 特殊变量super特殊变量super,提供了对父类的访问。可以使用super访问父类被子类隐藏的变量或覆盖的方法。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。http://www.sunxin.orgDownload:http://www.cnxhacker.net 多态性通过覆盖父类的方法来实现,在运行时根据传递的对象引用,来调用相应的方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向对象的程序设计问题:求一个长方形的周长和面积。以面向过程的程序设计方式思考:1、确定长方形周长和面积的算法。2、编写两个方法(函数)分别计算长方形的周长和面积。3、求周长的方法(函数)和求面积的方法(函数)需要两个参数,分别是长方形的长和宽。http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向过程的程序设计代码:classRectangle{staticintperimeter(intlength,intwidth){return2*(length+width);}staticintarea(intlength,intwidth){returnlength*width;}publicstaticvoidmain(String[]args){System.out.println("perimeter=“+Rectangle.perimeter(5,4));System.out.println("area=“+Rectangle.area(5,4));}}http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向对象的程序设计问题:求一个长方形的周长和面积。以面向对象的程序设计方式思考:1、一个长方形可以看成一个长方形对象。2、一个长方形对象有两个状态(长和宽)和两个行为(求周长和求面积)。3、将所有长方形的共性抽取出来,设计一个长方形类。4、通过长方形对象的行为,就可以求出某个具体的长方形对象的周长和面积。http://www.sunxin.orgDownload:http://www.cnxhacker.net 面向对象的程序设计Demohttp://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 计算机中数据的表示方法计算机是一种电子设备,由复杂的电子元器件组合而成,一个电子元器件有带电和不带电两种状态,通常我们将带电状态表示为数值1,不带电状态表示为数值0,多个这样的元器件的组合可以表示更多状态,也就是可以表示更多的数据,如000表示0,001表示1,010表示2,011表示3,依此类推,111表示7,一个元器件可表示一位(bit)数据,这种表示数据的方式就叫二进制。在实际的电子设备中,我们将8个这样的元器件形成一个单元,这样的单元叫一个字节(byte),一个字节能表示多少个数呢?表示数值的范围是0-255。一个字节由8个二进位组成,其中最右边的一位称为“最低有效位”或“最低位”,最左边的一位称为“最高有效位”或“最高位”。每一个二进位的值是0或1。http://www.sunxin.orgDownload:http://www.cnxhacker.net 计算机中数据的表示方法二进制计数的缺点:书写太长,容易出错,一般计算机的数据位数都是4的整数倍,所以,在计算机里通常采用16进制计数法。用数字可以表示各种信息,计算机里只有数值,当你在内存中看到一个数值时,这个数值可能代表各种意义,生活中的数值也可以代表其他意义,如1234可以代表密码,存款额,电报信息,根据上下线索,我们就能够知道这数值代表的意义。http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码原码将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。为了简单起见,我们用1个字节来表示一个整数。+7的原码为:00000111-7的原码为:10000111问题:+0的原码为:00000000-0的原码为:10000000http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码反码一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。为了简单起见,我们用1个字节来表示一个整数。+7的反码为:00000111-7的反码为:11111000问题:+0的反码为:00000000-0的反码为:11111111http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码补码利用溢出,我们可以将减法变成加法。对于十进制数,如果从9得到结果5,可以用减法:9-4=5因为4+6=10,我们将6作为4的补数,将上式的减法改写为加法:9+6=15去掉高位1(也就是减去10),得到结果5。对于16进制数,如果从C得到结果5,可以用减法:C-7=5因为7+9=16,我们将9作为7的补数,将上式的减法改写为加法:C+9=15去掉高位1(也就是减去16),得到结果5。http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码补码在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为:100000000进位1被丢弃。http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码+111111001补码一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。为了简单起见,我们用1个字节来表示一个整数。+7的补码为:00000111-7的补码为:第步11111000第步http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码补码0的补码表示:+0的补码:00000000-0的补码:第步11111111第步进位1被丢弃+1100000000第步http://www.sunxin.orgDownload:http://www.cnxhacker.net 原码、反码和补码补码已知一个负数的补码,将其转换为十进制数,步骤:1、先对各位取反;2、将其转换为十进制数;3、加上负号,再减去1。例如:11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符为了方便对二进制位进行操作,Java给我们提供了四个二进制位操作符:&按位与|按位或^按位异或~按位取反http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位与一个房间里有两个开关控制房间的灯的明暗。当两个开关同时处于打开状态时,灯才能亮。开关1开关2灯的状态关关暗开关暗关开暗开开亮http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位与011011010011011100100101结论:按位与,只有壹(1)壹(1)为1。&http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位或一个房间里有两个开关控制房间的灯的明暗。当任何一个开关处于打开状态时,灯就能亮。开关1开关2灯的状态关关暗开关亮关开亮开开亮http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位或011011010011011101111111结论:按位或,只有零(0)零(0)为0。|http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位异或一个房间里有两个开关控制房间的灯的明暗。当两个开关处于不同状态时,灯就能亮。开关1开关2灯的状态关关暗开关亮关开亮开开暗http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位异或011011010011011101011010结论:按位异或,只有零(0)壹(1)或壹(1)零(0)为1。^http://www.sunxin.orgDownload:http://www.cnxhacker.net 位运算符按位取反~0110110110010010结论:对二进制数按位取反,即0变成1,1变成0。http://www.sunxin.orgDownload:http://www.cnxhacker.net 移位运算符Java中有三个移位运算符左移:<<带符号右移:>>无符号右移:>>>http://www.sunxin.orgDownload:http://www.cnxhacker.net 移位运算符数xx<<2x>>2x>>>21700010001000100010000000100010000010001-17111011111110111100数xx<<2x>>2x>>>21700010001000100010000000100010000010001-1711101111111011110011111011110011101111http://www.sunxin.orgDownload:http://www.cnxhacker.net 练习将一个整数110从右端开始的4~7位变为0。http://www.sunxin.orgDownload:http://www.cnxhacker.net Lesson3主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 主要内容包类的说明符方法的说明符对象的销毁(垃圾内存回收的演示)接口内部类和匿名内部类异常处理http://www.sunxin.orgDownload:http://www.cnxhacker.net 包(package)为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。http://www.sunxin.orgDownload:http://www.cnxhacker.net 包(package)package语句必须是文件中的第一条语句。也就是说,在package语句之前,除了空白和注释之外不能有任何语句。如果不加package语句,则指定为缺省包或无名包。包对应着文件系统的目录层次结构。在package语句中,用“.”来指明包(目录)的层次。http://www.sunxin.orgDownload:http://www.cnxhacker.net 编译并生成包在当前目录下生成包javac–d.Test.java在指定目录下生成包javac–dE:JavaLessonTest.javahttp://www.sunxin.orgDownload:http://www.cnxhacker.net import语句引入包中的类。importjava.io.File;引入整个包。importjava.io.*;在同一包中的类可以互相引用,无需import语句。http://www.sunxin.orgDownload:http://www.cnxhacker.net 类的说明符类的访问说明符(1)public(2)default(不加访问说明符时)类的其它修饰符(1)final(2)abstracthttp://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的说明符方法的访问说明符(1)public(2)protected(3)default(不加访问说明符时)(4)private方法的其它修饰符(1)static(2)final(3)abstract(4)native(5)synchronizedhttp://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的访问控制publicprotecteddefaultprivate同类同包子类通用性不同情形下访问说明符http://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的访问控制publicprotecteddefaultprivate同类同包子类通用性不同情形下访问说明符http://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的访问控制publicprotecteddefaultprivate同类同包子类通用性不同情形下访问说明符http://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的访问控制publicprotecteddefaultprivate同类同包子类通用性不同情形下访问说明符http://www.sunxin.orgDownload:http://www.cnxhacker.net 方法的访问控制publicprotecteddefaultprivate同类同包子类通用性不同情形下访问说明符http://www.sunxin.orgDownload:http://www.cnxhacker.net final方法为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(overridden),可以使用final方法。为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优化。要注意的是:编译器会自行对final方法进行判断,并决定是否进行优化。通常在方法的体积很小,而我们确实不希望它被覆盖时,才将它声明为final。class中所有的private和static方法自然就是final。http://www.sunxin.orgDownload:http://www.cnxhacker.net 抽象方法和抽象类在类中没有方法体的方法,就是抽象方法。含有抽象方法的类,即为抽象类。如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类。我们可以将一个没有任何抽象方法的类声明为abstract,避免由这个类产生任何的对象。构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net native方法native方法是用户在Java中可以使用,但不能编写的方法。JNI(JavaNativeInterface),它允许Java虚拟机(JVM)内部运行的Java代码能够与用其它编程语言(如C、C++、汇编语言)编写的应用程序和库进行互操作。JNI最大的好处是它没有对底层Java虚拟机的实现施加任何限制,因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地(Native)应用程序和库,就能够与所有支持JNI的Java虚拟机协同工作。JNI可以理解为Java和本地应用程序之间的中介。http://www.sunxin.orgDownload:http://www.cnxhacker.net 接口接口中所有的方法都是publicabstract。在接口中声明方法时,不能使用native、static、final、synchronized、private、protected等修饰符。和public类一样,public接口也必须定义在与接口同名的文件中。http://www.sunxin.orgDownload:http://www.cnxhacker.net 接口接口中可以有数据成员,这些成员默认都是publicstaticfinal。http://www.sunxin.orgDownload:http://www.cnxhacker.net Math.javainterfaceMath{doublePI=3.1415926;}classArithmeticimplementsMath{doubleroundArea(doubleradius){returnPI*radius*radius;}}classStudent{publicstaticvoidmain(String[]args){Arithmetica=newArithmetic();System.out.println(a.roundArea(3));System.out.println(Math.PI);//okSystem.out.println(Arithmetic.PI);//okSystem.out.println(a.PI);//ok}} 接口一个接口可以继承自另一个接口。Java中不允许类的多继承,但允许接口的多继承。http://www.sunxin.orgDownload:http://www.cnxhacker.net Sofa.javainterfaceSittable{voidsit();}interfaceLie{voidsleep();}interfaceChairextendsSittable{}interfaceSofaextendsSittable,Lie{}http://www.sunxin.orgDownload:http://www.cnxhacker.net 接口在Java中,一个类可以实现多个接口。一个类在继承另外一个类的同时,可以实现多个接口。http://www.sunxin.orgDownload:http://www.cnxhacker.net Sofa.java//实现多个接口interfaceSittable{voidsit();}interfaceLie{voidsleep();}classSofaimplementsSittable,Lie{publicvoidsit(){}publicvoidsleep(){}}http://www.sunxin.orgDownload:http://www.cnxhacker.net Sofa.java//在继承类的同时,实现多个接口interfaceSittable{voidsit();}interfaceLie{voidsleep();}interfaceHealthCare{voidmassage();}classChairimplementsSittable{publicvoidsit(){};}classSofaextendsChairimplementsLie,HealthCare{publicvoidsleep(){};publicvoidmassage(){};} 内部类在一个类中定义另外一个类,这个类就叫做内部类或内置类(innerclass)。内部类可以让我们将逻辑上相关的一组类组织起来,并由外部类(outerclass)来控制内部类的可见性。当我们建立一个innerclass时,其对象就拥有了与外部类对象之间的一种关系,这是通过一个特殊的thisreference形成的,使得内部类对象可以随意的访问外部类中所有的成员。http://www.sunxin.orgDownload:http://www.cnxhacker.net classOuter{privateintindex=100;voidprint(){Inneri=newInner();i.print();}classInner{voidprint(){System.out.println(index);}}}classTest{publicstaticvoidmain(String[]args){Outero=newOuter();o.print();}}othisimaino.printi.printthis…栈内存堆内存Outer类对象Inner类对象Outer.thishttp://www.sunxin.orgDownload:http://www.cnxhacker.net 内部类在方法中定义的内部类,如果要访问方法中定义的本地变量或方法的参数,则变量必须被声明final。内部类可以声明为private或protected;还可以声明为abstract或final。内部类可以声明为static的,但此时就不能再使用外部类的非static的成员变量和非static的成员方法;非static的内部类中的成员不能声明为static的,只有在顶层类或static的内部类中才可声明static成员。http://www.sunxin.orgDownload:http://www.cnxhacker.net 内部类我们为什么使用内部类1、在内部类(innerclass)中,可以随意的访问外部类的成员,这可以让我们更好地组织管理我们的代码,增强代码的可读性。2、内部类可以用于创建适配器类,适配器类是用于实现接口的类。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。3、内部类的更多用法。http://www.sunxin.orgDownload:http://www.cnxhacker.net 异常类的层次结构http://www.sunxin.orgDownload:http://www.cnxhacker.net 异常处理打开一个不存在的文件、网络连接中断、数组下标越界、正在加载的类文件丢失等都会引发异常。Java中的异常类定义了程序中遇到的轻微的错误条件。Java中的错误类定义了程序中不能恢复的严重错误条件。如内存溢出、类文件格式错误等。这一类错误由Java运行系统处理,不需要我们去处理。http://www.sunxin.orgDownload:http://www.cnxhacker.net 异常处理Java程序在执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。try/catch/finally语句。http://www.sunxin.orgDownload:http://www.cnxhacker.net 异常处理对于RuntimeException,通常不需要我们去捕获,这类异常由Java运行系统自动抛出并自动处理。如果父类中的方法抛出多个异常,则子类中的覆盖方法要么抛出相同的异常,要么抛出异常的子类,但不能抛出新的异常(注:构造方法除外)。我们可以在方法声明时,声明一个不会抛出的异常,Java编译器就会强迫方法的使用者对异常进行处理。这种方式通常应用于abstractbaseclass和interface中。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java编程规范package的命名package的名字由全部小写的字母组成,例如:cn.mybole。class和interface的命名class和interface的名字由大写字母开头而其他字母都小写的单词组成,例如:Person,RuntimeException。class变量的命名变量的名字用一个小写字母开头,后面的单词用大写字母开头,例如:index,currentImage。class方法的命名方法的名字用一个小写字母开头,后面的单词用大写字母开头,例如:run(),getBalance()。staticfinal变量的命名staticfinal变量的名字所有字母都大写,并且能表示完整含义。例如:PI,PASSWORD。参数的命名参数的名字和变量的命名规范一致。数组的命名数组应该总是用这样的方式来命名:byte[]buffer。http://www.sunxin.orgDownload:http://www.cnxhacker.net 附:JVM规格描述JVM定义了控制Java代码解释执行和具体实现的五种规格JVM指令系统JVM寄存器JVM栈结构JVM碎片回收堆JVM存储区http://www.sunxin.orgDownload:http://www.cnxhacker.net 附:JVM规格描述JVM指令系统JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由操作码和操作数两部分组成。操作码为8位二进制数,操作数紧随在操作码的后面,其长度根据需要而不同。操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的“与”,ret用于流程控制,表示从对某一方法的调用中返回。当长度大于8位时,操作数被分为两个以上字节存放。JVM采用了“bigendian”的编码方式来处理这种情况,即高位bits存放在低字节中。这同Motorola及其他的RISCCPU采用的编码方式是一致的,而与Intel采用的“littleendian”的编码方式即低位bits存放在低位字节的方法不同。Java指令系统是以Java语言的实现为目的设计的,其中包含了用于调用方法和监视多线程系统的指令。http://www.sunxin.orgDownload:http://www.cnxhacker.net 附:JVM规格描述JVM寄存器所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度。然而,如果虚拟机中的寄存器比实际CPU的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。针对这种情况,JVM只设置了4个最为常用的寄存器。它们是:pc程序计数器optop操作数栈顶指针frame当前执行环境指针vars指向当前执行环境中第一个局部变量的指针所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。http://www.sunxin.orgDownload:http://www.cnxhacker.net 附:JVM规格描述JVM栈结构作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息: 局部变量 执行环境 操作数栈局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。 执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是执行一个方法的控制中心。例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。操作数栈用于存储运算所需操作数及运算的结果。http://www.sunxin.orgDownload:http://www.cnxhacker.net 附:JVM规格描述JVM碎片回收堆Java类的实例(对象)所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和HotJava环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。http://www.sunxin.orgDownload:http://www.cnxhacker.net 附:JVM规格描述JVM存储区JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。http://www.sunxin.orgDownload:http://www.cnxhacker.net Lesson4主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 主要内容Java的常用包“==”和“equals”的用法基本数据类型与引用类型String和StringBuffer对象的克隆(clone)数组的相关操作封装类Runtime类与Process类Class类设计模式http://www.sunxin.orgDownload:http://www.cnxhacker.net Java的常用包java.applet:包含一些用于创建Java小应用程序的类。java.awt:包含一些用于编写与平台无关的图形界面(GUI)应用程序的类。java.io:包含一些用作输入输出(I/O)处理的类。java.lang:包含一些Java语言的基本类与核心类,如String、Math、Integer、System和Runtime,提供常用的功能,这个包中的所有类是被隐式导入的。java.net:包含用于建立网络连接的类,与java.io同时使用完成与网络有关的读写。java.util:包含一些实用工具类和数据结构类。http://www.sunxin.orgDownload:http://www.cnxhacker.net “==”和“equals”的用法在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。“==”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象的内存分配图栈内存堆内存str1str2abcabc0088:44000088:44000088:46600088:4660str1标识的对象str2标识的对象当我们声明一个引用类型变量时,系统只为该变量分配了引用空间,并未创建一个具体的对象;当用new为对象分配空间后,将对象的引用赋值给引用变量。http://www.sunxin.orgDownload:http://www.cnxhacker.net Stringstr=“abc”;inti=3;floatf=4.5f;charch='a';booleanb=true;System.out.println(str+i+f+ch+b);针对String的“+”和“+=”,是Java中唯一被重载的操作符;在Java中,不允许程序员重载操作符。String和StringBufferhttp://www.sunxin.orgDownload:http://www.cnxhacker.net String和StringBufferString类对象一个常量对象。Stringstr=“abc”;str=“def”;在处理大量字符串的程序中,我们通常用StringBuffer来替代String。http://www.sunxin.orgDownload:http://www.cnxhacker.net 数组的内存分配图基本数据类型一维数组内存分配栈内存堆内存numc0000088:44000088:4400newint[3]产生的对象http://www.sunxin.orgDownload:http://www.cnxhacker.net 数组的内存分配图基本数据类型一维数组内存分配栈内存堆内存numc000null0088:4400newint[3]产生的对象num=null;http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象数组的内存分配栈内存堆内存studentsnullStudent[]students; 对象数组的内存分配堆内存studentsc0088:44000088:4400newstudents[3]产生的对象nullnullStudent[]students;students=newStudent[3];null栈内存 对象数组的内存分配堆内存studentsc0088:44000088:4400newstudents[3]产生的对象nullnullStudent[]students;students=newStudent[3];students[0]=newStudent(“lisi”,18);student[0]标识的Student对象lisi180088:46600088:4660栈内存 函数的调用在Java中,传参时,都是以传值的方式进行。对于基本数据类型,传递的是数据的拷贝;对于引用类型,传递的引用的拷贝。http://www.sunxin.orgDownload:http://www.cnxhacker.net 函数的调用xmainchange…栈内存y4(3)3(4)43classStringTest{publicstaticvoidchange(intx,inty){x=x+y;y=x-y;x=x-y;}publicstaticvoidmain(String[]args){intx=3;inty=4;change(x,y);System.out.println("x="+x);System.out.println("y="+y);}}xyhttp://www.sunxin.orgDownload:http://www.cnxhacker.net 函数的调用ptmainchange…栈内存堆内存Point类的对象pt……0088:46600088:46600088:4660classStringTest{publicstaticvoidchange(Pointpt){pt.x=pt.x+pt.y;pt.y=pt.x-pt.y;pt.x=pt.x-pt.y;}publicstaticvoidmain(String[]args){Pointpt=newPoint();pt.x=3;pt.y=4;change(pt);System.out.println("x="+pt.x);System.out.println("y="+pt.y);}}classPoint{intx,y;}http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象的克隆(clone)为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。在派生类中覆盖基类的clone()方法,并声明为public。在派生类的clone()方法中,调用super.clone()。在派生类中实现Cloneable接口。http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象的克隆(clone)为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。http://www.sunxin.orgDownload:http://www.cnxhacker.net 数组的相关操作在Java中,所有的数组都有一个缺省的属性length,用于获取数组中元素的个数。数组的复制:System.arraycopy()。数组的排序:Arrays.sort()。在已排序的数组中查找某个元素:Arrays.binarySearch()。http://www.sunxin.orgDownload:http://www.cnxhacker.net 封装类针对八种基本数据类型定义的相应的引用类型-封装类。基本数据类型封装类booleanBooleanbyteByteshortShortintIntegerlongLongcharCharacterfloatFloatdoubleDoublehttp://www.sunxin.orgDownload:http://www.cnxhacker.net Class类在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。获取Class实例的三种方式:(1)利用对象调用getClass()方法获取该对象的Class实例;(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例;(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例。http://www.sunxin.orgDownload:http://www.cnxhacker.net Class类在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。newInstance()调用类中缺省的构造方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net Runtime类和Process类每一个Java程序都有一个Runtime类的单一实例。通过Runtime.getRuntime()获取Runtime类的实例。Runtime类是使用单例模式的一个例子。http://www.sunxin.orgDownload:http://www.cnxhacker.net 设计模式在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式。每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案。当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。http://www.sunxin.orgDownload:http://www.cnxhacker.net 设计模式单例(Singleton)模式(1)一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。(2)单例类的一个最重要的特点是类的构造方法是私有的,从而避免了外部利用构造方法直接创建多个实例。http://www.sunxin.orgDownload:http://www.cnxhacker.net 单例类的实现classSingleton{privatestaticfinalSingletonst=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnst;}}http://www.sunxin.orgDownload:http://www.cnxhacker.net 设计模式参考书籍《Java与模式》作者:阎宏电子工业出版社出版http://www.sunxin.orgDownload:http://www.cnxhacker.net Lesson5多线程主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 程序、进程和线程程序是计算机指令的集合,它以文件的形式存储在磁盘上。进程:是一个程序在其自身的地址空间中的一次执行活动。进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。http://www.sunxin.orgDownload:http://www.cnxhacker.net 单线程程序与多线程程序单线程程序多线程程序一个线程两个线程http://www.sunxin.orgDownload:http://www.cnxhacker.net Java对多线程的支持Java在语言级提供了对多线程程序设计的支持。实现多线程程序的两种方式:(1)从Thread类继承;(2)实现Runnable接口。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java对多线程的支持Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行。在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优先级的线程变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得运行的机会。Java线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换。Java运行时系统所在的操作系统(例如:Windows2000)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。http://www.sunxin.orgDownload:http://www.cnxhacker.net 线程的同步Thecodesegmentswithinaprogramthataccessthesameobjectfromseparate,concurrentthreadsarecalled“criticalsections”。同步的两种方式:同步块和同步方法每一个对象都有一个监视器,或者叫做锁。同步方法利用的是this所代表的对象的锁。每个class也有一个锁,是这个class所对应的Class对象的锁。http://www.sunxin.orgDownload:http://www.cnxhacker.net 线程的死锁哲学家进餐的问题线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。http://www.sunxin.orgDownload:http://www.cnxhacker.net wait、notify、notifyAll每一个对象除了有一个锁之外,还有一个等待队列(waitset),当一个对象刚创建的时候,它的对待队列是空的。我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。wait和notify主要用于producer-consumer这种关系中。http://www.sunxin.orgDownload:http://www.cnxhacker.net 线程的状态NewRunnableNotRunnableDeadnewThreadstartsleep、wait、suspend、I/O阻塞sleep结束、notify、resume、I/O操作完成run方法退出stop方法调用stop方法调用yieldhttp://www.sunxin.orgDownload:http://www.cnxhacker.net 线程的终止设置一个flag变量。结合interrupt()方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net JavaLanguageSpecification网址:http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.htmlhttp://www.sunxin.orgDownload:http://www.cnxhacker.net Lesson6集合类主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 集合框架中的接口所谓框架就是一个类库的集合。集合框架就是一个用来表示和操作集合的统一的架构,包含了实现集合的接口与类。http://www.sunxin.orgDownload:http://www.cnxhacker.net 集合框架中的接口Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。Set:不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。Map:包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。http://www.sunxin.orgDownload:http://www.cnxhacker.net 集合框架中的实现类SortedSetSetListMapHashSetLinkedHashSetTreeSetArrayListLinkedListSortedMapHashMapTreeMaphttp://www.sunxin.orgDownload:http://www.cnxhacker.net ArrayListArrayList:我们可以将其看作是能够自动增长容量的数组。利用ArrayList的toArray()返回一个数组。Arrays.asList()返回一个列表。迭代器(Iterator)给我们提供了一种通用的方式来访问集合中的元素。http://www.sunxin.orgDownload:http://www.cnxhacker.net 迭代器的工作原理返回的元素删除的元素next()remove()next()http://www.sunxin.orgDownload:http://www.cnxhacker.net Collections类排序:Collections.sort()(1)自然排寻(naturalordering);(2)实现比较器(Comparator)接口。取最大和最小的元素:Collections.max()、Collections.min()。在已排序的List中搜索指定的元素:Collectons.binarySearch()。http://www.sunxin.orgDownload:http://www.cnxhacker.net LinkedListLinkedList是采用双向循环链表实现的。利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-endedqueue)。http://www.sunxin.orgDownload:http://www.cnxhacker.net 数据结构一般将数据结构分为两大类:线性数据结构和非线性数据结构。线性数据结构有线性表、栈、队列、串、数组和文件;非线性数据结构有树和图。http://www.sunxin.orgDownload:http://www.cnxhacker.net 线性表线性表的逻辑结构是n个数据元素的有限序列:(a1,a2,a3,…an)n为线性表的长度(n≥0),n=0的表称为空表。数据元素呈线性关系。必存在唯一的称为“第一个”的数据元素;必存在唯一的称为“最后一个”的数据元素;除第一个元素外,每个元素都有且只有一个前驱元素;除最后一个元素外,每个元素都有且只有一个后继元素。所有数据元素在同一个线性表中必须是相同的数据类型。http://www.sunxin.orgDownload:http://www.cnxhacker.net 线性表线性表按其存储结构可分为顺序表和链表。用顺序存储结构存储的线性表称为顺序表;用链式存储结构存储的线性表称为链表。将线性表中的数据元素依次存放在某个存储区域中,所形成的表称为顺序表。一维数组就是用顺序方式存储的线性表。http://www.sunxin.orgDownload:http://www.cnxhacker.net 链表单向链表datanextdatanextdatanext=nullhead节点http://www.sunxin.orgDownload:http://www.cnxhacker.net 链表datanextdatanextdatanext=nullhead节点插入datanextdatanextdatanextdatanext=nullhead节点删除http://www.sunxin.orgDownload:http://www.cnxhacker.net 链表循环链表datanextdatanextdatanexthead节点http://www.sunxin.orgDownload:http://www.cnxhacker.net 链表双向循环链表datanextdatanextdatanexthead节点previouspreviousprevioushttp://www.sunxin.orgDownload:http://www.cnxhacker.net 栈栈(Stack)也是一种特殊的线性表,是一种后进先出(LIFO)的结构。栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。栈的物理存储可以用顺序存储结构,也可以用链式存储结构。a1a2an…栈底栈顶出栈进栈http://www.sunxin.orgDownload:http://www.cnxhacker.net 队列队列(Queue)是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。表中允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。队列的操作是按先进先出(FIFO)的原则进行的。队列的物理存储可以用顺序存储结构,也可以用链式存储结构。a1a2a3…an队头队尾出队入队http://www.sunxin.orgDownload:http://www.cnxhacker.net ArrayList和LinkedList的比较ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表(double-linkedlist)完成,其内每个对象除了数据本身外,还有两个引用,分别指向前一个元素和后一个元素。如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速。http://www.sunxin.orgDownload:http://www.cnxhacker.net HashSet实现Set接口的hashtable(哈希表),依靠HashMap来实现的。我们应该为要存放到散列表的各个对象定义hashCode()和equals()。http://www.sunxin.orgDownload:http://www.cnxhacker.net 散列表散列表又称为哈希表。散列表算法的基本思想是:以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中的地址。当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除。在Java语言中,通过负载因子(loadfactor)来决定何时对散列表进行再散列。例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行再散列。负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间越长。负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多。HashSet类的缺省负载因子是0.75。http://www.sunxin.orgDownload:http://www.cnxhacker.net TreeSetTreeSet是依靠TreeMap来实现的。TreeSet是一个有序集合,TreeSet中元素将按照升序排列,缺省是按照自然顺序进行排列,意味着TreeSet中元素要实现Comparable接口。我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象。http://www.sunxin.orgDownload:http://www.cnxhacker.net HashSet和TreeSet的比较HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。http://www.sunxin.orgDownload:http://www.cnxhacker.net HashMapHashMap对key进行散列。keySet()、values()、entrySet()。http://www.sunxin.orgDownload:http://www.cnxhacker.net TreeMapTreeMap按照key进行排序。http://www.sunxin.orgDownload:http://www.cnxhacker.net HashMap和TreeMap的比较和Set类似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的时候,才使用TreeMap。http://www.sunxin.orgDownload:http://www.cnxhacker.net Java1.0/1.1的集合类Vector:用ArrayList代替Vector。Hashtable:用HashMap代替Hashtable。Satck:用LinkedList代替Stack。Propertieshttp://www.sunxin.orgDownload:http://www.cnxhacker.net Lesson7I/O主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net File类一个File类的对象,表示了磁盘上的文件或目录。File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作。http://www.sunxin.orgDownload:http://www.cnxhacker.net 流式I/O流(Stream)是字节的源或目的。两种基本的流是:输入流(InputStream)和输出流(OutputStream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。http://www.sunxin.orgDownload:http://www.cnxhacker.net 流的分类节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。http://www.sunxin.orgDownload:http://www.cnxhacker.net InputStream三个基本的读方法abstractintread():读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。intread(byte[]b):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。intread(byte[]b,intoff,intlen):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。其它方法longskip(longn):在输入流中跳过n个字节,并返回实际跳过的字节数。intavailable():返回在不发生阻塞的情况下,可读取的字节数。voidclose():关闭输入流,释放和这个流相关的系统资源。voidmark(intreadlimit):在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。voidreset():返回到上一个标记。booleanmarkSupported():测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。http://www.sunxin.orgDownload:http://www.cnxhacker.net java.io包中InputStream的类层次InputStreamStringBufferInputStreamFileInputStreamByteArrayInputStreamFilterInputStreamObjectInputStreamPipedInputStreamSequenceInputStreamLineNumberInputStreamDataInputStreamBufferedInputStreamPushbackInputStreamhttp://www.sunxin.orgDownload:http://www.cnxhacker.net OutputStream三个基本的写方法abstractvoidwrite(intb):往输出流中写入一个字节。voidwrite(byte[]b):往输出流中写入数组b中的所有字节。voidwrite(byte[]b,intoff,intlen):往输出流中写入数组b中从偏移量off开始的len个字节的数据。其它方法voidflush():刷新输出流,强制缓冲区中的输出字节被写出。voidclose():关闭输出流,释放和这个流相关的系统资源。http://www.sunxin.orgDownload:http://www.cnxhacker.net java.io包中OutputStream的类层次OutputStreamFileOutputStreamByteArrayOutputStreamFilterOutputStreamObjectOutputStreamPipedOutputStreamPrintStreamDataOutputStreamBufferedOutputStreamhttp://www.sunxin.orgDownload:http://www.cnxhacker.net 基本的流类FileInputStream和FileOutputStream节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。BufferedInputStream和BufferedOutputStream过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。DataInputStream和DataOutputStream过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。PipedInputStream和PipedOutputStream管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。http://www.sunxin.orgDownload:http://www.cnxhacker.net JavaI/O库的设计原则Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。我们要获取一个I/O对象,往往需要产生多个I/O对象,这也是JavaI/O库不太容易掌握的原因,但在I/O库中Decorator模式的运用,给我们提供了实现上的灵活性。http://www.sunxin.orgDownload:http://www.cnxhacker.net I/O流的链接FileInputStreamBufferedInputStreamDataInputStream数据DataOutputStreamBufferedOutputStreamFileOutputStream数据从文件中获取输入字节增加了缓冲的功能增加了读取Java基本数据类型的功能InputStreamChainOutputStreamChain可以往输出流中写入Java基本数据类型提供数据写入到缓冲区的功能将数据写入到文件中http://www.sunxin.orgDownload:http://www.cnxhacker.net Reader和WriterJava程序语言使用Unicode来表示字符串和字符。Reader和Writer这两个抽象类主要用来读写字符流。http://www.sunxin.orgDownload:http://www.cnxhacker.net java.io包中Reader的类层次ReaderBufferedReaderCharArrayReaderFilterReaderPipedReaderStringReaderFileReaderLineNumberReaderPushbackReaderInputStreamReaderhttp://www.sunxin.orgDownload:http://www.cnxhacker.net java.io包中Writer的类层次WriterBufferedWriterCharArrayWriterFilterWriterPipedWriterPrintWriterFileWriterOutputStreamWriterStringWriterhttp://www.sunxin.orgDownload:http://www.cnxhacker.net 字符集的编码ASCII(AmericanStandardCodeforInformationInterchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。每一个ASCII码与一个8位(bit)二进制数对应。其最高位是0,相应的十进制数是0-127。如,数字“0”的编码用十进制数表示就是48。另有128个扩展的ASCII码,最高位都是1,由一些制表符和其它符号组成。ASCII是现今最通用的单字节编码系统。GB2312:GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集-基本集》。主要用于给每一个中文字符指定相应的数字,也就是进行编码。一个中文字符用两个字节的数字来表示,为了和ASCII码有所区别,将中文字符每一个字节的最高位置都用1来表示。GBK:为了对更多的字符进行编码,国家又发布了新的编码系统GBK(GBK的K是“扩展”的汉语拼音第一个字母)。在新的编码系统里,除了完全兼容GB2312外,还对繁体中文、一些不常用的汉字和许多符号进行了编码。ISO-8859-1:是西方国家所使用的字符编码集,是一种单字节的字符集,而英文实际上只用了其中数字小于128的部分。http://www.sunxin.orgDownload:http://www.cnxhacker.net 字符集的编码Unicode:这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。如“a”的ASCII码为0x61,UNICODE就为0x00,0x61。UTF-8:Eight-bitUCSTransformationFormat,(UCS,UniversalCharacterSet,通用字符集,UCS是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的UTF码是三个字节。http://www.sunxin.orgDownload:http://www.cnxhacker.net RandomAccessFileRandomAccessFile类同时实现了DataInput和DataOutput接口,提供了对文件随机存取的功能,利用这个类可以在文件的任何位置读取或写入数据。RandomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下一数据的位置。http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象序列化将对象转换为字节流保存起来,并在日后还原这个对象,这种机制叫做对象序列化。将一个对象保存到永久存储设备上称为持续性。一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。http://www.sunxin.orgDownload:http://www.cnxhacker.net 对象序列化当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。http://www.sunxin.orgDownload:http://www.cnxhacker.net 总结InputStream和OutputStream:字节流的输入输出。Reader和Writer:字符流的输入输出。流的链接(JavaI/O库的设计原则)http://www.sunxin.orgDownload:http://www.cnxhacker.net Java图形界面编程主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net AWTAWT(AbstractWindowToolkit),抽象窗口工具包,SUN公司提供的用于图形界面编程(GUI)的类库。基本的AWT库处理用户界面元素的方法是把这些元素的创建和行为委托给每个目标平台上(Windows、Unix、Macintosh等)的本地GUI工具进行处理。例如:如果我们使用AWT在一个Java窗口中放置一个按钮,那么实际上使用的是一个具有本地外观和感觉的按钮。这样,从理论上来说,我们所编写的图形界面程序能运行在任何平台上,做到了图形界面程序的跨平台运行。http://www.sunxin.orgDownload:http://www.cnxhacker.net 布局管理器容器里组件的位置和大小是由布局管理器来决定的。容器对布局管理器的特定实例保持一个引用。当容器需要定位一个组件时,它将调用布局管理器来完成。当决定一个组件的大小时,也是如此。在AWT中,给我们提供了五种布局管理器:BorderLayoutFlowLayoutGridLayoutCardLayoutGridBagLayouthttp://www.sunxin.orgDownload:http://www.cnxhacker.net 布局管理器我们可以通过设置空布局管理器,来控制组件的大小和位置。调用setLayout(null)。在设置空布局管理器后,必须对所有的组件调用setLocation(),setSize()或setBounds(),将它们定位在容器中。http://www.sunxin.orgDownload:http://www.cnxhacker.net AWT事件模型Events(事件):描述发生了什么的对象。Eventsource(事件源):事件的产生器。Eventhandlers(事件处理器):接收事件对象、解释事件对象并处理用户交互的方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net AWT事件模型JDK1.0的事件模型:层次模型FramePanelButtonActioneventhttp://www.sunxin.orgDownload:http://www.cnxhacker.net AWT事件模型JDK1.1的事件模型:委托模型事件监听器:实现了监听器接口的类。一个监听器对象是一个实现了专门的监听器接口的类的实例。FramePanelButtonFrameandPaneleventhandlersActionevent事件监听器actionPerformed(ActionEvente){}Actionhandlershttp://www.sunxin.orgDownload:http://www.cnxhacker.net Java基础类JFC(JavaFoundationClasses):Java基础类,是关于GUI组件和服务的完整集合,主要包含5个API:AWT、Java2D、Accessibility、Drag&Drop、Swing。JFC提供了帮助开发人员设计复杂应用程序的一整套应用程序开发包。Java2D是一套图形API,它为Java应用程序提供了一套高级的有关二维(2D)图形图像处理的类。Java2DAPI扩展了java.awt和java.awt.image类,并提供了丰富的绘图风格,定义了复杂图形的机制和精心调节绘制过程的方法和类。这些API使得独立于平台的图形应用程序的开发更加简便。AccessibilityAPI提供了一套高级工具,用以辅助开发使用非传统输入和输出的应用程序。它提供了一个辅助的技术接口,如:屏幕阅读器,屏幕放大器,听觉文本阅读器(语音处理)等等。Drag&Drop技术提供了Java和本地应用程序之间的互操作性,用来在Java应用程序和不支持Java技术的应用程序之间交换数据。JFC模块的重点在Swing。Swing用来进行基于窗口的应用程序开发,它提供了一套丰富的组件和工作框架,以指定GUI如何独立于平台地展现其视觉效果。http://www.sunxin.orgDownload:http://www.cnxhacker.net Swing的体系架构http://www.sunxin.orgDownload:http://www.cnxhacker.net Lesson9Applet主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net Applet是什么Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类。Applet不需要main()方法,由Web浏览器中内嵌的Java虚拟机调用执行。http://www.sunxin.orgDownload:http://www.cnxhacker.net Applet的安全限制因为applet是从远端服务器上下载并且在本地执行,所以安全性就显得格外重要。通过限制applet在沙箱(applet的运行环境)中运行,保证了对本地系统而言applet是安全的。applet在沙箱中运行时:⑴不能运行任何本地可执行程序;⑵除了存放下载的applet的服务器外,applet不能和其它主机进行通信。⑶不能对本地文件系统进行读写。http://www.sunxin.orgDownload:http://www.cnxhacker.net Applet的生命周期init():当浏览器加载applet,进行初始化的时候调用该方法。start():在init()方法之后调用。当用户从其它页面转到包含applet的页面时,该方法也被调用。stop():在用户离开包含applet的页面时被调用。destroy():当applet不再被使用,或浏览器退出的时候,该方法被调用。http://www.sunxin.orgDownload:http://www.cnxhacker.net paint()方法Applet本质上是图形方式的,我们应该在图形环境中绘制我们的显示内容。我们可以通过创建一个paint()方法在Applet的panel上绘图。只要Applet的显示需要刷新,paint()方法就会被浏览器环境调用。例如,当Applet的显示尺寸发生变化的时候,或浏览器窗口被最小化或被要求以图标方式显示时,这种调用就会发生。我们应该编写自己的paint()方法,以使它在任何时候被调用,都能正常地工作。对它的调用是异步产生的,且由Applet的运行环境而不是程序来驱动。paint()方法带有一个参数,它是java.awt.Graphics类的一个实例。这个参数总是建立该Applet的panel的图形上下文,我们可以用这个图形上下文在Applet中绘图或写入文本。http://www.sunxin.orgDownload:http://www.cnxhacker.net 字符的各种属性ghascentdescentbaselineleadingheightascentlinedescentlinehttp://www.sunxin.orgDownload:http://www.cnxhacker.net applet从网页中获取信息正如应用程序可以通过命令行参数来获取信息一样,通过使用param标记,applet可以从网页中获取信息。http://www.sunxin.orgDownload:http://www.cnxhacker.net Applet和浏览器的通信在浏览器中显示信息调用AppletContext接口中的showStatus()方法请求浏览器显示指定的网页调用AppletContext接口中的showDocument()方法。http://www.sunxin.orgDownload:http://www.cnxhacker.net AWT绘图更新显示由一种被称为AWT线程的独立的线程来完成。这个线程可用来处理与显示更新相关的两种情况。第一种情况是显露(exposure),它在首次显示时,或在部分显示已被破坏而必须刷新时出现。显示的破坏可能发生在任何时刻,因此,我们的程序必须能在任意时刻更新显示。第二种情况是在程序重画带有新内容的画面时。这种重画可能会要求首先擦除原来的图像。http://www.sunxin.orgDownload:http://www.cnxhacker.net AWT绘图paint(Graphicsg)方法当组件第一次显示,或受损的部分需要修复时被调用。除非必要,更新不会完全覆盖整个图形区域,而是严格限制在被破坏的范围内。repaint()方法对repaint()的调用可通知系统:你想改变显示,于是系统将调用paint()。update(Graphicsg)方法repaint()实际上产生了一个调用另一方法update()的AWT线程。update方法通常清除当前的显示并调用paint()。update()方法可以被修改,例如:为了减少闪烁可不清除显示而直接调用paint()。http://www.sunxin.orgDownload:http://www.cnxhacker.net repaint()、update()和paint()的关系http://www.sunxin.orgDownload:http://www.cnxhacker.net applet的HTML标记和属性用于定位的applet属性⑴width和height:必要的属性,以象素为单位,设定applet的宽度和高度。⑵align:可选的属性,指定applet对齐的方式。left:把applet放在网页左边,后面的文本会移至applet的右边。right:把applet放在网页右边,后面的文本会移至applet的左边。bottom:把applet的底部与当前行文本底部对齐。top:把applet的顶部与当前行顶部对齐。texttop:把applet的顶部与当前行文本顶部对齐。middle:把applet的中部与当前行基线对齐。absmiddle:把applet的中部与当前行中部对齐。baseline:把applet的底部与当前行基线对齐。absbottom:把applet的底部与当前行底部对齐。⑶vspace和hspace:可选的属性,指定在applet上/下的象素数目(vspace)和applet两边的象素数目(hspace)。http://www.sunxin.orgDownload:http://www.cnxhacker.net applet的HTML标记和属性用于编码的applet属性⑴code:指定applet类文件的名字。该名字要么是相对于codebase,那么是相对于当前页面。⑵codebase:可选的属性,告诉浏览器到哪个目录下去寻找类文件。⑶archive:可选的属性,列出Java存档文件、包含类文件的文件或者applet需要的其它资源。⑷object:用来指定applet类文件的另外一个方法。⑸name:可选的属性,页面脚本编写人员希望赋予applet名字属性,这样,在编写脚本的时候,就可以用为该属性指定的名字来代表这个applet。http://www.sunxin.orgDownload:http://www.cnxhacker.net 网络编程主讲人:孙鑫http://www.sunxin.orgDownload:http://www.cnxhacker.net 计算机网络计算机网络是相互连接的独立自主的计算机的集合,最简单的网络形式由两台计算机组成。http://www.sunxin.orgDownload:http://www.cnxhacker.net 两台计算机通过网络进行通信AB网络192.168.0.118192.168.0.10协议协议端口端口http://www.sunxin.orgDownload:http://www.cnxhacker.net IP地址IP网络中每台主机都必须有一个惟一的IP地址;IP地址是一个逻辑地址;因特网上的IP地址具有全球唯一性;32位,4个字节,常用点分十进制的格式表示,例如:192.168.0.16http://www.sunxin.orgDownload:http://www.cnxhacker.net 协议为进行网络中的数据交换(通信)而建立的规则、标准或约定。(=语义+语法+规则)不同层具有各自不同的协议。http://www.sunxin.orgDownload:http://www.cnxhacker.net 网络的状况多种通信媒介——有线、无线……不同种类的设备——通用、专用……不同的操作系统——Unix、Windows……不同的应用环境——固定、移动……不同业务种类——分时、交互、实时……宝贵的投资和积累——有形、无形……用户业务的延续性——不允许出现大的跌宕起伏。它们互相交织,形成了非常复杂的系统应用环境。http://www.sunxin.orgDownload:http://www.cnxhacker.net 网络异质性问题的解决网络体系结构就是使这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂,它营造了一种“生存空间”——任何厂商的任何产品、以及任何技术只要遵守这个空间的行为规则,就能够在其中生存并发展。网络体系结构解决异质性问题采用的是分层方法——把复杂的网络互联问题划分为若干个较小的、单一的问题,在不同层上予以解决。就像我们在编程时把问题分解为很多小的模块来解决一样。http://www.sunxin.orgDownload:http://www.cnxhacker.net ISO/OSI七层参考模型OSI(OpenSystemInterconnection)参考模型将网络的不同功能划分为7层。应用层表示层物理层会话层传输层网络层数据链路层处理网络应用数据表示主机间通信端到端的连接寻址和最短路径介质访问(接入)二进制传输http://www.sunxin.orgDownload:http://www.cnxhacker.net ISO/OSI七层参考模型通信实体的对等层之间不允许直接通信。各层之间是严格单向依赖。上层使用下层提供的服务—Serviceuser;下层向上层提供服务—Serviceprovider。http://www.sunxin.orgDownload:http://www.cnxhacker.net 对等通信示例“你好”“Hello”传真中国教师翻译秘书“Hallo”“Hello”传真德国教师翻译秘书对交谈内容的共识用英语对话使用传真通信P3P2P1物理通信线路http://www.sunxin.orgDownload:http://www.cnxhacker.net 对等层通信的实质对等层实体之间虚拟通信。下层向上层提供服务,实际通信在最底层完成。http://www.sunxin.orgDownload:http://www.cnxhacker.net OSI各层所使用的协议应用层:远程登录协议Telnet、文件传输协议FTP、超文本传输协议HTTP、域名服务DNS、简单邮件传输协议SMTP、邮局协议POP3等。传输层:传输控制协议TCP、用户数据报协议UDP。TCP:面向连接的可靠的传输协议。UDP:是无连接的,不可靠的传输协议。网络层:网际协议IP、Internet互联网控制报文协议ICMP、Internet组管理协议IGMP。http://www.sunxin.orgDownload:http://www.cnxhacker.net 数据封装一台计算机要发送数据到另一台计算机,数据首先必须打包,打包的过程称为封装。封装就是在数据前面加上特定的协议头部。数据数据协议头http://www.sunxin.orgDownload:http://www.cnxhacker.net 数据封装OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU,ProtocolDataUnit)。OSI参考模型中每一层都要依靠下一层提供的服务。为了提供服务,下层把上层的PDU作为本层的数据封装,然后加入本层的头部(和尾部)。头部中含有完成数据传输所需的控制信息。这样,数据自上而下递交的过程实际上就是不断封装的过程。到达目的地后自下而上递交的过程就是不断拆封的过程。由此可知,在物理线路上传输的数据,其外面实际上被包封了多层“信封”。但是,某一层只能识别由对等层封装的“信封”,而对于被封装在“信封”内部的数据仅仅是拆封后将其提交给上层,本层不作任何处理。http://www.sunxin.orgDownload:http://www.cnxhacker.net TCP/IP模型TCP/IP起源于美国国防部高级研究规划署(DARPA)的一项研究计划——实现若干台主机的相互通信。现在TCP/IP已成为Internet上通信的工业标准。TCP/IP模型包括4个层次:应用层传输层网络层网络接口http://www.sunxin.orgDownload:http://www.cnxhacker.net TCP/IP与OSI参考模型的对应关系应用层表示层会话层传输层物理层数据链路层网络层7654321OSI参考模型应用层传输层网络接口网络层TCP/IP模型http://www.sunxin.orgDownload:http://www.cnxhacker.net 端口端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,端口通常称为协议端口(protocolport),简称端口。端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务。例如:http使用80端口。http://www.sunxin.orgDownload:http://www.cnxhacker.net 套接字(socket)的引入为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。http://www.sunxin.orgDownload:http://www.cnxhacker.net 基于TCP的socket编程ServerServerServerSocket(intport)Socketaccept()OutputStreamSocket.getOutputStream()InputStreamSocket.getInputSream()Socket.close()ClientSocket(InetAddressaddress,intport)OutputStreamSocket.getOutputStream()InputStreamSocket.getInputStream()Socket.close()服务器程序编写:①调用ServerSocket(intport)创建一个服务器端套接字,并绑定到指定端口上;②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。③调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。④最后关闭通信套接字。客户端程序编写:①调用Socket()创建一个流套接字,并连接到服务器端;②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。③最后关闭通信套接字。 基于UDP的socket编程接收端(Server)发送端(Client)DatagramSocket(intport)DatagramSocket()DatagramPacket(byte[]buf,intlength)DatagramSocket.receive(DatagramPacketp)DatagramSocket.close()DatagramSocket.close()DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)DatagramSocket.send(DatagramPacketp)接收端程序编写:①调用DatagramSocket(intport)创建一个数据报套接字,并绑定到指定端口上;②调用DatagramPacket(byte[]buf,intlength),建立一个字节数组以接收UDP包。③调用DatagramSocket类的receive(),接收UDP包。④最后关闭数据报套接字。发送端程序编写:①调用DatagramSocket()创建一个数据报套接字;②调用DatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport),建立要发送的UDP包。③调用DatagramSocket类的send(),发送UDP包。④最后关闭数据报套接字。 URL与URIURL(UniformResourceLocator),通用资源定位符。http://www.mybole.com.cn/index.asp就是一个URL。URI(UniformResourceIdentifier),通用资源标识符。URI纯粹是个符号结构,用于指定构成Web资源的字符串的各个不同部分。URL是一种特殊类型的URI,它包含了用于查找某个资源的足够信息。其它的URI,例如:mailto:myoble@mybole.com.cn则不属于定位符,因为它里面不存在根据该标识符来查找的任何数据。这种URI称为URN(通用资源名)。在Java库中,URI类不包含用于访问通用资源标识符设定的任何方法,它的唯一作用是进行分析。相反,URL类则可以打开到达资源的一个字符串。http://www.sunxin.orgDownload:http://www.cnxhacker.net
此文档下载收益归作者所有