1、第2章 Java语言基础,学习重点: 各种运算符的功能和用法 运算符的优先级 变量 程序源代码的基本理解,第2章 Java语言基础,2.1 简单输入输出2.2 数据类型2.2.1 常量2.2.2 变量2.2.3 数组2.3 运 算 符2.3.1 算术运算符2.3.2 关系运算符2.3.3 逻辑运算符2.3.4 位运算符2.3.5 其他运算符2.3.6 运算优先级2.4 练 习 题,2.1 简单输入输出,输入和输出是计算机的基本功能,通常简称I/O(Input and Output),有了它我们才能与计算机进行交流。Java的输入和输出分为图形界面和字符界面两种。字符界面用Java应用程序来实现
2、,而图形界面可以用Java小程序和Java应用程序都能实现,但Java小程序借助于浏览器的界面,所以程序相对较为简洁,下面先对例1.1程序语句进行解释,在例1.1中添加一句import java.io.*;以便显示一般结构,import java.io.*; /引入类 public class JavaProgram1 /定义类public static void main(Stringargs ) /定义main()方法System.out.println(“I have been a programmer!”); /标准输出 ,在这个程序中,有以下几点需要大家注意,引入类库 程序注释类定义
3、main()方法输入和输出,引入类库,Java类库是Java语言的重要部分,它是已经编写好的经过测试的模块的集合,每个模块对应一种特定的基本功能,我们要用到某一功能时就可以调用它,在调用模块之前需要引入含有该模块的类(许多类可按某种关系组成包),引入的方法就是用import语句,每句只能引入一个包中的类。,程序注释,Java有两种类型的注释: 用一个“/*”开头,随后是注释内容,并可跨越多行,最后用一个“*/”结束,两个符号之间的内容都会被解释器跳过。 单行注释,以一个“/”开始,表示这一行中该符号后面的内容都是注释。,类定义,public class JavaProgram1 public
4、static void main (String args ) System.out.println (“I have been a programmer!”) ; class就是类的意思 JavaProgram1是类名 public是用来修饰class的,说明JavaProgram1这个类 公共类,main( )方法,main()是Java application程序的执行入口,我们把含有main()方法的类称主类,一个.java文件中可以有一个或多个类,但只能有一个主类,因此也只能有一个入口。main()的方法只能用如下的语句来定义:public static void main(Stri
5、ng args ) 。其中main之前的词都是对main()这个方法的修饰语,代表这个方法的特点,输入和输出,在main()方法中的语句:System.out.println(“I have been a programmer!”);System.out 是系统标准输出 System.in 是系统标准输入,方法read()接收用户输入 的字符,它的返回值是int型数据,例2.1 简单的输入和输出,import java.io.*; public class SimpleIOpublic static void main(String args)char c;System.out.print(“
6、Enter a letter: ”); /输出语句try /try到catch(IOException e);是例外处理。c=(char)System.in.read(); /从键盘输入 catch(IOException e);System.out.println(“The letter is : ”+c); /输出语句 System.in.read()读到的是一个16位的二进制数,后8位存放一个character的代码值,如a的代码值是97,2.2 数据类型,程序设计中有一个很有名的公式:数据结构+算法=程序。这显然是针对面向过程的程序设计方法而言的,但即使在面向对象的思想中,数据的设计、
7、组织以及存储仍然是程序中最基本也是最重要的一个环节。因此,我们学习任何一种程序语言都要先学习它的数据组织。,2.2.1 常量,数字常量:就是我们常用的阿拉伯数字,这些数字在程序设计语 言中也被分成多种类别,如整形、浮点数等 字符常量:Java中的字符表示和其他语言一样,用单引号来表示。如a,A,E,g,z,%#和5等等 字符串常量:Java中的字符串和C语言不同,它是以对象的形式出现的,字符串必须以双引号括起。在java.lang中有个类是String,这个类的实例(对象)就是字符串常量 转义序列:转义序列主要通过在字符前加一个反斜杠“”来实现, 通过转义序列可以表示特殊达的含义,2.2.2
8、变量,变量(variables)是在程序中由于某种需要而可以改变的量。例如,上面的银行利息问题中,tax就是一个变量,因为使用不同的本金就会得到不同的利息。变量可分别看作一个容器,它的名称为tax,其中存放的内容是利息数。,1. 变量名,高级语言的程序通过变量来操纵内存中的数据,变量在使用之前需要定义,定义一个变量就是在内存中开辟一块区域,并与变量名建立联系,例如:int sum=10000;float tax;char c;其中sum,tax和c都是变量名,又称标识符,Java程序中自定义的类名、方法名、参数都是标识符。int,float和char是变量的数据类型,对于标识符Java语言中有
9、严格的规定:,标识符由字母(区分大小写)、数字、下划线、$自由组合而成, 但不能以数字开头,标识符长度不限如 number,number24,$amount,amountOfSale amount_of_sale和$123都是合法的,而9number,number%和123都是非法的 有些单词是Java所保留的,这些词组成Java语言的本身,称为关键词,标识符不能与任何一个关键词相同 一般在实际编写程序时,最好变量名以小写字母开始,并能表示变量的含义,不要怕长,多个单词组成的变量名除第一个单词外其余单词的第一个字母均大写,例如:int firstContactTime;,2. 基本数据类型,J
10、ava的数据类型可以划分为4大类:,整数 浮点数 字符型 布尔型,整数和浮点数,整数可以划分为byte,int,sort和long 4种类型 浮点数可分为float和double两种类型,它们占用不同的二进制位数(bit),boolean:布尔型变量,布尔型变量只有两个取值:true或false。例2.2 Boolean DataTest.java public class BooleanDataTestpublic static void main(String args ) boolean data1=true;boolean data2;data2=false;System.out.pr
11、intln(“value of data1 is ”+data1); System.out.println(“value of data2 is ”+data2); ,char:字符型变量,字符型变量有两种赋值方法:单引号括起的单个字符 用整数表示的unicode中的编码值,例如:char i=a;char j=97; 这两个语句的结果是i和j的值都为字符a。不能用整形变量给字符变量赋值,例如:int i=97;char j=i; 可通过强制类型转换加以改正:char j=(char)i;,例2.3 CharDtatTest.java,public class CharDataTestpubl
12、ic static void main(String args ) char data1=a;char data2=97;int i=97;char j=(char)i;System.out.println(“value of data1 is ”+data1); System.out.println(“value of data2 is ”+data2); System.out.println(“value of j is ”+j); ,例2.4 (错误例子) 编译本例将产生数据类型不匹配的错误信息,编译结果如图所示。,CharDataTest1.java的程序内容如下: public cl
13、ass CharDataTest1public static void main(String args )int i=97;char j=i; System.out.println(“value of data2 is ”+j); ,byte、short、int和long:整型变量,使用整型变量最应注意的是数值的溢出,由于不同的整型变量 占用不同的二进制位数,所以有不同的取值范围,如果要存放的数 值超出了变量的取值范围,这个数将被截断,变量中取到的是另一 个数,程序就会产生难以意料的结果。而且这种错误较难查出。整数常量为整型。整型也可以写成十六进制和八进制,十六进 制以0x开头,如0x34和
14、0xF2A。八进制以0开头,如071和045。,float和double:浮点型变量,浮点型变量用来表示非整数。取的二进制位数越多,数值越精确,所以 double表示小数将更精确。 常量的浮点表示法有两种:一般表示和科学计数法表示,如123.456也可表示为1.23456E2。 常量也有float和double的存储方法:如果数字后加f或F即为float,占32位bit如果数字后加d或D即为double,占64位bit如果数字未加任何字母,默认为double所以在赋值时也应注意数据类型匹配问题,如要把123.456赋给float型变量 x,应用“x=123.456f”或“x=123.456F”
15、,而不能用“x=123.456”。,3. 数据类型的转换,Java提供两种转换的方式:隐式转换强制转换,隐式转换:,隐式转换也有两种情况:一是在赋值的时候,如果将较短类型数据赋给较长类型,类型转换由编译系统自动完成;二是在计算时,如果一个较短类型数据与较长类型数据进行运算,系统会自动把较短类型数据转换成较长类型数据后再进行运算。例如:short i=97; / 赋值int j=i; / i将被转换成int型后赋予j。,强制转换:,如果将较长的数据类型赋予较短的数据类型,就必须使用强制转换,使用方式如下:long i=1111;int j;j=(int)i;,例2.5 (错误例子) 这个例子执行
16、之后,变量j将会溢出,其运行结果如图所示。,public class OverFlow1public static void main(String args )int i=1000000;short j;j=(short)i;System.out.println(“value of i is ”+i); System.out.println(“you think j= ”+i); System.out.println(“in fact j=”+j); ,例2.6 (对例2.5的更正) OverFlow2.java的程序内容如下:,public class OverFlow2public st
17、atic void main(String args )int i=400000;long j;j=i*100000; /如果改为 j=i*100000L; 运行结果才正确。System.out.println(“you think j= 40000000000”); System.out.println(“in fact j=”+j); ,2.2.3 数组,数组是相同类型的元素按一定顺序排列而成的一种数据结构。Java中的所有数据类型都可以作为数组的元素,当然,数组元素也可以是对象。由基本数据类型构成的数组,定义和使用都比较简单,而由对象构成的数组,定义前对象所属的类必须事先声明。,1. 定
18、义,若想定义数组必须首先声明数组,它的目的是明确数组名和数组 元素的数据类型。格式如下:数组元素的数据类型 数组名 ;数组元素的数据类型 数组名; 是数组的标志,放在数组元素的数据类型后或数组名后都可以。例如: char arrayNumberOne ; char arrayNumberOne; String args ; /String是类名,这个数组由多个字符串组成 int array; int block ; /多维数组,声明完之后,还需为数组开辟一个连续的内存空间,它的关键词是new,这个空间不能改变大小,也就是说Java不支持变长数组。,格式如下:数组名 = new 数组元素的数据类
19、型元素个数;例如: arrayNumberOne=new char100; /开辟100个连续的char字长的空间 args=new Strring10; block=new int 23;以上这两步可以合在一起写,格式如下: char arrayNumberOne =new char100; String args =new String10; int block=new int23;,数组在使用时一般用的是它的元素,每个元素以下标来区分,即内存空间中的位置,下标从0开始,顺序增加,如array0标识数组array的第1个元素,array21是第22个。下标也可用变量甚至表达式,但它的值必须
20、是整型,如arrayi,arrayi+j,arrayy%3。 另外,下标不能越界,如数组有10个元素,下标最大为9。Java自动检测下标是否越界,以避免堆栈溢出和内存崩溃,如果越界将产生错误信息。在Java里,数组实际上是一个对象,它有一个成员变量:length,读者可以用这个成员函数来查看任意数组的长度,例如:int a =new int103;a.length; /这个多维数组的行数:10a0.length; /第一行的列数:3,2. 初始化,如果数组元素是对象,必须经过初始化。如果是基本数据类型,在没有初始化时元素将被赋予该类型的默认值。 事实上,初始化也可以与定义同时进行,例如:int
21、 a=1,2,3,4,5,6,7;这样,既明确了元素的个数需要多大的内存空间,也明确了各元素的值,完成了初始化。但数组元素较多或较复杂时,就需要单独进行初始化,例如: int arrayNumberOne=new int510; for(int i=0; i5; i+) /for循环结构见下一章for(int j=0; j10; j+)arrayNumberOneij=0; /初始化,2.3 运 算 符,运算符是进行科学计算的标识符,常量、变量和运算符组成表达式,表达式是组成程序的基本部分。,2.3.1 算术运算符,Java中的算术运算符用来定义整型和浮点型数据的算术运算,可分为单目运算符、双
22、目运算符和算术赋值运算符。,1. 单目运算符,单目运算一共有3个,其中+和-分别有两种用法。 a+或a-是指表达式运算完后,再给a加一或减一。而 +a或-a是指先给a加一或减一,然后进行表达式运算。 例如: int a=100; int b=100; int y; y=a+*2;/此时a等于101,y等于202。 y=+b*2;/此时b等于101,y等于200。,2. 双目运算符,双目运算的前4个符号对于整型和浮点型数据都有效,%只对整型运算,例如:y=15%4; /得到y的值是3y=1%5; /得到y的值是0在进行数值计算时最应注意的还是避免数据的溢出和截断。结合数据类型一节的内容,请分析以
23、下例题:int x=3/2; /结果是x=1loat x=3/2; /结果是x=1.0loat x=3f/2f; /结果是x=1.5,如写成float x=3f/2;,结果相同,3. 算术赋值运算符,算术赋值运算符只是一种简写,一般用于变量自身的变化,例如:a+=5;/a自身增加5b*=10;/b的值是原来的10倍,2.3.2 关系运算符,关系运算是比较两个表达式大小关系的运算,它的结果是真(true)或假(false),即布尔型数据。如果表达式成立则结果为“真”,否则为“假”。关系运算符有6种:= =,!=,=和=,分别表示等于、不等于、大于、小于、大于等于和小于等于。值得注意 的是: “=
24、 =”是指符号两边的值相等,“=”是指把符号右边的值赋予左边。不能在两个浮点数之间作“等于”的比较,因为浮点数用二进制数表达之后不是精确值。 “=”和“= =”以及“!=”都能对对象进行操作,例2.7 关系运算符,RelationOperator.java程序的内容如下: public class RelationOperator public static void main(String args ) int i=100;int j=1000;boolean k;k=ij;System.out.println(“ijis”+k); ,2.3.3 逻辑运算符,&与&和|与|的区别,&与&和|
25、与|的区别,&与&和|与|虽然名称相同,但功能有细微差别,&与|在进行运算 时,符号两边的表达式都进行计算之后才得出值,而&与|在运算 时,如果运算符左边的值能决定整个表达式的值,运算符右边的内 容不再计算,例2.8 Logical Operator.java,public class LogicalOperator public static void main(String args ) int i=1;int j=2;boolean k1,k2;k1=ij | +ij;System.out.println(“k1=“+k1+“i=“+i);k2=ij | i+j;System.out.p
26、rintln(“k2=“+k2+“i=“+i); ,2.3.4 位运算符,位运算是以二进制位(bit)为单位进行运算的,操作数和结果都 是整型数据。,位运算(,&,|,):,把二进制位的1为“真”,二进制位的0为“假”,然后按位进行逻辑运算。位运算的运算数和结果都是整型数据,但中间运算的二进制位是布尔量。int x=64; / 01000000int y=71; / / 01000111,移位运算(,):,面向的运算对象也是二进制的“位”。 左移位运算符()则将运算符左边的运算对象向右移动运算符右侧指定的位数。有符号右移位运算符:使用了符号扩展,即若值为正,则在高位插入0;若值为负,则在高位插
27、入1。无符号右移位运算符():它使用了零扩展,即无论正负,都在高位插入0。这一运算符是C或C+没有的。若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。若对一个long值进行处理,最后得到的结果也是long。,2.3.5 其他运算符,三目运算符(?:):例如,x ? y : z;,其中x,y和z都为表达式,运算规则是:x为“真”,整个表达式的取值为y的值,否则取z的值。例如:int x=1,y=2,z=3;int i=x0 ? y : z; /i的取值就是3。括号:起到改变表达式运算顺序的作用,它的优先级最高。引用号(.):逐级向下的引用,如Sy
28、stem.out.print()。,赋值号(=):赋值是用等号运算符(=)进行的。它的意思是取得右边的值,把它复制到左边。右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行。但左边的值必须是一个明确的、已命名的变量。也就是说,它必须有一个物理性的空间来保存右边的值。它也可为对象“赋值”。逗号(,):在Java里需要用到逗号的惟一场所就是for循环,本章稍后会对此详加解释。字串运算符(+):这个运算符在Java里有一项特殊用途,就是连接不同的字串。这一点已在前面的例子中展示过了。,2.3.6 运算优先级,运算优先级决定表达式的运算顺序,如果运算顺序不同,同样的表达式就有不同的结果。建议
29、初学者多用括号来明确表达式的运算顺序。,表2.10 运算优先级,2.4 练 习 题,1判断以下常数的表示是否正确,并区分整数和浮点数,八进制数和十六进制数。1856,4l,021,0xA6,0xa2E3,0x3.45,0x3221,-0x3221,35,-78999,-3.81,fa00,1.34e-8,-.67E3,25.,0L,053.249,8.33E,-1E3,E-10,2下列哪些是正确的标识符?哪些是非法的标识符?int,println,static,_book,a$,book3,5files,_9days,-number,i,copy_file,date:x,+digit,_56,
30、$abcd,up_down,if_count,agentEventListener,3指出下列程序当中的错误,改正程序,并上机验证。(1) public class Exercise1int i;public static void main(String args )System.out.println(“i=”+i); ,(2) public class Exercise2public static void main(String args )int i=10;short j;int k=j;j=i;System.out.println(j); ,4写出下列运算表达式的运算结果,其中x=
31、10,y=6,z=false。(1) 100 = = x + y(2) x = y + 10(3) z | y + x(4) x * = 6(5) ( y / 2 = x ? 3 : 6)(6) y % x (7) y = 6 & y = x(8) !y * 3 = x * 4,5设int x = 5,int y = 7,int z = 0,分析下列各表达式运算后,x,y,z的值各为多少?(1) z = x+ * y+(2) z = +x y (3) z = x+ *4 / y+(4) z = x+ + +y(5) z = y+ x,6分析下列运算表达式的运算顺序。(1) y% = x=y?10:3(2) y = x6|j= =5(3) a-=b+c+d(4) ab | x&y,