Java程序设计复习纲要-chapters_第1页
Java程序设计复习纲要-chapters_第2页
Java程序设计复习纲要-chapters_第3页
Java程序设计复习纲要-chapters_第4页
Java程序设计复习纲要-chapters_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

62/62Java程序设计复习纲要-chapters《Java语言程序设计(第2版)》复习纲要(Java语言程序设计郑莉编著/2017)Java语言基础知识面向对象语言的基本特征抽象和封装:抽象的结果形成类,类中的数据和方法是受保护的,可以根据需要设置不同的访问控制属性。这便保证了数据的安全性,隐藏了方法的实现细节,也方便了使用。继承性:可以对已有类增加属性和功能,或进行部分修改来建立新的类,实现代码的重用。多态性:在面向对象的程序中,同一个消息被不同对象接收后可以导致不同的行为。Java平台Java平台包括Java应用程序接口(API)和Java虚拟机(Javavirtualmachine,JVM)。Java应用程序接口是指经过编译的,可在程序中直接使用的Java代码标准库。Java虚拟机负责解释和执行Java程序。Java程序运行于Java平台之上,Java虚拟机将程序和硬件隔离开来。Java程序的字节码文件的扩展名是.class。变量的作用域变量的作用域指可以访问该变量的程序代码范围。按照作用域的不同,变量可以分为类成员变量和局部变量。类成员变量在类的声明体中声明,其作用域为整个类;局部变量在方法体或方法的代码块中声明,其作用域为它所在的代码块(即花括号{}的范围)。基本数据类型(基本数据类型有几种?分别是什么?)基本数据类型是指Java固有的数据类型,可以分为数字型、布尔型和字符型数字型基本数据类型有六种:byte、short、int、long、float、double。类型转换的分类类型转换可以分成扩展转换和窄化转换两类。byte,short,int,long,float,double

char扩展double,float,long,int,short,byte,char窄化按照扩展方向转化,从一种整型转换到另一种整型,或者从float转换到double时,不损失任何信息。从整型转换到float或者double将损失精度。窄化转换可能会丢失信息。发生类型转换的四种可能情况赋值转换方法调用转换强制类型转换字符串转换数组的概念数组是由同类型的数据元素构成的一种数据结构。数据元素可以是基本数据类型也可以是引用类型。通过数组名和数组元素下标(或称为索引)可以引用数组中的元素。每个数组都有一个名为length的成员变量,用来表示数组所包含的元素的个数,length只能是正整数或零。数组创建之后length就不能被改变。数组的创建和引用数组的声明声明数组时无需指明数组元素的个数,也不为数组元素分配内存空间;不能直接使用,必须经过初始化分配内存后才能使用。声明一维数组的语法形式为:Type[]arrayName;或:TypearrayName[];数组的创建用关键字new构成数组的创建表达式,可以指定数组的类型和数组元素的个数。元素个数可以是常量也可以是变量。语法格式为:arryName=newType[componetsnumber];或者可以将数组的声明和创建一并执行,如:intai[]=newint[10];也可以在一条声明语句中创建多个数组,例如:String[]s1=newString[3],s2=newString[8];数组元素的初始化声明数组名时,给出了数组的初始值,程序便会利用数组初始值创建数组并对它的各个元素进行初始化。例如:inta[]={22,33,44,55};数组的引用通过表达式引用数组的一个元素:arrayName[index]数组下标必须是int,short,byte或者char下标从零开始计数元素的个数即为数组的长度,可以通过arryName.length引用元素下标最大值为length-1,如果超过最大值,将会产生数组越界异常(ArrayIndexOutOfBoundsException)String的连接运算和length()、trim()。类与对象的基本概念封装封装是一种信息隐蔽技术,就是利用抽象数据类型将数据和基于数据的操作封装在一起。用户只能看到对象的封装界面信息,对象的内部细节对用户是隐蔽的。封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需使用设计者提供的消息来访问对象。封装就是将属性私有化,提供公有的方法访问私有属性。属性的访问方法包括setter方法和getter方法,setter方法用于赋值、getter方法用于取值。类和对象一个类是对一类对象的描述,类概括了同类对象的共有性质:属性和方法。类是构造对象的模板,对象是类的具体实例类的声明语法格式[public][abstract|final]class类名称 [extends父类名称] [implements接口名称列表]{ 变量成员声明及初始化; 方法声明及方法体;}说明:class:表明其后声明的是一个类extends:如果所声明的类是从某一父类派生而来,那么,父类的名字应写在extends之后implements:如果所声明的类要实现某些接口,那么,接口的名字应写在implements之后修饰符可以有多个,用来限定类的使用方式public:表明此类为公有类abstract:指明此类为抽象类final:指明此类为终结类对象的创建生成实例的格式:new<类名>()其作用是:在内存中为此对象分配内存空间,返回对象的引用(reference,相当于对象的存储地址)。数据成员数据成员表示Java类的状态。声明数据成员必须给出变量名及其所属的类型,同时还可以指定其他特性。在一个类中成员变量名是唯一的。数据成员的类型可以是Java中任意的数据类型(简单类型,类,接口,数组)。分为实例变量和类变量。数据成员的声明格式:[public|protected|private][static][final][transient][volatile]变量数据类型变量名1[=变量初值],变量名2[=变量初值],…;格式说明:public、protected、private为访问控制符static指明这是一个静态成员变量final指明变量的值不能被修改transient指明变量是临时状态volatile指明变量是一个共享变量实例变量没有static修饰的变量称为实例变量(InstanceVariables)。用来存储所有实例都需要的属性信息,不同实例的属性值可能会不同。可通过下面的表达式访问实例属性的值<实例名>.<实例变量名>类变量类变量也称为静态变量,声明时需加static修饰符。不管类的对象有多少,类变量只存在一份,在整个类中只有一个值。类初始化的同时就被赋值。适用情况:类中所有对象都相同的属性经常需要共享的数据系统中用到的一些常量值引用格式:<类名|实例名>.<类变量名>类变量与实例变量区别类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象。方法成员方法成员定义类的行为:一个对象能够做的事情我们能够从一个对象取得的信息可以没有,也可以有多个;一旦在类中声明了方法,它就成为了类声明的一部分。分为实例方法和类方法声明格式:[public|protected|private][static][final][abstract][native][synchronized]返回类型方法名([参数列表])[throwsexceptionList]{ 方法体}格式说明:方法修饰public、protected、private为存取控制符static指明方法是一个类方法。静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。final指明方法是一个终结方法abstract指明方法是一个抽象方法native用来集成java代码和其它语言的代码synchronized用来控制多个并发线程对共享数据的访问返回类型方法返回值的类型,可以是任意的Java数据类型当不需要返回值时,返回类型为void参数类型简单数据类型,引用类型(数组、类或接口)可以有多个参数,也可以没有参数,方法声明时的参数称为形式参数throwsexceptionList用来处理异常静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。包的作用将相关的源代码文件组织在一起;不同包中的类名可以相同,从而可以避免名字冲突;提供包一级的封装及存取权限。编译单元的组成所属包的声明(省略,则属于默认包);Import(引入)包的声明,用于导入外部的类;类和接口的声明。类的访问控制类的访问控制只有public(公共类)及无修饰符(缺省类)两种访问权限符与访问能力之间的关系如表类型无修饰public同一包中的类yesyes不同包中的类noyes类成员的访问控制类型private无修饰protectedpublic同一类yesyesyesyes同一包中的子类noyesyesyes同一包中的非子类noyesyesyes不同包中的子类nonoyesyes不同包中的非子类nononoyes关键字this的使用如果形式参数名与实例变量名相同,则需要在实例变量名之前加this关键字,否则系统会将实例变量当成形式参数。构造方法构造方法(Constructor)是一种特殊的方法。Java中的每个类都有构造方法,用来初始化该类的一个新的对象。构造方法具有和类名相同的名称,而且不返回任何数据类型。系统在产生对象时会自动执行。构造方法的特点(简述构造方法的特点)构造方法的方法名与类名相同;构造方法没有返回类型(修饰符void也不能有);构造方法通常被声明为公有的(public);构造方法可以有任意多个参数;构造方法的主要作用是完成对象的初始化工作;构造方法不能在程序中显式的调用;在生成一个对象时,系统会自动调用该类的构造方法为新生成的对象初始化。类的方法循环包括的几个部分初始化部分:用来设置循环的一些初始条件,如计数器清零等。循环体部分:这是反复执行的一段代码,可以是单一的一条语句,也可以是复合语句。迭代部分:这是当前循环结束,下次循环开始执行的语句,常常用来使计数器进行增减操作。终止部分:通常是布尔表达式,每一次循环要对该表达式求值,以验证是否满足循环终止条件。switch选择结构switch语句是多分支的选择结构switch(switch-expression){ casevalue1:statementsforcase1;break; casevalue2:statementsforcase2;break; ... casevalueN:statementsforcaseN;break; default:statementsfordefaultcase;break;}说明:switch-expression、常量值value1到valueN必须是整型或字符型;如果表达式的值和某个case后面的值相同,则从该case之后开始执行,直到break语句为止;default是可选的,若没有一个常量与表达式的值相同,则从default之后开始执行。break语句的用法break语句可用于三种情况:(跳出循环)在switch结构中,break语句用来终止switch语句的执行。在for循环及while循环结构中,用于终止break语句所在的最内层循环。break语句也可用在代码块中,用于跳出它所指定的块。do-while循环结构do-while语句,实现“直到型”循环一般语法结构如下do{ //bodyoftheloop;}while(check-expression);其使用与while语句很类似,不同的是它首先无条件的执行一遍循环体,再来判断条件表达式的值,若表达式的值为真,则再运行循环体,否则跳出do-while循环,执行下面的语句。特点:它的循环体至少要执行一次。异常的抛出和捕获当程序中发生异常时,称程序产生了一个异常事件,相应地生成异常对象。生成的异常对象传递给Java运行时系统。异常的产生和提交的这一过程称为抛出。异常发生时,Java运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯,寻找相应的处理代码,并把异常对象交给该方法处理,这一过程称为捕获。Java语言中,通常把可能发生异常的语句放到try块中,并用紧跟其后的catch块来捕获和处理异常。几个常见异常1.ArithmeticException:整数除法中除数为0。2.NullPointerException:访问的对象还没有实例化,那么访问该对象或调用它的方法将导致NullPointerException异常。3.ArrayIndexOutOfBoundsException:访问数组元素时,数组下标越界。异常的处理对于检查型异常,Java强迫程序必须进行处理,处理方法有以下两种:声明抛出异常:不在当前方法内处理异常,而是把异常抛出到调用方法中。捕获异常:使用try{}catch(){}块,捕获到所发生的异常,并进行相应的处理。方法的重载方法的重载(overloading)是指在一个类中可以有名字相同的多个方法,但这些方法的参数必须不同,或者是参数个数不同,或者是参数类型不同。返回值可以相同,也可以不同。类的重用继承继承是一种由已有的类创建新类的机制,是面向对象程序设计的基石之一。一个新类可以从现有的类中派生,这个过程称为类继承。派生出的新类称为已有类的子类,已有类称为超类(父类)。Java不支持多重继承。属性的隐藏子类对从父类继承来的属性变量重新加以定义,则从父类继承的属性将被隐藏。访问被隐藏的父类域有两种方法:调用从父类继承的方法,则操作的是从父类继承的域;使用super.域名属性的可见性有:公有、保护、私有和缺省四种。方法的覆盖如果子类不需要使用从父类继承来的方法的功能,则可以声明自己的方法。在声明的时候,使用相同的方法名及参数表,但执行不同的功能。这种情况称为方法覆盖。需要使用方法覆盖的情况子类中实现与父类相同的功能,但采用不同的算法或公式。在名字相同的方法中,要做比父类更多的事情。方法的覆盖与方法的重载有何不同?重载方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型来决定具体使用哪个方法,这就是多态性。重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。覆盖(重写)父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。子类函数的访问修饰权限不能比父类更严格。完成下面父类及子类的声明:声明Student类属性包括学号、姓名、英语成绩、数学成绩、计算机成绩和总成绩。方法包括构造方法、get方法、set方法、toString方法、equals方法、compare方法(比较两个学生的总成绩,结果分为大于、小于、等于)、sum方法(计算总成绩)和testScore方法(计算评测成绩)。注:评测成绩可以取三门课成绩的平均分,另外任何一门课的成绩的改变都需要对总成绩进行重新计算,因此,在每一个set方法中应调用sum方法计算总成绩。声明StudentXW(学习委员)类为Student类的子类。在StudentXW类中增加责任属性,并重写testScore方法(计算评测成绩,评测成绩=三门课的平均分+3)。声明StudentBZ(班长)类为Student类的子类。在StudentBZ类中增加责任属性,并重写testScore方法(计算评测成绩,评测成绩=三门课的平均分+5)。声明测试类,生成若干个Student类、StudentXW类及StudentBZ类对象,并分别计算它们的评测成绩。终结类如果一个类被final修饰符所修饰和限定,说明这个类不可能有子类,即final类不能有派生类。被声明为final的类通常是一些有固定作用、用来完成某种标准功能的类,不能被继承以达到修改的目的。在Java程序设计中,当引用一个类或其对象时实际真正引用的既可能确是这个类或其对象本身,也可能是这个类的某个子类及子类对象,即具有一定的不确定性。将一个类声明为final,则可以将它的内容、属性和功能固定下来,与它的类名形成稳定的映射关系,从而保证引用这个类时所实现功能的正确无误。final类存在的两个理由安全方面:黑客用来搅乱系统的一个手法是建立一个类的派生类,然后用他们的类代替原来的类。为了阻止各种颠覆活动,可以声明此类为final类,从而不能派生任何子类。设计方面:从面向对象设计方面,如希望声明的类为最终类,则最好或从概念上讲该类不应该有任何派生类。终结方法final修饰符所修饰的方法是功能和内部语句不能被更改的最终方法,即是不能被当前类的子类重载的方法。这样,就固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误重写,增加了代码的安全性和正确性。将方法声明为final的另一个原因是提高类的运行效率。通常,当Java运行环境运行方法时,它将首先在当前类中查找该方法,接下来在其超类中查找,并一直沿类层次向上查找,直到找到该方法为止。这提供了灵活性和开发工作的容易程度,但代价是速度更低。如果方法是final的,Java编译器可以将该方法可执行的字节码直接放到调用它的程序中。这样当程序调用它们时,执行速度将更快。抽象类抽象类不能用new方法进行实例化。当一个类被声明抽象类时,要在这个类前加修饰符abstract。抽象类可以包含常规类能够包含的任何东西,这包括构造方法。抽象类也可以包括抽象方法,这种方法只有方法的声明,而没有方法的实现。抽象类也可以包含非抽象方法,但不能在非抽象类中声明抽象方法。为什么要声明抽象类?抽象类是类层次中较高层次的概括,抽象类的作用是让其他类来继承它的抽象化特征;在抽象类中可以包括被它的所有子类共享的公共行为;抽象类可以包括被它的所有子类共享的公共属性;在程序中不能用抽象类作为模板来创建对象;在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性。抽象方法作为类方法修饰符,abstract声明了一种仅有方法头,而没有具体的方法体和操作实现的抽象方法,为该类的子类声明一个方法的接口标准。抽象方法体的具体实现是由当前类的不同子类在它们各自的类声明中完成的。抽象方法不能是静态方法、终结方法或私有方法。抽象方法的优点抽象方法可以隐藏具体的细节信息,使调用该方法的程序不必过分关注该类和它的子类的内部状况。方法头里实际包含了调用该方法的程序语句所需要了解的全部信息。抽象方法强迫子类完成指定的行为,抽象类的所有非抽象子类都必须完成其父类中声明的抽象方法,抽象类通常声明抽象方法规定其子类需要用到的“标准”行为。编写一程序计算二维几何形体的面积,所涉及的几何形体至少应包括圆、三角形、矩形。(类层次结构参见教材中图4-11)接口与多态接口接口与抽象类一样都是定义多个类的共同属性。接口使抽象的概念更深入了一层,是一个“纯”抽象类,它只提供一种形式,并不提供实现。允许创建者规定方法的基本形式:方法名、参数列表以及返回类型,但不规定方法主体。接口也可以包含基本数据类型的数据成员,但它们都默认为static和final。接口的语法:[接口修饰符]interface接口名称[<Type(,Type)>][Extends父接口名]{ ...//方法原型声明或静态常量}接口修饰符可以是public或者缺省。接口中只包含抽象方法和常量,不包括任何实现,所以与存储空间没有任何关系。声明接口类型的变量,并用它来访问对象举例interfaceShape2D{ doublepi=3.14; doublearea();}classCircleimplementsShape2D{ doubleradius; publicCircle(doubler){ radius=r; } publicdoublearea(){ return(pi*radius*radius); }}classRectangleimplementsShape2D{ intwidth,height; publicRectangle(intw,inth){ width=w; height=h; } publicdoublearea(){ return(width*height); }}publicclassVariableTester{ publicstaticvoidmain(String[]args) { Shape2Dvar1,var2; var1=newRectangle(5,6); System.out.println("Areaofvar1="+var1.area()); var2=newCircle(2.0); System.out.println("Areaofvar2="+var2.area()); }}输出结果Areaofvar1=30.0Areaofvar2=12.56多重继承Java不允许一个类有多个父类,但允许一个类实现多个接口,通过这种机制可以实现多重继承。多重继承举例interfaceShape2D{ //声明Shape2D接口 finaldoublepi=3.14; //数据成员一定要初始化 publicabstractdoublearea(); //抽象方法}interfaceColor{ voidsetColor(Stringstr); //抽象方法}classCircleimplementsShape2D,Color{ //实现Circle类逗号隔开 doubleradius; Stringcolor; publicCircle(doubler){ //构造方法 radius=r; } publicdoublearea(){ //定义area()的处理方式 return(pi*radius*radius); } publicvoidsetColor(Stringstr){ //定义setColor()的处理方式 color=str; System.out.println("color="+color); }}publicclassMultiInterfaceTester{ publicstaticvoidmain(Stringargs[]){ Circlecir; cir=newCircle(2.0); cir.setColor("blue"); System.out.println("Area="+cir.area()); }}输出结果color=blueArea=12.56对象的塑型类型转换也称为塑型。对象只能被塑型为:任何一个父类类型。任何一个子类的引用变量(或对象)都可以被当成父类引用变量(或对象)来对待;但反过来却不成立。对象所属的类实现的一个接口。虽然不能用接口生成对象,但可以声明接口的引用变量,接口的引用变量可以指向任何实现了此接口的类对象。或者回到它自己所在的类。一个对象被塑型为父类或接口后,还可以再被塑型回到它自己所在的类。塑型的应用场合塑型主要应用于:赋值转换赋值号右边的表达式类型或对象转换为左边的类型方法调用转换实参的类型转换为形参的类型算术表达式转换算术混合运算时,不同类型的项转换为相同的类型再进行运算字符串转换字符串连接运算时,如果一个操作数为字符串,一个操作数为数值型,则会自动将数值型转换为字符串多态多态性是指不同的类型的对象可以响应相同的消息。动态绑定举例classShape{ voiddraw(){} voiderase(){}}classCircleextendsShape{ voiddraw(){System.out.println("Circle.draw()");} voiderase(){System.out.println("Circle.erase()");}}classSquareextendsShape{ voiddraw(){System.out.println("Square.draw()");} voiderase(){System.out.println("Square.erase()");}}classTriangleextendsShape{ voiddraw(){System.out.println("Triangle.draw()");} voiderase(){System.out.println("Triangle.erase()");}}publicclassBindingTester{ publicstaticvoidmain(String[]args){ Shape[]s=newShape[9]; intn; for(inti=0;i<s.length;i++){ n=(int)(Math.random()*3); switch(n){ case0:s[i]=newCircle();break; case1:s[i]=newSquare();break; case2:s[i]=newTriangle(); } } for(inti=0;i<s.length;i++)s[i].draw(); }}将上例中,如果将Shape改为如下的抽象类,能否得到正确的结果?abstractclassShape{ abstractvoiddraw(); abstractvoiderase();}定义构造方法时应遵循的原则(有接口,有多态前提下)用尽可能少的动作把对象的状态设置好。如果可以避免,不要调用任何方法。在构造方法内唯一能够安全调用的是在基类中具有final属性的那些方法(也适用于private方法,它们自动具有final属性)。这些方法不能被覆盖,所以不会出现上述潜在的问题。输入输出I/O流的概念Java将信息的输入与输出过程抽象为输入输出流。输入是指数据流入程序,输出是指数据从程序流出。Java中的输入输出操作通常都是通过输入输出流实现的。一个流就是一个从源流向目的地的数据序列。输入输出流可以与各种数据源和目标相连。计算机中的流是流动的数据缓冲区。输入输出流的分类从流的方向划分:输入流或输出流从流的分工划分:节点流或处理流从流的内容划分:面向字符的流或面向字节的流面向字符的流——Reader和Writer类针对字符数据的特点进行过优化,提供一些面向字符的有用特性,源或目标通常是文本文件。InputStreamReader和OutputStreamWriter的工作原理InputStreamReader字符输入流。使用该流可以设置字符集,并按照指定的字符集从字节流中按照指定编码将字节数据转换为字符数据并读取。OutputStreamWriter字符输出流。使用该流可以设置字符集,并按照指定的字符集将字符转换为对应的字节后通过该流写出。字节流——InputStream和OutputStream类是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息。File类File类是IO包中唯一表示磁盘文件信息的对象,它定义了一些与平台无关的方法来操纵文件。通过调用File类提供的各种方法,能够创建文件、删除文件、重命名文件、判断文件的读写权限及其是否存在,设置和查询文件的最近修改时间等。在Java中,“目录”被看作文件。对象序列化概念对象是存在于内存中的。有时候我们需要将对象保存到硬盘上,又有时我们需要将对象传输到另一台计算机上等等这样的操作。这时我们需要将对象转换为一个字节序列,而这个过程就称为对象序列化。相反,我们有这样一个字节序列需要将其转换为对应的对象,这个过程就称为对象的反序列化。DataOutputStream类的方法RandomAccessFile类(随机访问)对象群体的组织对象数组的初始化(面向对象)对象数组的初始化分为静态初始化和动态初始化两种。静态初始化:在声明和定义数组的同时对数组元素进行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00), newBankAccount(“Li",2380.00), newBankAccount(“Wang",500.00), newBankAccount(“Liu",175.56), newBankAccount(“Ma",924.02)};动态初始化:使用运算符new,需要经过两步:首先给数组分配空间 typearrayName[]=newtype[arraySize];然后给每一个数组元素分配空间 arrayName[0]=newtype(paramList); … arrayName[arraySize-1]=newtype(paramList);数组的优缺点数组是Java提供的随机访问对象序列的最有效方法,数组是一个简单的线性序列,访问元素的速度较快,但是其缺点是数组大小自创建以后就固定了,在数组对象的整个生存期内其大小不可改变。而且,数组元素只能是同一类型。Java集合框架接口Java集合框架接口的基本结构如下图:Collection接口中声明了很多抽象方法,这些方法可分为查询方法及修改方法。Set接口是一个不含重复元素的集合,是数学中“集合”的抽象。实现接口List的类中的元素是有顺序的、可以包含重复元素、且每个元素都有一个index值(从0开始)标明元素在列表中的位置。Map是一个从关键字到值的映射对象,Map中不能有重复的关键字(key),每个关键字最多能够映射到一个值。SortedSet是一种特殊的Set,其中的元素是升序排列的,并且还增加了与次序相关的操作,通常用于存放词汇表这样的内容。SortedMap是一种特殊的Map,其中的关键字是升序排列的,通常用于词典和电话目录等。Collection接口LinkedList、Vector、Stack、ArrayList、HashSet、TreeSet中,哪些类中的元素不可重复,哪些类中的元素可以重复?Vector和ArrayList类Vector/ArrayList是实现了Collection接口的具体类,其功能如下:能够存储任意对象,但通常情况下,这些不同类型的对象都具有相同的父类或接口不能存储基本类型(primitive)的数据,除非将这些数据包裹在包裹类中其容量能够根据空间需要自动扩充增加元素方法的效率较高,除非空间已满,在这种情况下,在增加之前需要先扩充容量Vector方法是同步的,线程安全ArrayList方法是非同步的,效率较高Enumerationelements()——返回Vector中所有元素的Enumeration类对象。Enumeration类(枚举类)实例方法:hasMoreElements()——判断是否还有剩下的元素;nextElement()——取得下一个元素。Iterator类实例方法:hasNext()——判断是否还有元素;next()——取得下一个元素;remove()——去除一个元素。List接口实例importjava.util.*;publicclassTestList{ publicstaticvoidmain(Stringargs[]){ Listlist=newArrayList(); list.add("China"); list.add("Russia");(从0/1开始) list.add(1,"India");(覆盖或后移) list.add(1,"Brazil"); printList(list); } publicstaticvoidprintList(Listlist){ for(Objecto:list){ System.out.print(o+""); } System.out.println(); }}程序执行的结果:ChinaBrazilIndiaRussia多线程多线程一个独立程序的每一次运行称为一个进程。进程要占用相当一部分处理器时间和内存资源。进程具有独立的内存空间,通信很不方便,编程模型比较复杂。一个程序中多段代码同时并发执行,称为多线程。线程比进程开销小,协作和数据交换容易。用Thread类创建线程使用Runnable接口创建线程使用Runnable接口的好处间接解决了多继承问题;与Thread类相比,Runnable接口更适合于多个线程处理同一资源线程调度在单CPU系统中,多个线程需要共享CPU,在任何时间点上实际只能有一个线程在运行。控制多个线程在同一个CPU上以某种顺序运行称为线程调度。多线程的同步控制关键字同步方法同时运行的几个线程需要共享一个(些)数据,并且要考虑到彼此的状态和动作。线程的几种基本状态线程的几个基本状态及它们之间的转化线程启动并进入就绪状态一个新线程的生命从新建一个线程类对象开始,此时线程只是一个空的线程对象,并没有为其分配系统资源。当线程处于这个状态时,只可以对其进行start操作。执行了start方法后,系统才为新线程创建了资源,并自动调用其run函数,线程将处于等待CPU资源的就绪状态。运行状态获得了CPU资源的线程就进入了运行状态。死亡状态在线程的run方法结束时,处于运行状态的线程就进入了死亡状态。在线程处于死亡状态、并且没有该线程对象的引用时,垃圾收集器能够从内存中删除该线程对象。阻塞状态处于执行状态的线程由于需要等待某种资源或条件而不得不暂停运行,进入阻塞状态。线程的生命周期:线程的生命周期从新建开始,在就绪、运行、阻碍(休眠阻塞、等待阻塞、对象锁阻塞)中循环,最终在运行后run()方法结束后终止。线程运行过程中,可能由于各种原因进入阻塞状态。线程通过调用sleep方法进入睡眠状态;线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;线程试图得到一个锁,而该锁正被其他线程持有;线程在等待某个触发条件;……用于线程的主要方法Thread类常用API:publicvoidstart()publicvoidrun()publicfinalvoidstop()publicvoidstaticyield()//让出publicfinalvoidsetPrority(intnewPriority)publicstaticvoidsleep(longmillis)publicfinalbooleanisAlive()Object类中用于线程通信的主要方法publicfinalvoidwait()publicvoidnotify()publicvoidnotifyAll()后台线程后台线程(也叫守护线程)通常是为了辅助其它线程而运行的线程,它不妨碍程序的终止。图形用户界面Swing的组件和容器层次。Swing提供三个顶层容器的类:JF

温馨提示

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

评论

0/150

提交评论