1、1面向对象程序设计(Java)武汉大学国际软件学院 桂浩2第二章 Java语法基础1.词法规则2.数据类型3.常量与变量4.运算符和表达式5.语句6.数组和字符串3词法规则nJava程序的运行体系1.Source code(.java file)2.javac:Lexical Analysis&Parsing+Type-checking Byte code(.class file)Java编译器对源代码进行词法分析和类型校验,生成字节码文件3.JVM:Verification(essentially repeating static checks)+(Interpretation OR Com
2、pilation+Loading+Executing)Java解释器执行字节码文件中的类,Java解释器在加载和执行类时验证类的完整性、正确操作和安全性,并与所在的操作系统、窗口环境和网络设备进行交互以产生所期望的程序行为4关键字1.abstract double int strictfp*2.boolean else interface super 3.break extends long switch 4.byte final native synchronized 5.case finally new this 6.catch float package throw 7.char for
3、 private throws 8.class goto*protected transient 9.const*if public try 10.continue implements return void 11.default import short volatile 12.do instanceof static while 注:*当前未被使用 *使用于Java25标识符n标识常量、变量、数据类型、类和方法public class HelloWorld1 public static void main(String args)String message=“Hello World!”
4、;myPrint(message);private static void myPrint(String s)System.out.println(s);6标识符n组成规则1.字母(AZ、az)、特殊符号($、_)和数字(09)2.第1个符号不能为数字3.不能为关键词、true、false、null4.区分大小写 7标识符n例:point4、5w、A%、thisPicture、$currentValue、OK、_23b、Y_123、length、ab、ifn5w、A%、length、ab、if8标识符n一般约定1.表示常量的标识符全部大写,如RED2.表示类名的标识符用大写字母开始,如MyCa
5、r3.表示公有方法和实例变量的标识符用小写字母开始,后面的描述性词以大写开始,如getCurrentValue4.表示私有或局部变量的标识符全部用小写字母,如next_value9分隔符n空白符n空格、换行符、制表符n分号n表示语句结束,或用于for循环语句中n逗号n变量之间的分隔n冒号n?:/switch循环中的case语句n花括号n类体、方法体、复合语句(for/while/switch/if)10第二章 Java语法基础1.词法规则2.数据类型3.常量与变量4.运算符和表达式5.语句6.数组和字符串11数据类型n基本数据类型n数字(number)n整型(integers)1.字节整数(b
6、yte,8 bits):-128 127,02.短整数(short,16 bits):-32768 32767,03.整数(int,32 bits):-2147483648 2147483647,04.长整数(long,64 bits):,0Ln实型(real numbers):浮点型(有效位数不同)1.单精度(float,32 bits):,0.0F2.双精度(double,64 bits):,0.0Dn字符(char,16-bit Unicode字符):u0000 uffffn布尔(boolean):true,falsen复合数据类型n数组(Array),类(class),接口(inter
7、face)12数据类型n示例1.int i=178;2.long l=8864L;(8864l)3.double d1=37.266;4.double d2=37.266D;(37.266d)5.double d3=26.77e3;6.float f=87.363F;(87.363f)7.char c=d;8.boolean b1=true;9.boolean b2=false;13n将一种类型的数据转换为另一种类型的数据n操作数转换为同种类型,然后运算n整数型、实数型和字符型n表达形式:(类型)操作数n应用场合1.二元运算符的二个操作数类型不同2.表达式值的类型与变量的类型不同n两种方法1.
8、隐型类型转换:自动类型转换(系统完成)2.显型类型转换:强制类型转换类型转换(Casting)14n隐型类型转换:自动类型转换(系统完成)n宽化转换(widening conversion)byte j=60;short k=4;int l=31;long m=4l;long result=0l;result+=j-8;result*=k+2;result/=m+1;result-=l;result%=m;类型转换(casting)15n隐型类型转换:自动类型转换(系统完成)类型转换表源类型 转换后不会丢失数据的目的类型byte short,char,int,long,float,double
9、short char,int,long,float,doublechar int,long,float,doubleint long,float,doublelong float,doublefloat double类型转换(casting)16n显型类型转换:强制类型转换n窄化转换(narrowing conversion)double a=1.5;float b=a;System.out.println(“b=+b);编译:“possible loss of precision”数据精度丢失数据丢失double a=1.5;float b=(float)a;System.out.print
10、ln(“b=+b);类型转换(casting)17n显型类型转换:强制类型转换class Test public static void main(String args)int a=257;byte b=(byte)a;System.out.println(a=+a);System.out.println(b=+b);257 00000000 00000000 00000001 000000011 00000001类型转换(casting)18n显型类型转换:强制类型转换class Test public static void main(String args)char c1=A,c2;/
11、A的ASCII值为65int i;i=(int)c1+1;c2=(char)i;System.out.println(c1+c2);System.out.println(c1+“,”+c2);类型转换(casting)19第二章 Java语法基础1.词法规则2.数据类型3.常量与变量4.运算符和表达式5.语句6.数组和字符串20常量n程序执行过程中,值保持不变的量n整型常量n实型常量n布尔型常量n字符型常量n字符串常量21常量n整型常量n常用十进制、八进制、十六进制表示n有正负号起 始最大整数(正)最大长整数(正)举 例十进制0,1921474836479223372036854775807L
12、23,+567,-12,0,1234八进制00177777777770777777777777777777777L034,0175,-0777L十六进制0 x0 x7FFFFFFF0 x7FFFFFFFFFFFFFFFL0 xFF,0 x45L22常量n实型常量n双精度实数(double,8个字节,数字后加字母D或d)n浮点实数(float,4个字节,数字后加字母F或f)n若无明确字母标识,则系统默认为双精度实数n两种表示方法n十进制:数字和小数点组成,必须有小数点,例 0.12,.12,12.,12.0n科学计数法:123e3,123E3,0.4e8D,-5e923常量n布尔型常量ntrue
13、nfalse24常量n字符型常量n用单引号括起来的单个字符n例:a,A,&n例:,“a”nJAVA中的字符为Unicode字符n双字节,范围u0000uFFFFn转义字符序列nb 退格 t 制表符nn 换行(Newline)nr 回车(Carriage return)n 单引号 ”双引号 反斜杠25常量n字符串常量n用双引号括起来的若干个字符n例,“I am a student”,“java语言”,“A”n转义字符序列表示n“”n“”26常量n转义字符序列class Test public static void main(String args)System.out.println(“jav
14、an语b言);System.out.println(javar语言);System.out.println(javat语言);System.out.println(java语言);System.out.println(java语言);System.out.println(“”java语言“”);C:java Testjava言语言java语言java语言java语言“java语言”C:27变量n程序执行过程中,值可以改变的量n整型变量、实型变量、字符型变量、字符串变量、布尔变量等n变量定义n类型 变量名=初值,变量名=初值 n类型:基本数据类型或引用类型int x,y,z;float a,b;
15、char c1,c2,c3;double d1;boolean mycom;28变量n变量赋初值/初始化 n在变量声明时赋值1.类型 变量名=初值,变量名=初值 2.int x=1,y=2,z=3;3.float e=2.718281828f;n采用赋值语句1.float pi,y;2.pi=3.1415926f;3.y=2.71828f;29变量n变量的作用域class MyClass 成员变量申明public void aMethod(方法参数)局部变量申明 成员变量范围方法参数范围局部变量范围30变量n变量的作用域变量的使用范围class Spot final static Spot s
16、t=new Spot(1,2);int a,b;int Count;Spot(int a,int b)this.a=a;this.b=b;成员变量a,b,Count范围方法参数a,b范围31变量n作用域(Scope)if(.)int i=17;.System.out.println(The value of i=+i);32变量nfinal变量n带有关键字final的变量final int aFinalVar=0;nfinal变量初始化后不能再改变final int blankfinal;.blankfinal=0;blankfinal=3;33UnicodenWhat is Unicode?
17、nUnicode?灄炮?灄炮?(in Thai)n?(in Persian)n什么是什么是Unicode(统一码统一码)?n什麽是什麽是Unicode(統統一一碼碼/標準萬國碼標準萬國碼)?n(in Arabic)?1?rial?rial?raiala?nWas ist Unicode?(in German)n Unicode?(in Russian)n 何?何?(in Japanese)34汉字字符集nGB2312-80n中华人民共和国国家汉字信息交换用编码,全称信息交换用汉字编码字符集基本集,国家标准总局发布,1981年5月1日实施n收录简化汉字及符号、字母、日文假名等共7445个图形字符
18、,其中汉字占6763个n“对任意一个图形字符都采用两个字节表示,每个字节采用七位编码表示”,第一个字节为“高字节”,第二个字节为“低字节”nGBKn全国信息技术化技术委员会于1995年12月1日汉字内码扩展规范,GBK共收入21886个汉字和图形符号35汉字字符集nBIG5n1983年10月,台湾国家科学委员会、教育部国语推行委员会、中央标准局、行政院共同制定了通用汉字标准交换码,后经修订于1992年5月公布,更名为中文标准交换码,BIG5是台湾资讯工业策进会根据以上标准制定的编码方案nBIG5码是双字节编码方案,第一个字节的值在0 xA0-0 xFE之间,第二个字节在0 x40-0 x7E和
19、0 xA1-0 xFE之间nBIG5收录13461个汉字和符号36为什么需要Unicode?n不同字符集编码的内码定义不一样n汉字 GBK BIG5 n一 D2BB A440n丁 B6A1 A442n七 C6DF A44337UnicodenUnicode是16比特的字符编码,其支持当前世界上绝大多数的语言nUnicode给每个字符提供了一个唯一的编码表示,不论是什么平台、程序或语言nWindows系统(Windows 2000版本)、JAVA、XML、LDAP等已支持UnicodenUnicode实现了ISO/IEC 10646标准n安装附加的语言n开始 设置 控制面板 区域选项 n字体(f
20、ont)nFull fonts:If you have Microsoft Office 2000,you can get the Arial Unicode MS font,which is the most complete.38UnicodenJAVA中的字符、字符串、标识符(变量名、方法名和类名称)n16比特的Unicode字符nUnicode字符集(Unicode character set)n用途:国际化nu0000 uffff,u是Unicode转义符n当前定义了34,000个Unicode字符nu0020u007e等效于ASC-II字符和ISO8859-1(Latin-1)字符
21、0 x200 x7echar c=u5E74;/char c=年;String s1=“Javau8BEDu8A00”;/String s1=“Java语言”;String s2=u0030u0031;/String s2=“01”;System.out.println(c);System.out.println(s1);System.out.println(s2);39第二章 Java语法基础1.词法规则2.数据类型3.常量与变量4.运算符和表达式5.语句6.数组和字符串40运算符(operator)n一元/单目运算符noperator opnop operatorn二元/双目运算符nop1
22、 operator op2n三元/三目运算符nop1?op2:op3注:op表示操作数411.算术运算符(Arithmetic Operators)2.关系运算符(Relational Operators)3.逻辑运算符(Logical Operators)4.位运算符(Bitwise Operators)5.移位运算符(Shift Operators)6.条件运算符(Conditional Operator)7.运算符的优先级运算符(operator)42n算术运算符(Arithmetic Operators)1.加法运算符+“op1+op2”2.减法运算符-“op1-op2”3.乘法运算符
23、*“op1*op2”4.除法运算符/“op1/op2”5.求模运算符%“op1%op2”计算余数int i=37int j=42double x=27.475double y=7.22Adding.i+j=79 x+y=34.695Subtracting.i-j=-5 x-y=20.255Multiplying.i*j=1554 x*y=198.37Dividing.i/j=0 x/y=3.8054Computing the remainder.i%j=37 x%y=5.815运算符(operator)43n关系运算符(Relational Operators)n比较运算,计算结果“true”
24、或“false”1.大于 “op1 op2”2.大于等于=“op1=op2”3.小于 “op1 op2”4.小于等于=“op1、=、(=、!=)n关系运算符低于算术运算符运算符(operator)44n关系运算符(Relational Operators)class Test public static void main(String args)int w=25,x=3;boolean y=w=w*2 x*9;boolean cc=b a;System.out.println(“w x=”+y);System.out.println(“z=”+z);System.out.println(“c
25、c=”+cc);运算符(operator)45n逻辑运算符(Logical Operators)n操作数的逻辑关系,计算结果“true”或“false”n逻辑与&“op1&op2”1.操作数都为真“true”,结果为真“true”2.否则结果为假“false”n逻辑或|“op1|op2”1.有一个操作数为真“true”,结果为真“true”2.否则结果为假“false”n逻辑非 !“!op”1.取反,操作数为真“true”,结果为真“false”,反之例:0=index&index (&)(|)n(!)算术运算符关系运算符(&)(|)运算符(operator)46n位运算符(Bitwise O
26、perators)1.按位取反 “op2”2.按位与&“op1&op2”3.按位或|“op1|op2”4.按位异或 “op1 op2”通常:操作数为整数运算符(operator)47n补码n采用补码表示二进制数n最高位是符号位n正数的符号位是0,例,十进制42的补码为00101010n负数的符号位是1该负数绝对值的补码按位取反,然后加1,为该负数的补码例,十进制-42的补码负数的绝对值42 绝对值的补码00101010 按位取反11010101 加1得11010110运算符(operator)48n按位取反 “op2”对操作数的每一个二进制位进行“取反”操作nint a=42;nint aa=
27、a;nSystem.out.println(“aa=”+aa);42 00101010 -43 11010101运算符(operator)49n按位与&“op1&op2”将操作数的对应位逐位进行位逻辑与运算1 1 1,其余为0用途1.取某一整数中指定的几个二进制位42&15 00101010&00001111 00001010 取后四位运算符(operator)50n按位与&“op1&op2”用途2.将某一整数的最后一位置0 00101011&11111110 0010101043&1运算符(operator)51n按位或|“op1|op2”将操作数的对应位逐位进行位逻辑或运算有1 1,其余为
28、042|15 00101010|00001111 00101111用途:将一个整数的某一位或几位置1运算符(operator)52n按位异或 “op1 op2”将操作数的对应位逐位进行位异或运算对应位不同1,其余为042 15 00101010 00001111 00100101用途:将一个整数的某一位或几位取反运算符(operator)53n移位运算符(Shift Operators)1.左移 “op1 “op1 op2”3.无符号右移 “op1 op2”运算符(operator)54n左移 “op1 op2”1.将操作数op1的二进制位向左移op2(正整数)位2.低位补零nint a=42
29、;nint aa=a 2;nSystem.out.println(“aa=”+aa);42 00101010 2168 10101000 相当于 42*22=168运算速度比乘法快注意:溢出运算符(operator)55n左移 “op1 op2”溢出byte j=42;byte j1=(byte)(j 1);/84byte j2=(byte)(j 2);/168 byte j3=(byte)(j “op1 op2”1.将操作数op1的二进制位向右移op2(正整数)位2.高位补零(原为正数)、高位补1(原为负数)int a=42;int aa=a 2;System.out.println(“aa
30、=”+aa);42 00101010 210 00001010 相当于 42/22=10.5运算速度比除法快运算符(operator)57n无符号右移 “op1 op2”1.将操作数op1的二进制位向右移op2(正整数)位2.高位补零,零扩展(zero-extension)int a=42;int aa=a 2;System.out.println(“aa=”+aa);42 00101010 210 00001010 相当于 42/22=10.5运算速度比除法快实现数的拼接运算符(operator)58n条件运算符nop1?op2:op3n若op1为真,则运算结果为op2,否则为op3例z=a
31、 0?a:-a;z=a b?a:b;运算符(operator)59自增、自减运算符n变量赋值,一元运算符n自增运算符(+)、自减运算符(-)nint i=5;i+;+i;i-;-i;n“赋值”和“运算”的先后顺序int i=10;int n=i+%5;float x=7,y=15,v1,v2;v1=x+;v2=+y;int i=10;int n=+i%5;x=8 y=16v1=7 v2=16i=11,n=0i=11,n=160运算符的优先级后缀运算符 postfix operators .(params)expr+expr-一元运算符 unary operators +expr-expr+ex
32、pr-expr !构造或类型转换creation or cast new(type)expr 乘法 multiplicative */%加法 additive +-移位 shift 关系 relational =instanceof 相等 equality =!=按位与 bitwise AND&按位异或 bitwise exclusive OR 按位或 bitwise inclusive OR|逻辑与 logical AND&逻辑或 logical OR|条件 conditional?:赋值 assignment =+=-=*=/=%=&=|=61表达式(expression)n用运算符和括号
33、将操作数连接起来求值的式子n操作数(常量、变量和函数)n算术表达式n关系表达式n逻辑表达式n赋值表达式n复合赋值运算62n算术表达式n用算术运算符和括号将操作数连接起来,求整数或实数n运算符的优先级和结合性n例nint x=20,y=3,z=5;nx+y*z (x+y)*z nx*-yn说明n表达式力求简单明了n表达式中的变量必须赋值表达式(expression)63n算术表达式n例:若 i=10,i-%50 =?等价于(i-%5)0 public class Test public static void main(String args)int i=10;if(i-%5)0)System.
34、out.println(true);else System.out.println(false);表达式(expression)64n关系表达式n将两个表达式连接起来的式子n算术表达式、赋值表达式、字符表达式nab;a+bb-c;(a=3)(b=5);ba;n返回结果为一个布尔类型的值n例n若 int a=3,b=2,c=1;boolean d,f;nd=ab;nf=(a+b)(b+5);nd=abc;?表达式(expression)65n逻辑表达式n用逻辑运算符将关系表达式和布尔值连接起来的式子n例nint x=23,y=98;nboolean a=true,b=false,c,d;nc=(
35、xy)&a;nd=!a&(x=y);表达式(expression)66n逻辑表达式n例:闰年(leap year)A year in the Gregorian calendar having 366 days,with the extra day,February 29,intercalated to compensate for the quarter-day difference between an ordinary year and the astronomical year.条件符合下例两者之一1.能被4整除,但不能被100整除2.能被4整除,又能被400整除(year%4=0&y
36、ear%100!=0)|year%400=0(year%4!=0)|(year%100=0&year%400!=0)表达式(expression)67n赋值表达式n用赋值运算符将一个变量和一个表达式连接起来的式子n n优先级:赋值运算符 算术、关系和逻辑运算符na=5+6;nb=c=d=a+5;na=5+c=5;na=(b=4)+(c=6);表达式(expression)68n复合赋值运算n复合赋值运算符n+=、-=、*=、/=、%=n=、&=、=、|=n n例na+=b+5;等价于 a=a+(b+5);na*=b;等价于 a=a*b;na*=b-c;等价于 a=a*(b-c);n=()表达式
37、(expression)69第二章 Java语法基础1.词法规则2.数据类型3.常量与变量4.运算符和表达式5.语句6.数组和字符串70语句(statement)n表达式+分号“;”表达式语句nx=25;ny+=a*b+c;na+b;n只有分号空语句ni=5;n符合语法规则(程序设计的初始阶段)71条件选择语句nif 语句1.if语句是一个条件表达式,若条件表达式为真,则执行下面的代码块,否则跳过该代码块2.单行代码if(布尔表达式)语句;2.多行代码if(布尔表达式);语句;语 句布尔表达式falsetrue流程图72条件选择语句n示例import java.io.IOException;c
38、lass Test public static void main(String args)throws IOException System.out.println(“你喜欢Java吗(Y/N);char like=(char)System.in.read();if(like=Y|like=y)System.out.println(“Good”);73条件选择语句nif-else 语句1.根据判定条件的真假执行不同的操作2.语法if(布尔表达式)语句块1;else 语句块2;语句块1布尔表达式falsetrue流程图语句块274条件选择语句n示例import java.io.IOExcept
39、ion;class Test public static void main(String args)throws IOException System.out.println(“请输入你的成绩:);char a=(char)System.in.read();char b=(char)System.in.read();int score=(a-0)*10+b-0;if(score=60)System.out.println(“你及格了!”);elseSystem.out.println(“你没及格了!”);C:java Test请输入你的成绩:65你及格了!C:75条件选择语句nif 语句的嵌
40、套1.if 语句中的语句块又出现了if 语句2.若没有配对符,则else与最近的if语句配对3.例 int a=1,b=2,c=3;if(ac)if(cb)System.out.print(c);else System.out.print(a);4.一定要明确地写上配对符修改配对关系:if(ac)if(cb)System.out.print(c);else System.out.print(a);默认Java虚拟机:if(ac)if(cb)System.out.print(c);else System.out.print(a);76条件选择语句n条件运算符1.三元运算符(ternary ope
41、rator):“?:”2.表达式1?表达式2:表达式33.表达式1的结果为布尔型,表达式2和表达式3的类型相同n表达式1true表达式2n表达式1false表达式3Shortcut if-else statement if(表达式1)表达式2 else 表达式377条件选择语句n示例import java.io.IOException;class Test public static void main(String args)throws IOException System.out.println(“请输入三个09之间的数);byte x=(byte)System.in.read();by
42、te y=(byte)System.in.read();byte z=(byte)System.in.read();x-=48;y-=48;z-=48;byte n=xy?x:y;byte m=n z?n:z;System.out.println(“max=“+m);char 0 (48)char 1 (49)x=x-48;y=y-48;x=z-48;C:java Test请输入三个09之间的数370max=7C:78条件选择语句n示例import java.io.IOException;class Test public static void main(String args)throws
43、 IOException System.out.println(“中国足球能否进入世界杯?);System.out.println(“是(y)否(n)不一定(p);char c=(char)System.in.read();if(c=y)System.out.println(“Cool”);else if(c=n)System.out.println(“Bad”);else if(c=p)System.out.println(“Sorry”);else System.out.println(“Input Error”);逐条if语句进行判断条件匹配,进入语句体否则对if语句继续匹配79swit
44、ch/开关语句n根据表达式的结果执行多个操作中的一个n语法switch(表达式)case 值1:语句序列;break;case 值2:语句序列;break;default:默认语句;与任一case值不匹配,则进入default语句流程图表达式语句序列1语句序列2默认语句break;break;break;值1值2default80switch/开关语句n语法switch(表达式)case 值1:语句序列;break;case 值2:语句序列;break;default:默认语句;n几点注意1.switch语句表达式的结果必须是byte,char,short,int 类型2.表达式的结果依次与每
45、个case子句比较3.break语句用于跳出switch语句4.default子句是可选的81switch/开关语句n示例 1import java.io.IOException;class Test public static void main(String args)throws IOException System.out.println(“中国足球能否进入世界杯?);System.out.println(“是(y)否(n)不一定(p);char c=(char)System.in.read();switch(c)case y:System.out.println(“Cool”);br
46、eak;case n:System.out.println(“Bad”);break;case p:System.out.println(“Sorry”);break;default:System.out.println(“Input Error”);break;82n示例 2public class Test public static void main(String args)int month=2,year=2000;int numDays=0;switch(month)case 1:case 3:case 5:case 7:case 8:case 10:case 12:numDays
47、=31;break;case 4:case 6:case 9:case 11:numDays=30;break;case 2:if (year%4=0)&!(year%100=0)|(year%400=0)numDays=29;else numDays=28;break;System.out.println(Number of Days=+numDays);switch/开关语句83循环控制语句n反复执行同一代码块直到满足结束条件n组成1.循环的初始状态2.循环体3.迭代因子(计数器的递增或递减)4.控制表达式n3种循环语句1.while循环2.do-while循环3.for循环84循环控制语
48、句nwhile循环n语法 while(布尔表达式)循环体;false循环体布尔表达式true流程图85循环控制语句n示例class Test public static void main(String args)int i,sum;sum=0;i=0;while(i java Test输入一句子以.表示结束fdsfs.Output=fdsfs.C:java Test输入一句子以.表示结束fdsf中国.Output=fdsf?.C:88循环控制语句nfor循环:最有效、最灵活的循环结构n语法 for(初始化部分;条件判断部分;迭代因子)循环体;n初始化部分n设置循环变量的初值n条件判断部分n任
49、意布尔表达式n迭代因子n控制循环变量的增减初始化部分条件判断true流程图循环体执行迭代因子false89循环控制语句nfor语句求07之间任意数的阶乘import java.io.IOException;class Test public static void main(String args)throws IOException int i,n,sum=1;System.out.println(“Please input(07):”);n=System.in.read();n-=48;for(i=1;i java TestPlease input(07):55!=1201.能否算092.
50、能否算12,134?90循环控制语句nfor循环的几点注意n初始化部分和迭代因子可以包含多个语句,以“,”分开for(int i=0,j=10;ij;i+,j-)n初始化部分、条件判断部分和迭代因子可以为空语句,但以“;”分开,表示无限循环for(;)/infinite loop .91循环控制语句n如果一个人出生于1970年,那么他这一辈子能有几个闰年(以70岁为寿命长度)int length=70;int firstYear=1970;int year;for(int i=0;i length;i+)year=firstYear+i;if(year%4=0&year%100!=0)|yea