《01 Java编程基础.doc》由会员分享,可在线阅读,更多相关《01 Java编程基础.doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java程序设计基础第一节 变量和数据类型所有Java变量都具有一个数据类型。变量的类型决定了变量的值以及参与的操作。变量定义的一般形式为:type variable_list;其中的type是某种有效的Java 类型,variable_list是变量列表,它由一个或多个变量名组成。当有多个变量时,各变量之间用逗号隔开,变量名必须是合法的Java标识符。Java语言提供了两种变量类型:基本类型和复合类型。基本类型是那些简单的不能被分解的类型,有时也被称为简单类型。Java基本类型包括数值型、布尔型和字符型三种。参见表1。表1 Java的基本变量类型基本变量类型长 度说 明Byte8bit字节长
2、度整数Short16bit短整数Int32bit一般整数Long64bit长整数Float32bit单精度浮点数Double64bit双精度浮点数Char16bit单字符BooleanN/A布尔值(true或false)复合类型在Java中也叫做引用类型。事实上,复合类型数据的值是指向实际数据的指针。数组、类、接口都是复合类型。Java语言中变量名的约定与一般标识符相同,需要区别于程序语言中的保留字,并在其作用域内与其他变量不重名。为习惯起见,变量名以小写字母开头(类名以大写字母开头)。若要在Java程序中使用变量,首先必须说明该变量。例如:Int iX,iY=0,iZ;String sBig
3、,sCity=Beijing;第二节 运算符和表达式运算符是表达式中常用的特殊符号。算术运算和相等及大小的测定式是常用的表达式例子。由于它们会返回一个值,因此可以将它的结果赋值给一个变量,或者在其他Java语句中测定该值。Java中的运算符包括l 算术运算符,参见表2l 关系运算符,参见表3l 条件运算符,参见表4l 位运算符,参见表5l 逻辑运算符,参见表6表2 算术运算符运算符用 法说 明+op1 + op2加(或是字符串的连接)-op1 - op2减*op1 * op2乘/op1 / op2除%op1 % op2余数+op; op+递增1-op; op-递减1表3 关系运算符运算符用 法
4、如果满足以下条件,则返回trueop1 op2op1大于op2=op1 = op2op1大于等于op2 op2op1小于op2=op1 op1 op2将op1右移op2op1 op1 op2将op1右移op2(无符号)&op1 & op2二进制与|op1 | op2二进制或op1 op2二进制异或op二进制非表6 赋值运算符运算符用 法等价于+=op1 += op2op1 = op1 + op2-=op1 -= op2op1 = op1op2*=op1 *= op2op1 = op1 * op2/=op1 /= op2op1 = op1 / op2%=op1 % = op2op1 = op1
5、% op2 =op1 = op2op1 = op1 op2 =op1 = op2op1 = op1 =op1 = op2op1 = op1 op2& =op1 & = op2op1 = op1 & op2| =op1 | = op2op1 = op1 | op2 =op1 = op2op1 = op1 op2Java各运算符的优先级定义如下:, ,( )+,-,!,-,instanceofnew,(type)*,/,%+, , = =,! =&|& &| |?:=,+ =,=,* =,/ =,% =, =& =,| =, =, =表达式是实际完成某项工作的Java语句的最简单的形式,是能够返回
6、值的语句。一个表达式包含有一个或多个操作,操作的对象称作运算元,而操作本身是通过运算符来体现的。只有一个运算符称作一元运算符。而二元运算符是具有两个运算元的运算符。表达式在计算时完成一个或多个操作,最终得到一个结果。除去特别声明外,表达式的结果是一个右值,即不能出现在赋值运算的左边,而结果的数据类型则由参加运算的数据类型来决定。当表达式中有两个或多个运算符时,该表达式称作复杂表达式。其中运算符执行的先后顺序由它们的优先级和结合性决定。最简单的表达式只有一个变量式常量。这个运算元没有运算符。例如,下面是几个简单的表达式:3.1415926chinaPersonNamea + b!var这里不对J
7、ava表达式做详细地介绍,感兴趣则可以查阅相关的书籍或资料。第三节 控制语句Java的控制语句包括条件、循环和转移三种。1. 条件语句条件语句也称为选择语句,用于实现选择结构,它包括if和switch两个语句。(1) if语句if语句的一般格式为:if(expression) statement;else statement;其中的语句项statement可以是一个单独的语句,也可以是用一对括起来的语句块。Else从句是可选的。注意在Java中if语句的条件判断表达式的值必须是一个布尔类型。上面if语句和else子句的语句项中可以包含另一个if语句,就是说可以实现多重嵌套的if语句。If(bE
8、ngineOn=true)System.out.println(Engine is already on. );else System.out.println(Now starting Engine . );If(gasLevel=1)BengineOn = true;ElseSystem.out.println(Low on gas! Cant start engine . );(2) switch语句switch语句根据表达式的值来执行多个操作中的一个,它的一般格式如下:switch (expression)case value1 : statement1;break;case value
9、2 : statement2;break;case valueN : statemendN;break;default : defaultStatement; l 表达式expression可以返回任一简单类型的值(如整型、实型、字符型),switch语句把表达式返回的值与每个case子句中的值相比。如果匹配成功,则执行该case子句后的语句序列。l case子句中的值value1必须是常量,而且所有case子句中的值是不同的。l default子句是任选的。当表达式的值与任一case子句中的值都不匹配时,程序执行default后面的语句。如果表达式的值与任一case子句中的值都不匹配且没有d
10、efault子句,则程序不作任何操作,而是直接跳出switch语句。l break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行。因为case子句只是起到一个标号的作用,用来查找匹配的入口处从此处开始执行,对后面的case子句不再进行匹配,而是直接执行其后的语句序列,因此该在每个case分支后,要用break来终止后面的case分支语句的执行。在一些特殊情况下,多个不同的case值要执行一组相同的操,这时可以不用break。l case分支中包括多个执行语句时,可以不用大括号括起。l switch语句的功能可以用if-else来实现,但在某些情况下
11、,使switch语句更简炼,可读性强,而且程序的执行效率提高。2. 循环语句循环语句也称为迭代语句,用于实现需要重复执行的控制结构,它包括while、for和do-while三个语句。循环语句的作用是反复执行一段代码,直到满足终止循环的条件为止,一个循环一般应包括四部分内容:l 初始化部分(initialization):用来设置循环的一些初始条件,如计数器清零等。l 循环体部分(body):这是反复循环的一段代码,可以是单一的一条语句,也可以是复合语句。l 迭代部分(iteration):这是在当前循环结束,下一次循环开始时执行的语句,常常用来使计数器加1或减1。l 终止部分(termina
12、tion):通常是一个布尔表达式,每一次循环要对该表达式求值,以验证是否满足循环终止条件。(1) while语句 while语句实现“当型”循环,它的一般格式为:initializationwhile (termination)body;iteration;l 当布尔表达式(termination)的值为true时,循环执行大括号中语句。并且初始化部分和迭代部分是任选的。l while语句首先计算终止条件,当条件满足时,才去执行循环体中的语句。这是“当型”循环的特点。例如:int iCount = 0;while(iCount iArray.length&iArrayiCount!=0)iAr
13、ray1iCount = (float)iArrayiCount+;(2) do-while语句 do-while语句实现直到型循环,它的一般格式为:initializationdo body;iteration; while (termination);l do-while语句首先执行循环体,然后计算终止条件,若结果为true,则循环执行大括号中的语句,直到布尔表达式的结果为false。l 与while语句不同的是,do-while语句的循环体至少执行一次,这是“直到型”循环的特点。例如:int iX = 1;doSystem.out.println(Looping,round +iX);i
14、X+;while(iX=5)下面是上一个程序段的输出:Loop,round 1Loop,round 2Loop,round 3Loop,round 4Loop,round 5(3) for语句 for语句也用来实现“当型”循环,它的一般格式为: for (initialization; termination; iteration) body; l initialization是对循环的开始进行初始化的一个表达式。如果有一个循环指数,那么这个表达式可以对它进行说明和初始化,例如:int iLoopIndex=0。在for循环中的这部分中说明的变量均属该循环本身内部的变量,当循环完成后,它们便不
15、存在。l termination是在每次通过循环之后和循环指数递增之前进行的测试。该测试必须是布尔表达式或布尔函数,它可以返回一个布尔值,比如iLoopIndex10。如果测试结果返回true,便执行该循环。如果测试结果是false,该循环便停止执行。l iteration是对任何表达式或函数的调用。通常情况下,递增用于改变循环指数的值,使循环的状态更接近于返回false,从而退出该循环。l 在初始化部分和迭代部分可以使用逗号语句,来进行多个操作。逗号语句是用逗号分隔的语句序列。例如:for( i=0, j=10; ij; i+, j-)l 初始化、终止以及迭代部分都可以为空语句(但分号不能省
16、),三者均为空的时候,相当于一个无限循环。3. 转移语句转移语句用于实现控制的转移,它包括break、continue和return三个转移语句。(1) continue语句continue语句用来结束本次循环,跳过循环体中下面尚未执的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件判断前,还要先执行迭代语句。它的格式为:continue ;也可以用continue跳转到括号指明的外层循环中,这时的格式为continue outerLable; 例如:outer: for( int i=0; i10; i+ ) 外层循环for( int j=0; j20; j+
17、 ) 内层循环if( ji )continue outer;该例中,当满足ji的条件时,程序执行完相应的语句后跳转至外层循环,执行外层循环的迭代语句i+;然后开始下一次循环。(2) return语句return语句从当前方法中返回到调用该方法的语句处,并为方法返回一个返回值,语句继续程序的执行。返回语句有两种格式:l return expression 返回一个值给调用该方法的语句,返回值的数据类型必须在方法声明中的返回值类型一致。可以使用强制类型转换来使类型一致。l return 当方法说明中用void声明返回类型为空时,应使用这种格式,则不返回任何值。return语句通常用在一个方法体的最
18、后,以退出该方法并返回一个值。Java中,单独的return语句用在一个方法体的中间时,会产生编译错误,因为这时会有一些语句执行不到。但可以通过把return语句嵌入某些语句(如if-else)来使程序在未执行完方法中的所有语句时退出。例如:int method (int num) return num; will cause compile time errorif (num0)return num; may or may not be executeddepending on the value of num(3) break语句Java的break语句的用途是从一个封闭的语句,如swit
19、ch开关语句或循环中跳出,使程序从封闭语句后的第一个语句开始执行。在Java中,可以为每个代码块加一个括号,一个代码块通常用大括号括起来的一段代码。加标号的格式如下:BlockLabel: codeBlock break语句的第二种使用情况就是跳出它所指定的块,并从紧跟该块的第一条语句处执行。其格式为:break BlockLabel;例如:a: /标记代码块ab: /标记代码块bc: /标记代码块cbreak b; /will not be executed /will not be executed /execute from here与C、C+不同,Java中没有goto语句来实现任意的
20、跳转,因为goto语句破坏程序的可读性,而且影响编译的优化。但是从上例可以看出,Java用break来实现goto语句所特有的一些优点。如果break后所指定的标号不是一个代码块的标号,而是一个语句,则这时break完全实现goto的功能。第四节Java面向对象的程序设计因为JSP程序设计会使用到标准的Java语言,所以本节对Java程序设计语言进行简单的介绍。4.1对象对象是一个具有状态和行为的软件模块。对象的状态包含在其成员变量中,对象的行为通过其方法来实现。通常,在Java中可以以类为原型建立多个对象,这些对象通过发送消息相互影响,消息传递的结果是产生行为或修改指定对象的状态。通过对象的
21、交互,Java程序可以实现图形用户界面、运行动画、在网上传递信息等任务。对象一旦完成了它的工作,其资源被回收并循环使用。在Java中是通过类来创建具体对象的,即对象通过实例化类来实现。使用new运算符创建新的对象,例如:Date today = new Date();这条语句做了三件事情:1. 把today这个变量定义成一个类型为Date的对象;2. 实例化一个新的Date类的对象;3. 初始化这个对象。对象的定义语法如下:type name;type是类名,用来说明对象所属的类,name是对象名。例如:Date today;对象的定义不是建立对象的必需部分,通常在对象的建立语句中包含了对象的
22、定义。定义并没有实例化该对象。对象一般用new运算符进行实例化,它只要求一个单一的参数。例如:new Rectangle(0,0,100,100);在例子中,Rectangle(0,0,100,100)是对Rectangle类中的构造方法的调用。所有的Java类都有一个特殊的方法叫构造函数(构造方法),用来初始化该类的新对象。构造函数和该类有相同的名字。一个类可以提供多个构造函数,以便对新的对象进行不同的初始化,不同的构造函数是通过不同的参数而区分的。例如:public Rectangle();public Rectangle(intValue,intValue);public Rectang
23、le(intValue,intValue, intValue,intValue);对象的引用有两种方法:1. 直接修改它的变量intValue;引用对象的变量与引用C的结构的元素相似,其方法是在对象名后跟需要引用的变量,中间用.将它们连结起来。如:objectReference.variable通过这种引用可以检查或修改对象的变量,例如有一个名叫rectgl的Rectangle对象,则可以用rectgl.x和rectgl.y分别引用rectgl对象的x和y变量,并可通过这种引用去检查或修改它们。例如:rectgl.x = 12;rectgl.y = 38;2. 调用该对象中定义的方法move(
24、)。调用对象中的方法与引用它的数据成员很相似。方法的调用也使用圆点符号。例如:objectReference.method();所有方法的后面都必须配以圆括号,即使该方法不包含参数。例如:rectgl.move(15,40)当对象不再被访问,空间将要被回收时,Java运行环境通过调用finalize()方法使对象终结,这个方法也叫作析构。Finalize()是java.lang.Object类中的成员之一。finalize()方法可以显式调用。4.2类类是组成Java程序的基本要素。它封装了一类对象的状态和方法,是这一类对象的原型。例如HelloorldApp类的定义如下所示:public c
25、lass HelloWorldApppublic static void main( String args )System.out.println(Hello World !);可以看出,一个类的实现包含两部分的内容,类的说明和类的类体:classDeclaration classBody类的说明包括class、类名及其属性,类的属性为一些关键字,用以说明类属于那个基类、类的访问权限、是否为抽象类等信息:modifiersclass ClassName extends SuperClassNameimplements InterfaceName List其中:l modifiers:类的修饰
26、符,可以是抽象类、公共类、最终类、私有类以及它们的组合;l ClassName:类名;l Extends子句:说明类的父类,其中SuperClassName是父类名;l Implements子句:说明类中将实现的界面,其中InterfaceName List是一个用逗号分隔的界面列表。类的类体中定义了该类所有的变量和该类所支持的方法。如下所示:class className memberVariableDeclarationsmethodDeclarations定义成员变量至少包括两部分:变量的数据类型和变量名。accessSpecifier static final transient vo
27、latile type variableName其中:l accessSpecifier:定义了其他类或对象是否可以存取该变量;l static:指明该变量是一个类成员变量而不是一个实例成员变量;l final:指明该变量是一个常数;l transient:指明该变量不维持该对象的持久状态,其值不需保存;l volatile:指明该变量是可以被其他方法异步修改的;l variableName:变量名。例如:Bicycle类class Bicycle extends PersonPoweredVehicleString m_sBikeType;Int m_iChainGear;Int m_iRe
28、arCogs;Int m_iCurrentGearFront;Int m_iCurrentGearRear;上面的例子显示了Bicycle类的一个简单类定义,它继承了PersonPoweredVehicle类的特性。这个类定义包含4个数据成员。方法的实现包括两部分,即方法的说明和方法体。方法的说明定义了方法名、方法返回值的类型、所需参数的个数和类型以及可调用该方法的其他类或对象。实现方法的一般形式为:returntype methodname(type1 arg1,type2 arg2,type3 arg3.)methodBodyl 其中returntype是该方法返回值的基本数据类型或类。它
29、可以是基本数据类型之一,也可以是一个类名称,如果该方法不返回任何值,则为void。l 方法的参数列表是用引号括起来的一组变量说明,各个变量说明之间用逗号隔开。这些参数将成为方法本身中的局部变量,它们的值是调用方法时传送的对象或基本数据类型的值。l 在方法的内部,可以包含语句、表达式、对该类中的其他方法的调用方法以及对其他对象的调用方法等等。下例定义了一个Point类,并且声明了它的两个变量x、y坐标,同时实现init()方法对x和y赋初值。class Ponit int x,y;void init(int ix, int iy)x=ix;y=iy;下面是定义了一个makeRange()方法的类
30、的例子。Class RangeClassInt makeRange(int iLower,int iUpper)Int iArr = new int(iUpper - iLower) + 1;For(int I = 0 ; I iArr.length; I+)IArrI = iLower+;return iArr;public static void main(String iArg )int iTheArray ;RangeClass theRange = new RangeClass();TheArray = theRange.makeRange(1,10);For(int I=0;IiT
31、heArray.length;I+)System.out.print(iTheArrayI);在Java中,当使用对象参数调用一个方法时,传递到方法体中的变量是由对象的引用来传递的。也就是说,无论对方法中的这些对象执行何种操作,都会影响到原始的对象,包括数组以及数组中的所有对象。如果将一个数组传递到一个方法中,并修改它的内容,则原始数组也会受到影响。方法调用中参数的传递方式是值传递。Java语言对于方法和实例对象提供了四个显式级别的保护:Public、Protected、Private、Package。除这四种访问权限指示符外,还有一种不需要显式说明的friendly指示符, friendly
32、并不是 Java的关键字,它不能被用来显式说明。l 私有访问(Private)私有访问是用关键字Private说明的。私有访问意味着方法或变量仅能被同一个类中的其他方法使用。l 公共访问(Public)公有访问是用关键字Public说明的。公共访问意味着方法或变量能被任何包中的任何类来存取。l 保护访问(Protected)保护访问是用关键字Protected说明的。保护访问意味着方法或变量能允许该类本身、其子类以及同一程序包中的所有其他类来对它进行存取。l 友好访问(friendly)友好访问是用关键字friendly说明的。被定义为友好访问的方法或变量允许同一程序包中的所有类对它进行存取。
33、例如:/ PassByRefrence类:class PassByRefrenceint OneToZero(int iSg )int iCount = 0;for(int I = 0 ; IiSg.length; I+)if(iSgI = = 1)iCount + +;iSgI = 0;return iCount;/ PassByRefrence类的main()方法:public static void main(String arg )int iArr = 1,3,4,5,1,1,7;PassByRefrence test = new PassByRefrence();Int iNums;
34、System.out.print(Values of the array: );For(int I = 0; I iArr.length; I+)System.out.print(iArrI + );System.out.println() );INums = test.OneToZero(arr);System.out.println(Number of Ones = + iNums);System.out.print(New values of the array: );For(int I = 0; I iArr.length; I+)System.out.print(iArrI + );
35、System.out.println() );程序的输出结果为:Values of the array: 1 3 4 5 1 1 7Numbers of Ones = 3New values of the array: 0 3 4 5 0 0 74.3子类、父类和继承与其他面向对象的程序设计语言类似,Java的类可以从已定义的类中派生出来。被派生出来的类称为子类,而已定义的类则称为父类。Java定义子类的方法是在子类名后加extends关键字,例如下面代码段由Animal类创建一个称为Dog的子类。Class Dog extends Animal这样就定义了Animal类的子类Dog。子类可以
36、从父类中继承成员变量的方法,也就是说,在子类中可直接使用父类中定义的成员变量和方法。子类将继承父类中的如下成员变量和方法:l 被定义为公用的、私有的或保护的成员变量和方法。l 同一个程序包中的父类的友好变量和方法。子类可以直接应用、修改或重载父类中定义的变量和方法。当子类希望替换或添加父类的一个方法体时,它可以用相同的方法名来重载父类中已经定义过的方法。但是,子类不能重载在父类中被定义为final的方法。在子类中也同样不能重载在父类中被定义为static的方法,也就是说,子类不能重载其父类的静态方法。在父类中定义成abstract的方法的实现细节必须由子类来完成,所以,子类必须对这些 abst
37、ract 方法进行重载。请看下面的程序实例:/ PrintClass类Class PrintClassInt m_iX = 0;Int m_iY = 1;Void printMe()System.out.println(m_iX is + m_iX + , m_iY is + m_iY);System.out.println(I am an instance of class + this.getClass().getName();/ PrintSubClass类Class PrintSubClass extends PrintClassInt m_iZ = 3;Public static v
38、oid main(String args )PrintSubClass obj = new PrintSubClass();Obj.printMe();PrintSubClass类继承了PrintClass类的printMe()方法。下面是PrintSubClass输出:X is 0, Y is 1I am an instance of the class PrintSubClass再来看一种情况:/ PrintSubClass2类Class PrintSubClass2 extends PrintClassInt m_iZ = 3;Void printMe()System.out.print
39、ln(m_iX is + m_iX + , m_iY is + m_iY + , m_iZ is + m_iZ);System.out.println(I am an instance of class + this.getClass().getName();public static void main(String args )PrintSubClass2 obj = new PrintSubClass2();Obj.printMe();PrintSubClass2类与PrintSubClass类基本相同,只是重新定义了printMe()方法,输出结果为:M_iX is 0, m_iY i
40、s 1, m_iZ is 3I am an instance of the class PrintSubClass2不能再派生子类的类叫做最终类。定义一个类为最终类,在它的定义的前面加上final关键字。final关键字通常出现在保护关键字中,如public或private的后面。public final class FinalClassname将一个类声明为final的,出于两个原因:l 防止其他人对你的类进行子类扩展。l 为了获得更高的效率。由于安全原因而定义为最终类的有:java.lang.System、.InetAddress和.Socket。例如:final class Fmmfin
41、al int value = 3;final int Fmm(int a,int b)抽象类的目的是为子类提供公共信息。声明抽象类用关键字abstract:public abstract class Food抽象类永远不能够实例化,但是抽象类能够包含任何一般的类所包含的内容,还可以包含 abstract方法。例如:abstract class GraphicObjectint x,y;void moveto(int newx , int newy)abstract void draw();GraphicObject的每个非抽象子类(例如circle和Rectangle),都必须为draw()提
42、供应用服务:Class circle extends GraphicObjectVoid draw()Class Rectangle extends GraphicObjectVoid draw()4.4程序包和异常处理程序包是Java语言中另一个重要的概念,是管理大型名字空间、避免冲突的工具。每一个类的名字都包含在某个包中。包的定义语句的一般形式为:package packageName;通过import命令输入一个包,import有三种形式:import package;import package.class;import package.*;例如:import java.awt.pee
43、r;import java.util.Vector;import java.io.*;在今后的程序中我们引用了Java API和Java Servlet API中的类库,它们都是以程序包形式存在:l java.lang:包含所有的基本语言类;l java.text:包含了与语言无关方式处理的文本、数据、数字和消息的类;l java.io:包含输入输出类;l java.utl:包含有用的数据类型类;l :包含实现网络功能的类;l java.sql:包含访问和处理数据源中的数据;l javax.servlet:包含了支持普通协议无关的Servlet的类;l javax.servlet.http:包括了对HTTP协议的特别支持。接下来介绍Java中错误和异常处理。错误是指与虚拟机或动态装载等相关的问题,如系统崩溃等,这类错误一般被认为是不可恢复和不可捕获的。异常是程序执行过程中出现的违背正常指令流的事件,是可以捕获的。Java中的每个异常都是一个对象,它是Throwable类或其子类的实例对象,这个对象从出现异常的方法传递信息给捕获异常并处理它的
限制150内