1、面向对象JAVA语言程序设计,信息科学与技术学院 网络工程系 周文峰,2,第二章 Java语言的基本语法,标识符和关键字 常量与变量 数据类型 运算符 字符串 数组,3,2.1 标识符和关键字,Java语言中的类名、对象名、方法名、常量名和变量名统称为标识符。标识符由程序员定义,可以由字母、数字、下划线 _ 和 $ 符号组成,但是标识符的第一个字符不允许为数字,只允许为字母、下划线 _ 或 $ 符号。 在Java语言中还定义了一些专有词汇,统称为关键字,例如public、class、int等,它们都具有一种特定的含义,只能用于特定的位置,不能作为标识符使用。,4,Java关键字,在定义标识符时
2、,不允许定义为表中列出的任一关键字,5,Java标识符命名规则,为了提高程序的可读性,在定义标识符时,要尽量遵循“见其名知其意“的原则。Java标识符的具体命名规则如下: 一个标识符可以由几个单词连接而成,以表明它的意思 对于类名,每个单词的首字母都要大写,其他字母则小写,例如RecordInfo 对于方法名和变量名,与类名有些相似,除了第一个单词的首字母小写外,其他单词的首字母都要大写,例如getRecordName(),6,Java标识符命名规则,对于常量名,每个单词的每个字母都要大写,如果由多个单词组成,通常情况下单词之间用下划线(_)分隔,例如MAX_VALUE。 对于包名,每个单词的
3、每个字母都要小写,例如com.frame。 注意:Java语言是区分字母大小写的,即Java不等于java。,7,分隔符,分隔符是用来区分源程序中的基本成份,可使编译器确认代码在何处分隔。 分隔符有三种注释符空白符普通分隔符,头发全,无麻子,脾气不大,和顺。 头发全无,麻子,脾气不大和顺。,8,1注释符,注释是程序员为了提高程序的可读性和可理解性,在源程序的开始或中间对程序的功能、作者、使用方法等所写的注解。注释仅用于阅读源程序,系统编译程序时,忽略其中的所有注释。注释有两种类型: / 注释一行以“/”开始,最后以回车结束。一般作单行注释使用,也可放在某个语句的后面。 /* */一行或多行注释
4、以“/*”开始,最后以“*/”结束,中间可写多行。,9,2空白符,空白符包括空格、回车、换行和制表符(Tab键)等符号,用来作为程序中各种基本成份之间的分隔符。 各基本成份之间可以有一个或多个空白符,其作用相同。和注释一样,系统编译程序时,只用空白符区分各种基本成份,然后忽略它。,10,3普通分隔符,普通分隔符和空白符的作用相同,用来区分程序中的各种基本成份,但它在程序中有确定的含义,不能忽略。Java有以下普通分隔符:. 句号,用于分隔包、类或分隔引用变量中的变量和方法;分号,是Java语句结束的标志;,逗号,分隔方法的参数和变量说明等;:冒号,说明语句标号; 大括号,用来定义复合语句、方法
5、体、类体及数组的初始化; 方括号,原来定义数组类型,及引用数字的元素值;() 小括号,用于在方法定义和访问中将参数表括起来,或在表达式中定义运算的先后次序。,11,2.2 常量与变量,常量和变量在程序代码中随处可见,下面就具体讲解常量和变量的概念及使用要点,从而达到区别常量和变量的目的。,12,2.2.1常量的概念及使用要点,所谓常量,就是值永远不允许被改变的量。如果要声明一个常量,就必须用关键字final修饰,声明常量的具体方式如下: final 常量类型 常量标识符; 例如: final int YOUTH_AGE;/ 声明一个int型常量 final float PIE;/ 声明一个fl
6、oat型常量 注意:按照Java命名规则,常量标识符所有的字符都要大写,各个单词之间用下划线 _ 分隔,13,常量,在声明常量时,通常情况下立即为其赋值,即立即对常量进行初始化,声明并初始化常量的具体方式如下:final 常量类型 常量标识符 = 常量值; 例如: final int YOUTH_AGE = 18; / 声明int型常量,初始化为18 final float PIE = 3.14F / 声明float型常量,初始化为3.14说明:为float型常量赋值时,需要在数值的后面加上一个字母“F”或“f” 。,14,常量,声明多个同一类型的常量,可以采用下面的形式: final 常量类
7、型 常量1= 常量值1, 常量2= 常量值2, ; 例如: final int NUM1 = 14, NUM2 = 25, NUM3 = 36;注意:如果在声明常量时已经对其进行了初始化,则常量的值不允许再被修改,15,2.2.2变量的概念及使用要点,所谓变量,就是值可以被改变的量。声明变量的具体方式如下: 变量类型 变量标识符; 例如:注意:定义变量名时,按照Java的命名规则,第一个单词的首字母小写,其他单词的首字母大写,例如 “partyMemberAge”。,String name; / 声明String型变量 int partyMemberAge ; / 声明int型变量,16,变量
8、,在声明变量时,可以立即为其赋值,即立即对变量进行初始化,具体语法如下:变量类型 变量标识符 = 变量值; 例如:,int partyMemberAge = 26; / 声明一个int型变量 float money = 3150; / 声明float类型变量,17,同类型变量,如果需要声明多个同一类型的变量,也可以采用下面的形式:变量类型 变量1, 变量2, 变量3; 变量类型 变量4= 变量值4, 变量5= 变量值5, 变量6= 变量值6; 例如:说明:变量区别于常量,它的值允许被改变。,int A, B, C; / 声明3个int型变量 int D = 4, E = 5, F = 6; /
9、 声明并分别初始化3个int型变量,18,2.3 数据类型,Java语言中的数据类型划分为两大类,分别是基本数据类型和引用数据类型。 其中基本数据类型由Java语言定义,不可以再进行划分。基本数据类型的数据占用内存的大小固定,在内存中存入的是数值本身。 引用数据类型在内存中存入的是引用数据的存放地址,并不是数据本身。,19,2.3.1 基本数据类型,基本数据类型分为: 整数型 浮点数型 字符型 逻辑型(布尔型) 它们分别用来存储整数、小数、字符和布尔值,下面将依次讲解这4个基本数据类型的特征及使用方法。,20,整数型,声明为整数型的常量或变量用来存储整数,整数型包括: 字节型(byte) 短整
10、型(short) 整型(int) 长整型(long) 这4个数据类型的区别是它们在内存中所占用的字节数不同,因此,它们所能够存储的整数的取值范围也不同。,21,整数占用内存大小以及取值范围,22,长整型数值,在为long型常量或变量赋值时,需要在所赋值的后面加上一个字母“L”(或“l”),说明所赋的值为long型。如果所赋的值未超出int型的取值范围,也可以省略字母“L”(或“l”)。例如下面的代码均是正确的。,long la = 9876543234L; / 超出了int取值范围,必须加“L” long lb = 98765432L; / 未超出int取值范围,也可以加“L” long lc
11、 = 98765432; / 未超出int取值范围,可以省略“L”,23,浮点数,声明为浮点数型的常量或变量用来存储小数,浮点数包括单精度型(float)和双精度(double)两个基本数据类型,这两个数据类型的区别是它们在内存中所占用的字节数不同,因此,它们所能够存储的整数的取值范围也不同,24,float型数值,在为float型常量或变量赋值时,需要在所赋值的后面加上一个字母“F”(或“f”),说明所赋的值为float型。如果所赋的值为整数,并且未超出int型的取值范围,也可以省略字母“F”(或“f”)。例如下面的代码均是正确的。,float fa = 9412.75F; / 赋值为小数,
12、必须 “F” float fb = 9876543210F; / 赋值超出int取值范围,必须 “F” float fc = 9412F; / 未超出int取值范围,可以 “F” float fd = 9412; / 也可以省略“F”,25,double型数值,在为double型常量或变量赋值时,需要在所赋值的后面加上一个字母“D”(或“d”),说明所赋的值为double型。如果所赋的值为小数,或者所赋的值为整数,并且未超出int型的取值范围,也可以省略字母“D”(或“d”)。 例如下面的代码均是正确的。,double da = 9412.75D; / 所赋值为小数,可以加上 “D” doub
13、le db = 9412.75; / 所赋值为小数,也可以省略 “D” double dc = 9412D; / 未超出int取值范围,可以加上 “D” double dd = 9412; / 未超出int取值范围,可以省略“D” double de = 9876543210D; / 超出int取值范围,必须加上 “D,26,字符型,声明为字符型的常量或变量用来存储单个字符,它占用内存的2个字节来存储,字符型利用关键字“char”进行声明。 Java中的字符通过Unicode字符编码,以二进制的形式存储到计算机中,计算机可通过数据类型判断要输出的是一个字符还是一个整数。Unicode编码采用无
14、符号编码,一共可存储65536个字符,所以Java中的字符几乎可以处理所有国家的语言文字。,27,字符型数值,在为char型常量或变量赋值时,无论值是一个英文字母,或者是一个符号,还是一个汉字,必须将所赋的值放在英文状态下的一对单引号中。 例如下面的代码分别将字母“M”、符号“*”和汉字“男” 赋值给char型变量ca、cb和cc。,char ca = M; / 将大写字母“M”赋值给char型变量 char cb = *; / 将符号“*”赋值给char型变量 char cc = 男; / 将汉字“男”赋值给char型变量,28,逻辑型,声明为逻辑型的常量或变量用来存储逻辑值,逻辑值只有tr
15、ue和false,分别用来代表逻辑判断中的“真”和“假”,逻辑型利用关键字“boolean”进行声明。 例如下面的代码分别将true和false赋值给变量ba和bb。,boolean ba = true; / 将true赋值给变量ba boolean bb = false; / 将false赋值给变量bb,29,逻辑型,也可以将逻辑表达式赋值给boolean型变量,例如下面的代码分别将逻辑表达式“6 8”赋值给boolean型变量ba和bb。,boolean ba = 6 8; / 将表达式“6 8”赋值给变量bb,30,2.3.2 引用数据类型,引用数据类型就是指向一片内存空间地址的变量类型
16、,包括类引用、接口引用以及数组引用。 下面的代码分别声明一个java.lang.Object类的引用、java.util.List接口的引用和一个int型数组的引用。说明:将引用数据类型的常量或变量初始化为null时,表示引用数据类型的常量或变量不引用任何对象。,Object object = null; / 声明一个Object类的引用变量 List list = null; / 声明一个List接口的引用变量 int months = null; / 声明一个int型数组的引用变量,31,2.3.3基本类型与引用类型的区别,基本数据类型与引用数据类型主要区别在以下两个方面: 基本数据类型与
17、引用数据类型的组成 Java虚拟机处理基本数据类型变量与引用数据类型变量的方式。,32,组成,基本数据类型是一个单纯的数据类型,它表示的是一个具体的数字、字符或逻辑值,例如68、M或true 对于引用数据类型,若一个变量引用的是一个复杂的数据结构的实例,则该变量的类型就属于引用数据类型 在引用数据类型变量所引用的实例中,不仅可以包含基本数据类型的变量,还可以包含对这些变量的具体操作行为,甚至是包含其他引用类型的变量。,33,组成,【例】基本数据类型与引用数据类型 例如: 创建一个档案类Record 在该类中利用引用类型变量name存储姓名 利用char型变量sex存储性别 利用int型变量ag
18、e存储年龄 利用boolean型变量married存储婚姻状况 提供一些操作这些变量的方法,34,Java虚拟机的处理方式,对于基本数据类型的变量,Java虚拟机会根据变量的实际类型为其分配内存空间。 例如为int型变量分配4个字节的内存空间。 而引用类型的变量,Java虚拟机在内存空间中存放的并不是变量所引用的对象,而是对象在堆内存中存放的地址,所以引用变量最终只是指向被引用的对象,而不是存储引用对象的数据,因此两个引用变量之间的赋值,就是将一个引用变量存储的地址复制给另一个引用变量,从而使两个变量指向同一个对象。,35,例如创建一个图书类Book:声明两个Book类的实例,分别通过变量bo
19、ok1和book2进行引用,对book1进行具体的初始化,而将book2初始化为null,具体代码如下。,public class Book String isbn = “978-7-115-16451-3”;String name = “应用开发完全手册”;String author = “科技”;float price = 59.00F; ,Book book1 = new Book(); Book book2 = null;,36,Java虚拟机为引用变量book1、book2及book1所引用对象的成员变量分配的内存空间如下图所示。从图中可以看出,变量book1引用了Book类的实例,
20、book2没有引用任何实例。,37,下面对变量book2进行具体的初始化,将book1引用实例的地址复制给book2变量,即book2与book1引用同一个Book类的实例,具体代码如下: book2 = book1; 此时Java虚拟机的内存空间分配情况如下图所示。,38,2.3.4 数据类型之间的相互转换,所谓数据类型之间的相互转换,就是将变量从当前的数据类型转换为其他数据类型。 在Java中数据类型之间的相互转换可以分为以下3种情况: 基本数据类型之间的相互转换; 字符串与其他数据类型之间的相互转换; 引用数据类型之间的相互转换。 说明:这里只介绍基本数据类型之间的相互转换,其他两种情况
21、将在相关的章节中介绍。,39,2.3.4 数据类型之间的相互转换,在对多个基本数据类型的数据进行混合运算时,如果这几个数据并不属于同一基本数据类型,需要先将它们转换为统一的数据类型,然后才能进行运算。 基本数据类型之间的相互转换又分为两种情况: 自动类型转换 强制类型转换,40,自动类型转换,当需要从低级类型向高级类型转换时,编程人员无需进行任何操作,Java会自动完成类型转换。低级类型是指取值范围相对较小的数据类型,高级类型则指取值范围相对较大的数据类型,例如long型相对于float型是低级数据类型,但是相对于int型则是高级数据类型。在基本数据类型中,除了boolean类型外均可参与算术
22、运算,这些数据类型从低到高的排序如下图所示。,41,自动类型转换,在不同数据类型间的算术运算中,自动类型转换可以分为两种情况进行考虑: 第一种情况 含有int、long、float或double型的数据 第二种情况 只含有byte、short或char型的数据。,42,自动类型转换 第一种情况,如果在算术表达式中含有int、long、float或double型的数据,Java首先会将所有数据类型较低的变量自动转换为表达式中最高的数据类型,然后再进行计算,并且计算结果的数据类型是表达式中级别最高的数据类型。,43,例如下面这段代码:Java首先会自动将表达式“b*c-i+l”中的变量b、c和i的
23、数据类型转换为long型。然后再进行计算,并且计算结果的数据类型为long型。 所以将表达式“b*c-i+l”直接赋值给数据类型相对小于long型(例如int型)的变量是不允许的,但是可以直接赋值给数据类型相对大于long型(例如float型)的变量。,byte b = 75; char c = c; int i = 794215; long l = 9876543210L; long result = b * c - i + l;,44,再看下面这段代码:Java首先会自动将表达式“b*c-i+d”中的变量b、c和i的数据类型转换为double型,然后再进行计算,并且计算结果的数据类型为do
24、uble型。 所以将表达式“b*c-i+d”直接赋值给数据类型相对小于double型(例如long型)的变量是不允许的。,byte b = 75; char c = c; int i = 794215; double d = 11.17; double result = b * c - i + d;,45,自动类型转换 第二种情况,如果在算术表达式中只含有byte、short或char型的数据,Java首先会将所有变量的类型自动转换为int型,然后再进行计算,并且计算结果的数据类型是int型。,46,例如下面这段代码:Java首先会自动将表达式“b + s * c”中的变量b、s和c的数据类型
25、转换为int型,然后再进行计算,并且计算结果的数据类型为int型。 所以将表达式“b + s * c”直接赋值给数据类型小于int型(例如char型)的变量是不允许的,但是可以直接赋值给数据类型相对大于int型(例如long型)的变量。,byte b = 75; short s = 9412; char c = c; int result = b + s * c;,47,再看下面这段代码:即使是在这段代码中,Java也会自动将表达式“s1 * s2”中的变量s1和s2的数据类型转换为int型,然后再进行计算,并且计算结果的数据类型也为int型。 对于数据类型为byte、short、int、lo
26、ng、float和double的变量,可以将数据类型较小的数据或变量,直接赋值给数据类型较大的变量,但是相反的条件则不成立。,short s1 = 75; short s2 = 9412; int result = s1 * s2;,48,2强制类型转换,如果需要把数据类型较高的数据或变量赋值给数据类型相对较低的变量,就必须进行强制类型转换。 例如将Java默认为double型的数据“7.5”,赋值给数据类型为int型变量的方式如下: int i = (int) 7.5; 这句代码在数据“7.5”的前方添加了代码“(int)”,意思就是将数据“7.5”的类型强制转换为int型。 在执行强制类型
27、转换时,可能会导致数据溢出或精度降低。例如上面语句中变量i的值最终为7,导致数据精度降低。,49,2强制类型转换,如果将Java默认为int型的数据“774”赋值给数据类型为byte型变量,方法如下: byte b = (byte) 774; 最终变量b的值为6,原因是整数774超出了byte型的取值范围,在进行强制类型转换时,整数774的二进制数据的前24位将被舍弃,变量b的数值是后8位的二进制数据,如下图所示。,50,2.4 运 算 符,Java语言中的运算符主要包括: 赋值运算符 算术运算符 关系运算符 逻辑运算符 位运算符 下面介绍各个运算符的使用方法。,51,2.4.1 赋值运算符,
28、赋值运算符的符号为“=”,它的作用是将数据、变量、对象赋值给相应类型的变量,例如下面的代码:赋值运算符的运算顺序为从右到左。例如在下面的代码中,首先是计算表达式“9412 + 75”的和,然后将计算结果赋值给变量result:,int i = 75; / 将数据赋值给变量 long l = i; / 将变量赋值给变量 Object object = new Object(); / 创建对象,int result = 9412 + 75;,52,赋值运算符,如果两个变量的值相同,也可以采用下面的方式完成赋值操作:,int x, y; / 声明两个int型变量 x = y = 0; / 为两个变量
29、同时赋值,53,2.4.2 算术运算符,算术运算符支持整数型数据和浮点数型数据的运算,当整数型数据与浮点数型数据之间进行算术运算时,Java会自动完成数据类型的转换,并且计算结果为浮点数型。,54,算术运算符,在进行算术运算时,有两种情况需要考虑: 没有小数参与运算 有小数参与运算。,55,没有小数参与运算,在对整数型数据或变量进行加法(+)、减法(-)和乘法(*)运算时,与数学中的运算方式完全相同,但是在整数之间进行除法(/)和求余(%)运算时需要注意几个问题。 注意除法运算 注意求余运算 关于0的问题,56,除法运算,在整数类型的数据和变量之间进行除法运算时,无论能否整除,运算结果都将是一
30、个整数,而且这个整数不是通过四舍五入得到的,而是简单地去掉小数部分。 例如通过下面的代码分别计算10除以3和5除以2,最终输出的运算结果依次为3和2:,System.out.println(10 / 3); / 输出运算结果为3 System.out.println(5 / 2); / 输出运算结果为2,57,求余运算,在整数类型的数据和变量之间进行求余(%)运算时,运算结果是数学运算中余数。 例如通过下面的代码分别计算10%3、10%5和10%7,最终输出的运算结果依次为1、0和3:,System.out.println(10 % 3); / 输出运算结果为1 System.out.prin
31、tln(10 % 5); / 输出运算结果为0 System.out.println(10 % 7); / 输出运算结果为3,58,关于0的问题,与数学运算一样,0可以做被除数,但是不可以做除数。当0做被除数时,无论是除法运算,还是求余运算,运算结果都为0。 例如通过下面的代码分别计算0除以6和0除以6求余数,最终输出的运算结果均为0:注意:如果0做除数,虽然可以编译成功,但是在运行时会抛出java.lang.ArithmeticException异常,即算术运算异常。,System.out.println(0 / 6); / 输出运算结果为0 System.out.println(0 % 6
32、); / 输出运算结果为0,59,有小数参与运算,在对浮点数类型的数据或变量进行算术运算时,如果在算术表达式中含有double类型的数据或变量,则运算结果为double型,否则运算结果为float型。 在对浮点数类型数据或变量进行算术运算时,计算机的计算结果可能会在小数点后包含n位小数,这些小数在有些时候并不是精确的,计算机的计算结果会与数学运算的结果存在一定的误差,只能是尽量接近数学运算中的结果。,60,有小数参与运算,如果被除数为浮点型数据或变量,无论是除法运算,还是求余运算,0都可以做除数。如果是除法运算,当被除数是正数时,运算结果为Infinity,表示无穷大,当被除数是负数时,运算结
33、果为-Infinity,表示无穷小;如果是求余运算,运算结果为NaN,表示非数字。 例如下面的代码:,System.out.println(7.5 / 0); / 输出的运算结果为Infinity System.out.println(-7.5 / 0); / 输出的运算结果为-Infinity System.out.println(7.5 % 0); / 输出的运算结果为NaN System.out.println(-7.5 % 0); / 输出的运算结果为NaN,61,2.4.3 关系运算符,关系运算符用于比较大小,运算结果为boolean型,当关系表达式成立时,运算结果为true,否则运
34、算结果为false。,要注意关系运算符“=”和赋值运算符“=”的区别!,62,2.4.4 逻辑运算符,逻辑运算符用于对boolean型数据进行运算,运算结果仍为boolean型。Java中的逻辑运算符包括: !(取反) (异或) &(与) |(或) &(简洁与) |(简洁或) 下面将依次介绍各个运算符的用法和特点。,63,取反运算符“! ”,运算符“! ”用于对逻辑值进行取反运算,当逻辑值为true时,经过取反运算后运算结果为false,否则当逻辑值为false时,经过取反运算后运算结果则为true, 例如下面的代码:,System.out.println(!true); / 输出结果为fal
35、se System.out.println(!false); / 输出结果为true,64,异或运算符“”,运算符“”用于对逻辑值进行异或运算,当运算符的两侧同时为true或false时,运算结果为false,否则运算结果为true。 例如下面的代码:,System.out.println(true true); / 输出的运算结果为false System.out.println(true false); / 输出的运算结果为true System.out.println(false true); / 输出的运算结果为true System.out.println(false false);
36、 / 输出的运算结果为false,65,运算符“&”和“&”,运算符“& ”和“&”均用于逻辑与运算,当运算符的两侧同时为true时,运算结果为true,否则运算结果均为false。 例如下面的代码:,System.out.println(true / 输出结果为false,66,运算符“&”和“&”的区别,运算符“&”为简洁与运算符,运算符“&”为非简洁与运算符,它们的区别如下: 运算符“&”只有在其左侧为true时,才运算其右侧的逻辑表达式,否则直接返回运算结果false。 运算符“&”无论其左侧为true或false,都要运算其右侧的逻辑表达式,最后才返回运算结果。,67,运算符“|”和
37、“|”,运算符“| ”和“|”均用于逻辑或运算,当运算符的两侧同时为false时,运算结果为false,否则运算结果均为true,例如下面的代码:,System.out.println(true | true); / 输出的运算结果为true System.out.println(true | false); / 输出的运算结果为true System.out.println(false | true); / 输出的运算结果为true System.out.println(false | false); / 输出的运算结果为false System.out.println(true | tru
38、e); / 输出的运算结果为true System.out.println(true | false); / 输出的运算结果为true System.out.println(false | true); / 输出的运算结果为true System.out.println(false | false); / 输出的运算结果为false,68,运算符“|”和“|”的区别,运算符“|”为简洁或运算符,运算符“|”为非简洁或运算符,它们的区别如下:运算符“|”只有在其左侧为false时,才运算其右侧的逻辑表达式,否则直接返回运算结果true。 运算符“|”无论其左侧为true或false,都要运算其右
39、侧的逻辑表达式,最后才返回运算结果。,69,2.4.5 位运算符,位运算是对操作数以二进制位为单位进行的操作和运算,运算结果均为整数型。 位运算符又分为逻辑位运算符和移位运算符两种。,70,逻辑位运算符,逻辑位运算符包括: “”(按位取反) “&”(按位与) “|”(按位或) “”(按位异或) 它们用来对操作数进行按位运算,运算规则如下表所示。,71,逻辑位运算符,按位取反运算是将二进制位中的0修改为1,1修改为0;在进行按位与运算时,只有当两个二进制位都为1时,结果才为1;在进行按位或运算时,只要有一个二进制位为1,结果就为1;在进行按位异或运算时,当两个二进制位同时为0或1时,结果为0,否
40、则结果为1。,72,移位运算符,移位运算符包括: “”(右移,高位添符号位) “”(无符号右移,高位添0补齐) 它们用来对操作数进行移位运算。,73,2.4.6 对象运算符(instanceof),对象运算符用来判断对象是否为某一类型,运算结果为boolean型,如果是则返回true,否则返回false,对象运算符的关键字为“instanceof”,它的用法为: 对象标识符 instanceof 类型标识符 例如:,java.util.Date date = new java.util.Date(); System.out.println(date instanceof java.util.D
41、ate); / 结果为true System.out.println(date instanceof java.sql.Date); / 结果为false,74,2.4.7 其他运算符,Java中除了前面介绍的几类运算符外,还有一些不属于上述类别的运算符,如下表所示。,75,自动递增、递减运算符,与C、C+类似,Java语言也提供了自动递增与递减运算符,其作用是自动将变量值加1或减1。 它们既可以放在操作元的前面,也可以放在操作元的后面,根据运算符位置的不同,最终得到的结果也是不同的。 放在操作元前面的自动递增、递减运算符,会先将变量的值加1,然后再使该变量参与表达式的运算,76,自动递增、递
42、减运算符,放在操作元后面的递增、递减运算符,会先使变量参与表达式的运算,然后再将该变量加1。 例如:,int num1=3; int num2=3; int a=2+(+num1); /先将变量num1加1,然后再执行“2+4” int b=2+(num2+); /先执行“2+3”,然后再将变量num2加1,77,三元运算符“?:”,三元运算符“?:”的应用形式如下:三元运算符“?:”的运算规则为: 若逻辑表达式的值为true,则整个表达式的值为表达式1的值,否则为表达式2的值。 例如:这段代码的输出结果为“库存量:12”,逻辑表达式 ? 表达式1 : 表达式2,int store=12; S
43、ystem.out.println(store=5?“库存不足!“:“库存量:“+store);,78,2.4.8 运算符的优先级别 及结合性,当在一个表达式中存在多个运算符进行混合运算时,会根据运算符的优先级别来决定运算顺序,优先级最高的是括号“()”,它的使用与数学运算中的括号一样,只是用来指定括号内的表达式要优先处理。 例如:,int num=8*(4+6); / num为80,79,2.4.8 运算符的优先级别 及结合性,对于处在同一层级的运算符,则按照它们的结合性,即“先左后右”还是“先右后左”的顺序来执行。 Java中除赋值运算符的结合性为“先右后左”外,其他所有运算符的结合性都是
44、“先左后右”。 关于运算符优先级的顺序,如下表所示。,80,81,2.5 数 组,数组是一种最为常见的数据结构,通过数组可以保存一组相同数据类型的数据,数组一旦创建,它的长度就固定了。 数组的类型可以为基本数据类型,也可以为引用数据类型,可以是一维数据,二维数据,甚至是多维数据。,82,2.5.1 一维数组,声明一维数组的方式如下:这两种声明数组格式的作用是相同的。创建数组实质上就是在内存中为数组分配相应的存储空间,有两种方式可以创建数组,一种是通过new关键字创建,另一种是通过“ ”创建,例如:,数组类型 数组标识符; 数组类型 数组标识符;,int months = new int12;
45、/months的长度为12 boolean members = false, true, true, false ; /members的长度为4,83,一维数组,在访问数组中的元素时,需要同时指定数组标识符和元素在数组中的索引,例如访问上面代码中创建的数组,输出索引位置为2的元素,具体代码如下:执行这段代码,输出的内容为“0”和“true”,在通过new关键字创建数组时,得到的数组并没有被初始化,int型数组默认数组元素均为0,而通过“ ”创建数组的同时就初始化了数组。,System.out.println(months2); System.out.println(members2);,84,
46、一维数组,如果需要为数组中的某个元素赋值,方式如下:如果需要获得一维数组的长度,可以通过下面的方式:,months2 = 68; members2 = false;,System.out.println(months.length); / 输出值为12 System.out.println(members.length); / 输出值为4,85,public class A1 public static void main(String args) int a=new int5;a0=1;a1=2;a2=3;a3=4;a4=5; System.out.println(“a”+0+”=”+a0)
47、; System.out.println(“a”+4+”=”+a4);,例:一维数组的使用。该程序对数组中的每个元素赋值。,86,例一维数组的使用。该程序对数组中的每个元素赋值,结果如图所示。,87,2.5.2 二维数组,Java语言中的二维数组是一种特殊的一维数组,即数组的每个元素又是一个一维数组。声明二维数组的方式如下:例如分别声明一个int型和boolean型二维数组,具体代码如下:,数组类型 数组标识符;或数组类型 数组标识符;,int days; boolean holidays;,88,二维数组,与一维数组一样,有两种方式可以创建二维数组,一种是通过new关键字创建,另一种是通过“
48、 ”创建,例如:二维数组可以看做一个表格。数组days看成一个2行3列的表格,数组holidays看成2行3列的表格,int days = new int23; boolean holidays = true, false, true , false, true, false ;,89,二维数组,例如访问上面代码中创建的数组,具体代码如下:如果是通过下面的方式获得二维数组的长度,得到的是二维数组的行数:如果需要获得二维数组的列数,可以通过下面的方式:,System.out.println(days12); System.out.println(holidays12);,System.out.println(days.length); / 输出值为2 System.out.println(holidays.length); / 输出值为2,System.out.println(days0.length); / 输出值为3 System.out.println(holidays0.length); / 输出值为3,90,二维数组,如果是通过“ ”创建的数组,数组中每一行的列数也可以不相同,例如:通过下面的方式得到的只是第1行拥有的列数:如果需要获得二维数组中第2行和第3行拥有的列数,可以通过下面的方式:,