资源描述
第3章 Java语法基础,(时间:3次课,6学时),第3章 Java语法基础,教学提示:任何复杂的软件系统都是采用某种语言的基本特性构建起来的。 本章主要介绍:Java语言的基础知识,包括Java语言的基本元素、Java语言的流程控制。,第3章 Java语法基础,3.1 标识符、关键字、数据类型 3.2 变量、声明和赋值 3.3 变量的初始化 3.4 类型转换与强制类型转换 3.5 表达式和流程控制 3.6 数组 3.7 课后练习,3.1 标识符、关键字、数据类型,3.1.1 标识符 3.1.2 Java关键字 3.1.3 基本Java数据类型,3.1 标识符、关键字、数据类型,在前两章中已经介绍了几个Java程序,本节将介绍正式的Java程序构成的基本要素。,3.1.1 标识符,在Java语言中,标识符是变量、类或方法的名称,例如: int idCounter;/idCounter 就是一个整型变量的标识符 一个标识符可以由大写或小写的字母、数字、下划线(_)、美元符号($)按任意顺序组合而成,但不可以以数字开头。这是因为如果允许以数字开头就会和数字常量发生混淆。另外,标识符是大小写敏感的,例如idCounter和IdCounter不是同一个标识符。,3.1.2 Java关键字,关键字是对Java编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息。目前的Java语言共定义了如表3-1所示48个关键字,具体每个关键字的意义和用法将在本书之中逐步介绍。,3.1.2 Java关键字,表3-1 Java关键字,3.1.3 基本Java数据类型,Java定义了8个简单(或基本)的数据类型:字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean),这些类型可分为4组。 整数:该组包括字节型(byte),短整型(short),整型(int),长整型(long),它们是有符号整数。 浮点型数:该组包括单精度浮点型(float)和双精度浮点型(double),它们代表有小数精度要求的数字。 字符:该组包括字符型(char),它代表字符集的符号,例如字母和数字。 布尔型:该组包括布尔型(boolean),它是一种特殊的类型,表示真/假值。,3.1.3 基本Java数据类型,(1) 整数byte,short,int,long Java定义了4个整数类型:字节型(byte)、短整型(short)、整型(int)、长整型(long)。这些都是有符号的值,数值为正数或是负数。Java 不支持只能是正的无符号的整数。许多其他计算机语言,包括C/C+,支持有符号或无符号的整数。然而,无符号整数是不必要的。具体地说,无符号概念主要被用来指定高位状态,它定义了当int表示一个数字时的符号。,3.1.3 基本Java数据类型,(2) 浮点型数float,double 浮点数字也就是我们所熟知的实数。在Java中表示这些实数的方法是采用两类浮点数据类型(见表3-3),一类是单精度浮点类型(float),一类是双精度浮点类型(double),Java实现浮点数采用的是标准浮点型(IEEE-754)和运算符集,并且是独立于平台的。,3.1.3 基本Java数据类型,(3) 字符char 在Java中,存储字符的数据类型是char。 Java的char与C或C+中的char不同。在C/C+中,char的宽度是8位,但Java的情况不同。Java使用Unicode码代表字符。Unicode定义的国际化的字符集能表示迄今为止人类语言的所有字符集。它是几十个字符集的统一,因此它要求16位。这样,Java中的char类型是16位的,其范围是065536。人们熟知的标准字符集ASCII 码的范围仍然是0127,扩展的位字符集ISO-Latin-1的范围是0255。既然Java被设计为允许其开发的Applet(小应用程序)在世界范围内使用,因此使用Unicode码代表字符是说得通的。当然,Unicode的使用对于英语、德语、西班牙语或法语的语言是有点低效,因为它们的字符能容易地被包含在8位以内。但是为了全球的可移植性,这一点代价是必须的。,3.1.3 基本Java数据类型,(4) 布尔型boolean 在Java中定义了一种基本数据类型boolean来表示逻辑值,它只有两个文字值即true和false,以下是一个有关boolean类型变量的声明和初始化: boolean isClosed = false; /定义一个boolean型变量isClosed并把其初始化成false 需要特别指出的是在整数类型和boolean类型之间无转换计算。有些语言(特别值得强调的是C和C+)允许将数字值转换成逻辑值,这在Java编程语言中是不允许的;boolean类型只允许使用boolean值,即只允许使用true和false。,3.2 变量、声明和赋值,3.2.1 变量的声明 3.2.2 变量的作用域,3.2 变量、声明和赋值,变量是Java程序中的一个基本存储单元,变量由一个标识符、类型和一个可选初始值组合定义而成。此外,所有变量都有一个作用域,来定义变量的可见性和生存期。,3.2.1 变量的声明,在Java中,所有的变量必须先声明后使用。声明的方法是: Datatype identifier =value ,identifier =value ; 其中Datatype是基本数据类型之一,或者是类、接口的名字(将在以后章节介绍)。标识符是变量的名字,可以通过“=”的方式指定一个值来初始化变量,声明多个相同数据类型的变量时可以用“,”号隔开。,3.2.2 变量的作用域,本节介绍变量在Java中的作用域,可以通俗地说成变量的作用范围。 在方法内定义的变量被称为局部(local)变量,有时也被称为自动(automatic)、临时(temporary)或栈(stack)变量。 (1) 在介绍局部变量的作用域前先来介绍什么是语句、程序块。语句就是一行以分号“;”结束的代码。 (2) Java允许局部变量在任意程序块的任意位置中被声明,而在一个作用域中定义的 局部变量,对于该作用域外的程序是不可见的,即不可以被访问,这个作用域规则为封装提供了基础。,3.2.2 变量的作用域,(3) 变量可以在程序块内的任何地方被声明,但是只有在它们被声明以后才是合法有效的。 (4) 局部变量是在一个作用域被创建,当程序执行离开该作用域后被撤销,它的生存期就是程序执行其所在作用域的时间范围。 (5) 尽管程序块能被嵌套,但不能将内部作用域声明的变量与其外部作用域声明的变量重名。,3.3 变量的初始化,在前面的讲解中,当声明一个Java基本数据类型时,会在内存中分配对应的空间,而对一个非基本数据类型,如前面提到的String,或自己定义的类型时,声明这些变量时并没有分配与之类型大小对应的空间,而只是引用。 在Java程序中,任何变量都必须经初始化后才能被使用。当一个对象被创建时,实例变量在分配存储器的同时被下列值初始化,这一点与局部变量不同。,3.4 类型转换与强制类型转换,3.4.1 Java的自动转换 3.4.2 不兼容类型的强制转换 3.4.3 表达式中类型的自动提升,3.4 类型转换与强制类型转换,程序中经常把一种类型的值赋给另外类型的一个变量。如果这两种类型是兼容的,那么Java将自动进行转换。例如,把int类型的值赋给long类型的变量,总是可行的。然而,不是所有的类型都是兼容的,因此,不是所有的类型转换都是可以隐式实现的。例如,没有将double类型转换为byte类型的定义。在Java中不兼容的类型之间的转换仍然是可能的,必须使用强制类型转换来完成两个不兼容的类型之间的显式变换。接下来介绍自动类型转换和强制类型转换。,3.4.1 Java的自动转换,如果下列两个条件都能满足,那么将一种类型的数据赋给另外一种类型变量时,将执行自动类型转换(automatic type conversion): 这两种类型是兼容的。 目的类型数的范围比来源类型的大。 当以上两个条件都满足时,发生拓宽转换(widening conversion)。,3.4.2 不兼容类型的强制转换,为了完成两种不兼容类型之间的转换,必须进行强制类型转换。所谓强制类型转换只不过是一种显式的类型变换。它的通用格式如下: (target-type)value 其中,目标类型(target-type)指定了要将指定值转换成的类型。 当把浮点值赋给整数类型时将发生一种不同的类型转换:截断(truncation)。整数没有小数部分,当把浮点值赋给整数类型时,其小数部分会被舍去。,3.4.3 表达式中类型的自动提升,除了赋值,还有另外一种类型变换:在表达式中,对中间值的精确要求有时超过任何一个操作数的范围。 除了将byte类型和short类型提升到int类型以外,Java定义了若干适用于表达式的类型提升规则(type promotion rules)。 所有的byte类型和short类型的值被提升到int类型。 如果一个操作数是long类型,整个表达式将被提升到long类型;如果一个操作数是float类型,整个表达式将被提升到float类型;如果有一个操作数是double类型,计算结果就是double类型。,3.5 表达式和流程控制,3.5.1 运算符 3.5.2 运算符优先级 3.5.3 流程控制 3.5.4 特殊循环控制,3.5 表达式和流程控制,在学习完数据类型后,下面就将介绍如何利用这些数据类型进行各种逻辑操作,就是如何控制程序的执行流程,使得程序完成编程需要的行为,首先介绍Java中的运算符。,3.5.1 运算符,Java提供了丰富的运算符环境。Java有4大类运算符:算术运算、位运算、关系运算和逻辑运算。Java还定义了一些附加的运算符用于处理特殊情况。本节将描述Java所有的运算符,比较运算符instanceof将在以后的章节讨论。Java语言中的运算符在风格和功能上都与C和C+极为相似。下面将分别介绍。,3.5.1 运算符,1. 算术运算符 算术运算符用来进行整型或浮点数据的算术运算,算术运算符用在数学表达式中,其用法和功能与代数学(或其他计算机语言)中一样,Java定义的算术运算符见表3-5。,3.5.1 运算符,表3-5 Java算术运算符,3.5.1 运算符,2. 关系运算符 关系运算符是比较两个表达式大小关系的运算,它的结果是真(true)或假(false),关系运算符有6种,如表3-6所示。,3.5.1 运算符,表3-6 关系运算符,3.5.1 运算符,3. 逻辑运算符 逻辑运算符(见表3-7)是对布尔型(boolean)变量进行运算,其结果也是布尔型(boolean)。,3.5.1 运算符,表3-7 逻辑运算符,3.5.1 运算符,4. 位运算 位运算是以二进制位(bit)进行计算,操作数和结果都是整数类型,包括long、int、short、char、byte。位逻辑运算符有“与(AND)”、“或(OR)”、“异或(XOR)”、“非(NOT)”,分别用“ int i = x0?y:z; 此处由于x0成立,所以i取y的值为2。,3.5.1 运算符,6. 用加号(+)进行串连接 【例3.27】运算符+能够进行String对象的连接并生成一个新的String,程序如下。 String salutation = Dr. ; String name = Jack + Arthur; String title = salutation + name; 最后一行的结果如下。 Dr. Jack Arthur 如果+运算符中有一个自变量为String对象,则其他自变量将被转换成String。所有对象都可被自动转换成String,不是串的对象是通过使用toString()成员函数而转换成串的。,3.5.2 运算符优先级,运算符优先级就是多个运算符联合操作时各个运算符执行的顺序。表3-10显示了Java 运算符从最高到最低的优先级。表中的符号从最上方到最下方优先级依次降低。,3.5.2 运算符优先级,表3-10 Java运算符优先级表,3.5.3 流程控制,结构化的程序设计中的流程控制有3种,即顺序、选择和循环。这三种结构的组合可以实现任何复杂的流程控制,在Java中也同样如此。利用这三种结构写出的程序具有模块化好,可读性强,结构清晰的特点。顺序结构顾名思义很容易理解,所以下面只介绍后两种结构。,3.5.3 流程控制,1. 选择控制结构 选择控制结构是在两种或两种以上的路径上选择一种来执行,通常在选择前,先做一个判断,根据结果进行选择,Java中选择控制结构由ifelse,switch来引导。,3.5.3 流程控制,(1) ifelse语句 基本语法: if (布尔表达式) 语句或程序块; / 逻辑块 else 语句或程序块;/逻辑块 如果一个逻辑块是单个语句,可以不要“”和“”。,3.5.3 流程控制,(2) switch语句 基本语法: switch (expr1) case expr2: statements; break; case expr3: statements; break; default: statements; break; 当switch中的变量或表达式expr1的值不能与任何case值相匹配时,可选缺省符(default)指出了应该执行的程序代码。如果没有break语句作为某一个case代码段的结束句,则程序的执行将继续到下一个case,而不检查case表达式的值。,3.5.3 流程控制,2. 循环结构 循环语句使语句或块的执行得以重复进行。Java编程语言支持三种循环构造类型:for、while和do-while循环。for和while循环是在执行循环体之前测试循环条件,而do-while循环是在执行完循环体之后测试循环条件。这就意味着for和while循环可能连一次循环体都未执行,而do-while循环将至少执行一次循环体。,3.5.3 流程控制,(1) for循环 在前面的例程中曾使用过for循环的简单格式。可以看到,for循环是一个功能强大且形式灵活的结构。下面是for循环的通用格式: for(initialization; condition; iteration) /循环体 如果只有一条语句需要重复,大括号就没有必要。,3.5.3 流程控制,for循环的执行过程如下 当循环启动时,先执行其初始化部分。通常,这是设置循环控制变量值的一个表达式,作为控制循环的计数器。重要的是要理解初始化表达式仅被执行一次。 计算条件condition的值。条件condition必须是布尔表达式。它通常将循环控制变量与目标值相比较。如果这个表达式为真,则执行循环体;如果为假,则循环终止。 执行循环体的反复部分。这部分通常是增加或减少循环控制变量的一个表达式。 重复循环,首先计算条件表达式的值,然后执行循环体,接着执行反复表达式。这个过程不断重复,直到控制表达式变为假。,3.5.3 流程控制,(2) while循环 基本语法: while (布尔表达式) 语句或块 /循环体 /end while,3.5.3 流程控制,(3) do-while循环 如果while循环一开始条件表达式就是假的,那么循环体就根本不被执行。然而,有时需要在开始时条件表达式既使是假的情况下,while循环至少也要执行一次。换句话说,有时需要在一次循环结束后再测试中止表达式,而不是在循环开始时。Java就提供了这样的循环:do-while循环。do-while循环总是执行它的循环体至少一次,因为它的条件表达式在循环的结尾。 其基本语法: do 语句或块;/循环体 while (布尔测试),3.5.4 特殊循环控制,本节介绍关键字break和continue的用法。,3.5.4 特殊循环控制,1. break break关键字有三种使用方法: switch中用到的(已介绍),用来中止一个语句序列。 break可以作为一种“更加理想”的goto语句来使用。 break可以用来退出一个循环。,3.5.4 特殊循环控制,2. continue关键字 continue被用来略过并跳到循环体的结尾,来强迫循环提早反复。也就是,如果想循环继续,但是要忽略本次重复剩余的循环体语句时,就应采用continue。在for循环中,循环表达式被反复求值,然后执行条件表达式,循环继续执行,在while和do-while循环中,continue使控制流直接转到控制循环的条件表达式,循环继续执行。,3.6 数 组,3.6.1 数组的声明 3.6.2 数组的创建和引用 3.6.3 数组的初始化 3.6.4 多维数组 3.6.5 复制数组,3.6 数 组,在Java中数组是相同类型的对象的集合,并通过一个名称(就是数组名)来引用这个集合。可以声明任何类型的数组,无论是Java基本数据类型,还是类类型。,3.6.1 数组的声明,数组声明有以下两种格式 type identifier; type identifier; 两种格式并存,可选择任一种习惯的方式。这里的声明没有指出数组的实际大小,如果需要指出,可以把大小写到中即可。,3.6.2 数组的创建和引用,正如前面所述,声明数组只是创建了一个引用,可以像创建对象一样,使用关键字new 创建一个数组。其一般形式如下。 array_var = new typesize; 一旦分配了一个数组,可以在方括号内指定它的下标来访问数组中特定的元素。所有的数组下标从零开始。,3.6.2 数组的创建和引用,数组可以在声明时被初始化,这个过程和简单类型初始化的过程一样。数组的初始化(array initializer)就是包括在花括号之内用逗号分开的表达式的列表。逗号分开了数组元素的值。Java会自动地分配一个足够大的空间来保存你指定的初始化元素的个数,而不必使用运算符new。,3.6.3 数组的初始化,由前面的例子可知,当创建一个数组时,每个元素都被初始化。在上述实例中的int数组mouth_days中,每个值都被初始化为0;而数组days的每个元素都被初始化为null,表明它还未引用一个MDate对象。在经过赋值days= new MDate()之后,数组的第一个元素引用为实际MDate对象。 Java编程语言允许使用下列语句快速创建数组。 String names=Gorge,Bush,Salon; 其结果与下列代码等同。,3.6.4 多维数组,Java编程语言不提供多维数组,但是一个数组可被声明为具有任何基础类型,所以可以创建数组的数组(和数组的数组的数组,等等)。创建一个二维数组的语句如下。 int a = new int 2; a0 = new int5; a1 = new int4; 首次调用new而创建的对象是一个数组,它包含两个元素,每个元素的类型为整型数组(array of int),并且初始时这两个元素都为null,然后对这两个元素(其实这两个元素就是两个引用)进行初始化。,3.6.5 复制数组,数组一旦创建后,其大小就不可被调整了。前面提到数组变量其实是一个引用,所以可利用该引用变量来引用一个全新的数组: int MyArray = new int6; MyArray = new int10; 语句中,第一个数组被丢失,但是如果数组的引用变量存在,还可以调用该数组。 为了便于数组的操作,在Java中提供了一种复制数组的方法,就是类System中的arraycopy()方法。,3.7 课 后 练 习,1. 填空题 (1)Java中有 种基本数据类型。 (2)Java的算术运算符是双目的有 。 2. 选择题 (1)现有语句String s=Example;则下面哪些语句是合法语句?( ) A. s=3 B. s3=x C. int i=s.length(); D. String t=For+s; (2)下面哪些是Java保留字?( ) A. run B. default C. implement D. import 3. 判断题 (1)()的运算优先级最高。( ) (2)switch语句不能像if语句那样嵌套。( ),3.7 课后练习,4. 简答题 (1)判断下列标识符,哪些是合法的,哪些是非法的。 SessionIdCounter _myCup m_static this 3upt $startTime sip_msg u+tu (dt_end) superStar (2)Java中有哪几种流程控制语句? 5. 操作题 (1)创建一个类和相应的对象,完成下面的任务。 在类中编写一个类方法,然后为类型MyPoint声明两个变量,将变量称为start和end;用new MyPoint()创建对象并分别将引用值赋予变量start和end; 将值10赋予对象start的成员x和y; 将值20赋予对象end的x值,将值20赋予对象end的y值。 分别打印MyPoint对象(start和end)的成员值(x和y)。打印可参考如下语句: System.out.println(Start MyPoint = x:+start.x + y + start.y);,Q & A?Thanks!,
展开阅读全文