• 1. 第2章 Java语言基础§2.1 语言成分 §2.2 流程控制语句 §2.3 数组 §2.4 静态方法 §2.5 字符串1
  • 2. 第二章 Java语言基础学习目标: ◆掌握Java语言的基本数据类型、操作符、表达式; ◆掌握Java程序的流程控制方式,重点是分支结构和循环结构。 ◆掌握Java中数组的概念及使用 ◆了解Java应用程序的一般结构
  • 3. §2.1 语言成分一. 标识符与关键字 二. 基本数据类型 三. 变量与常量 四. 运算符与表达式3
  • 4. 一.标识符与关键字 Unicode字符编码:由国际Unicode协会编制,收录了全世界所有语言文字中的字符,是一种跨平台的字符编码。 USC:指采用Unicode字符编码的通用字符集。 Unicode字符编码的两种方案: 16位编码和32位编码,对应的字符集称为USC-2和USC-4 Java语言采用USC-2字符集,其前128个字符与ASCII字符集 完全一致,之后是其他语言文字,如拉丁语、汉字等。4
  • 5. 一.标识符与关键字1. 关键字 2. 标识符 3. 分隔符 4. 注释 5. 程序书写风格5
  • 6. 一.标识符与关键字 关键字是由Java语言定义的、具有特定含义的单词。每一个关键字都有一种特定含义,不能被赋予别的含义。 关键字在UltraEdit、JCreator等编辑器中以蓝色显示。1.关键字(keyword)6
  • 7. 一.标识符与关键字2.标识符(identifier) 标识符是以字母开头的字母数字序列,是用户定义的单词,用于命名变量、常量、类、对象等元素。 标识符的命名规则说明如下 : 数字指0-9,字母指大小写英文字母、下划线(_)和美元 符($),也可以是Unicode字符集中的字符,如汉字等。 可以是字母、数字等字符的任意组合,不能包括其他 字符(如+、-等) 区分字母大小写 不能使用关键字 长度不受限制7
  • 8. 一.标识符与关键字Java约定: 关键字、变量名、对象名、方法名、包名通常全 部小写; 如果由多个单词构成标识符,则首字母小写,其 后单词字母大写,如toString; 类名首字母大写; 常量名全部字母均大写。 8
  • 9. myVariable 9pins MYVARIABLE i a+c testing1-2-3_myvariable 2. $myvariable 3. 猫一.标识符与关键字9
  • 10. 一.标识符与关键字3.分隔符(separator) 分隔符用于分开两个语法成分,不同的语法成分使用不同的分隔符。 空格——关键字、标识符的分隔符; 分号;——语句的分隔符; 逗号,——数据的分隔符。10
  • 11. 一.标识符与关键字4.注释(commentary) 注释:程序中用于说明和解释的一段文字,对程序运行不起作用。 程序中添加注释的目的是增强程序的可读性。// 单行注释,注释号“//”后的一行内容为注释 /* 多行注释,两个注释号之间的一行或多行内容为注释 */ /** 文档注释,用于从源代码自动生成文档 执行javadoc命令,可根据源代码中的内容生成Web网页 */11
  • 12. (结构清晰,适当注释,命名规范)‏ 一.标识符与关键字5. 程序书写风格结构清晰: 顺序语句——对齐格式; 循环体、函数体等语句——缩进格式显示语句间的 层次关系,即以上一句为参照,下一句向右缩进4个 空格,其余类推。12
  • 13. 二. 基本数据类型1. 什么是数据类型 2.数据类型的分类 3. 基本数据类型 ◆整数类型 ◆浮点数类型 ◆布尔类型 ◆字符类型13
  • 14. 二. 基本数据类型1. 什么是数据类型 数据——描述客观事物的数字、字符以及所有能输入到计算机 中并能被计算机接受的各种符号集合。 类型——具有相同逻辑意义的一组值的集合。 数据类型——指一个类型和定义在这个类型上的操作集合。 定义了数据的性质、取值范围以及对数据所能 进行的运算和操作。14
  • 15. 二. 基本数据类型2. 数据类型的分类 基本数据类型:数值类型 整数类型byte、short、int、long 浮点数类型float、double 字符类型char 布尔类型boolean 引用数据类型:数组 类(class) 接口(interface)15
  • 16. 二. 基本数据类型2. 数据类型的分类 基本数据类型是由一种简单数据构成的数据类型,这种 简单数据的值是不可分解的,它可直接参与该类型所允许的 运算。⑴ 基本数据类型(primitive types)整数类型——byte, short, int, long 浮点数类型——float, double 字符类型——char 布尔类型——boolean16
  • 17. 二. 基本数据类型2. 数据类型的分类 ⑵ 引用数据类型(reference types) 基本数据类型的变量保存数据值, 引用数据类型的变量保存地址。引用数据类型: 数组(array)、类(class)、接口(interface)17
  • 18. 3. 基本数据类型 整型是具有固定上下界的整数,包括正整数、零、负整数。Java语言定义了4种整数类型,每种整数类型的值都是带符 号位的,不同整数类型的差别在于占用内存的大小不同和 数据取值范围不同。一个整数隐含类型为int。表示一个长整数值时,需要在整 数后加上后缀L或l。 Java提供了3种进制的整数表示形式: 十进制数、八进制数、十六进制数(1)整数类型(int)18
  • 19. 类型描述占用空间字节型byte 8位有符号整数,其数值范围在-128~127,即-27—27-11字节短整型short 16位有符号整数,其数值范围在 -32768~32767之间, 即-215—215-12字节整型int 32位有符号整数,其数值范围在 -2147,483,648~2147,483,647之间, 即-231—231-14字节长整型long 64位有符号整数,其值在-263~263-1之间, 即-263—263-18字节(1)整数类型(int)3. 基本数据类型19
  • 20. 3. 基本数据类型Java采用浮点型表示数学中的实数,一个浮点数值包括整数部分和小数部分。Java的浮点数类型有两种: 单精度浮点数和双精度浮点数浮点数有两种表示法: 标准记数法—如1.0,123.45等 科学记数法—由十进制整数、小数点、小数和指数部分构成。 如123.45可以表示为1.2345E+2 其中,E之前的数称为尾数,表示数据精度; E之后的数称为阶码,表示是10的次方数,必须是整数。(2)浮点数类型(float)20
  • 21. 类型描述占用空间单精度浮点数float32位单精度浮点数4字节双精度浮 点数double64位双精度浮点数8字节(2)浮点数类型(float)3. 基本数据类型21
  • 22. 3. 基本数据类型(3)布尔类型(boolean) Java中的布尔型,它的值只能有“true”或“false”两种形式。 与C/C++中的逻辑值不同的是,它不能代表整数,同时它 也不是字符串,不能被转换成字符串常量。 所有关系运算的返回值都为布尔型,主要用于条件运算。22
  • 23. 3. 基本数据类型(4)字符类型(char)字符类型表示Unicode字符,一个字符占用16位。字符常量的两种表示法: 用单引号将可见ASCII字符括起来;例如’A’ 用Unicode值表示,前缀是“\u”,表示范围为 \u0000—\uFFFF;例如\u0041表示‘A’。不可见的ASCII控制字符(如换行符、回车符等)用转义字符表示,转义字符的前缀是“\”。 Java转义字符表23
  • 24. 转义续列Unicode转义代码含义\n\u000a换行符\t\u0009制表符\b\u0008回格(BS)\r\u000d回车符\f\u000c换页\’\u0027单引号\"\u0022双引号\\\u005c反斜杠3. 基本数据类型(4)字符类型24
  • 25. 变量——在程序执行中其值可以发生变化的量。三. 变量与常量1.变量(variable)变量的4个基本要素:名字、类型、值和作用域。⑴ 变量声明 [修饰符] 类型 变量 [=表达式]{,变量[= 表达式]} 注:[]和{}中均是可选项,[]-可以重复0至1次, {}-可以重复0至多次。 ⑵变量参与的运算和操作 ——取决于变量的数据类型。 25
  • 26. 三. 变量与常量2. 最终变量最终变量——Java语言提供一种特殊的变量,只能进行 一次赋值。采用关键字final声明。例如: final int value; //声明最终变量,声明时没有赋值 value=100; //最终变量只能进行一次赋值 26
  • 27. 三. 变量与常量3. 常量常量——在程序执行中其值不能被改变的量。⑴ 直接常量 直接常量—指在程序中直接引用的常量,包括数值型常量和非 数值型常量。 数值型常量包括整数和浮点数; 非数值型常量包括字符常量、字符串常量和布尔常量。27
  • 28. 三. 变量与常量3. 常量以标识符形式出现的常量,在程序中不能改变其值,采用关键字final声明。 Java语言约定常量标识符全部用大写字母表示。⑵ 符号常量 例如: final int MAX=10;28
  • 29. 四. 运算符与表达式1. 运算符 2. 运算符的优先级 3. 运算符的结合性 4. 表达式书写的注意事项 5. 运算的类型兼容原则 6. 运算的正确性判断29
  • 30. 四. 运算符与表达式(1) 算术运算符 (2) 关系运算符 (3) 位运算符 (4) 逻辑运算符 (5) 赋值运算符 (6) 强制类型转换符1. 运算符(7) 条件运算符 (8) 括号运算符 (9) 字符串连接运算符 (10) 点运算符 (11) 对象运算符 (12) 逗号运算符 (13) new运算符30
  • 31. ⑴算术运算符:+(正)、-(负)、++、--;//单目运算 +(加)、-(减)、*、/(除)、%(取余);//双目运算 1. 运算符四. 运算符与表达式 ⑵关系运算符:=、< >、>、<、>=、<= ⑶位运算符: ~(非)、&(与)、|(或)、^(异或)、 <<(左移位)、>>(右移位)、>>>(无符号右移位) ⑷逻辑运算符:&(与)、|(或)、!(非)、∧(异或)、 &&(条件与)、||(条件或) 31
  • 32. 四. 运算符与表达式⑸ 赋值运算符:= 、+=等 ⑹ 强制类型转换符:(数据类型) 表达式⑺ 条件运算符:表达式1 ? 表达式2:表达式3 ⑻ 括号运算符: ()、[] ⑼字符串连接运算符:+ System.out.println("max = "+max);32
  • 33. 四. 运算符与表达式【例2.1】 求明天是星期几。【例2.2】 判断一个年份是否为闰年。⑽ 点运算符:.⑾ 对象运算符:instanceof ⑿ 逗号运算符:, ⒀ new运算符:用于申请数组存储空间,创建对象。 33
  • 34. 四. 运算符与表达式【例2.2】判断一个年份是否为闰年.(演示布尔类型的运算)闰年的规定说明: (1)不能被100整除但能被4整除的年份是闰年; (2)能被400整除的年份是闰年。 思考: (1)如果要求任意一年是否为闰年程序怎么改? (2)输入的年份是否应该有个合法范围?34
  • 35. 不同的运算符具有不同的优先顺序 可以用( )来改变优先顺序或使表达式更容易理解 2. 运算符的优先级四. 运算符与表达式 表2-7 运算符的优先级及结合性35
  • 36. 四. 运算符与表达式3. 运算符的结合性(1)单目运算符的结合性从左至右:括号运算符[]、(),即操作数在运算符的左边;从右至左:+、-、~、!、new和类型强制转换符(),即操作数在运算符的右边;36
  • 37. 四. 运算符与表达式3. 运算符的结合性(1)单目运算符的结合性两种结合性:++、--;单独运算时,两种结合性运算结果一致。 例如:i++; // 从左至右 ++i; //从右至左当与其它运算符结合时,就表现出两种结合性。 例如:int i=0, j; j=i++; //左结合,先赋值再自增,等价于j=i; i++; j=++i; //右结合,先自增再赋值,等价于i++;j=i;37
  • 38. 四. 运算符与表达式3. 运算符的结合性(2) 双目运算符的结合性从左至右:其他双目运算符;从右至左: 赋值和复合赋值运算符;例如: int m,n; m=n=2; m+=n+=2; //结果为m=2, n=2 //结果为m=6, n=438
  • 39. 四. 运算符与表达式4. 表达式书写的注意事项 乘法运算的运算符*不能省略; 数学运算的≠、≥、≤必须分别写成!=、>=、<=; 数学中的分式必须写成除式; 只有圆括号()能够改变运算次序,不能使用[]或{}改变运 算次序。39
  • 40. 四. 运算符与表达式5. 运算的类型兼容原则(1)类型相容(type compatibility) 指两个不同的数据类型具有某些相同的性质,其变量能够 参加共同的运算。例如:1.0+1 //结果数据类型为浮点型40
  • 41. 四. 运算符与表达式5. 运算的类型兼容原则(2) 赋值相容(assignment compatibility) 指一种数据类型的值可以通过赋值操作赋给另一种数据 类型的变量。赋值相容具有方向性,是不对称的关系,即赋值时,变量 数据类型必须比表达式数据类型占用的字节数 长,Java会自动将表达式转化为较长的数据类型 后再赋值。 赋值不相容时, 有些情况可以通过强制类型转换实现。 41
  • 42. 四. 运算符与表达式6. 运算的正确性判断42
  • 43. §2.2 流程控制语句一. 流程控制结构 二. 顺序结构语句 三. 选择语句 四. 循环语句 五. 转移语句43
  • 44. 一.流程控制结构1. 程序的三种基本结构顺序结构、分支结构、循环结构44
  • 45. 三种基本结构的共同特点:1.程序的三种基本结构只有一个入口点,并且只有一个出口点; 结构内的每一部分都有机会被执行到;例图(1) 结构内没有“死循环”(无终止的循环)。例图(2)45
  • 46. 2. Java语句分类46
  • 47. 二. 顺序结构语句1. 赋值语句 表达式; 2. 空语句 i=1;; 3. 复合语句 { [变量声明或常量声明]; 语句序列; }47
  • 48. 1. if语句三. 选择语句—if 语句 A. if语句的语法格式 if ( 布尔表达式 ) 语句1; [else 语句2;]48
  • 49. 三. 选择语句—if 语句【例2.3】 求三个整数中的最大值。注意:对比if语句与条件表达式的使用课后练习:用条件表达式求最大值; 用if语句求最小值。49
  • 50. if语句if-else语句三. 选择语句—if 语句B. if语句两种形式50
  • 51. C. If 语句嵌套三. 选择语句—if 语句例:if (n>=100) if (n<=999) 语句1; else 语句2;修改配对关系: if (n>=100) { if (n<=999) 语句1; } else 语句2;Java语言规定: else总是与最近的一个if语句匹配。注:缩进书写格式本身与匹配无关。51
  • 52. 2. switch语句switch (表达式) { case 常量表达式1: 语句序列1; [break;] case 常量表达式2: 语句序列2; [break;] [default: 语句序列;] }三. 选择语句—switch 语句52
  • 53. 三. 选择语句—switch 语句说明: (1)<表达式>和<常量表达式> 的数据类型必须是整数或字符 类型,不能为布尔类型,并且两者的数据类型必须一致; (2)在语句体中,每个常量表达式出现的先后次序没有限制, 但常量结果值必须唯一; (3)不同的常量表达式可以公用一些语句序列; (4)每个分支的语句序列通常以break语句结束, break语句的作用是强制退出switch语句。53
  • 54. 三. 选择语句—switch 语句【例2.4】求一个日期(年月日)对应的是星期几。P4054
  • 55. 四. 循环语句—while语句1. while语句 A. while语句语法: while (布尔表达式) 语句;【例2.5】 用while语句求1~10的累加和。P41思考:(1)如果改变循环体内两条语句的次序,则如何修改while语句 以实现相同功能?(2)如何显示:Sum=1+…+10=55Sum(8)=1+2+3+4+5+6+7+8+9+10=36i=0; while(i
  • 56. class Sum_while { public static void main(String args[]) { int i=1, n=10,s=0; System.out.println(“s= ” + s); System.out.println(“i= ” + i); } }四. 循环语句—while语句while (i <= n) { s+= i; i++; }运行结果: s=55 i=1156
  • 57. 四. 循环语句—while语句B. while语句循环执行次数问题讨论循环条件永远为true——出现死循环;“先判断后执行”——循环最少执行0次;避免死循环的相关条件 ——循环条件表达式中的变量;【例2.6】用辗转相除法求两个整数的最大公因数。P42 —— 练习57
  • 58. 四. 循环语句—do-while语句2. do-while语句 A. while语句语法: do { 语句; }while (布尔表达式); 58
  • 59. 图2.5 while与do-while语句执行流程 四. 循环语句—do-while语句59
  • 60. 四. 循环语句—do-while语句【例2.5-1】 用do-while语句求累加和。P44 对比: 例2.5 —— 例2.5-1 —— 例2.8 while语句——do-while语句——for语句60
  • 61. 四. 循环语句—do-while语句public class Sum_dowhile { public static void main(String args[]) { int i=1, n=10,s=0; System.out.println(“s= ” + s); System.out.println(“i= ” + i); } }do { s+= i; i++; } while (i <= n) 运行结果: s=55 i=1161
  • 62. B. do-while语句循环执行次数问题讨论四. 循环语句—do-while语句“先执行后判断”——循环最少执行1次;循环条件永远为true——出现死循环;避免死循环的相关条件 ——循环条件表达式中的变量;【例2.7】 计算Fibonacci序列。—— 练习P4462
  • 63. A. for语句语法: for (表达式1; 表达式2; 表达式3 ) 语句;四. 循环语句—for语句3. for语句——最有效、最灵活的循环结构 3个表达式的作用:(1)<表达式1>给循环变量赋初值; (2)<表达式2>给出循环条件,结果为布尔值; (3)<表达式3>给出循环变量的变化规律,通常是递增或递减的。63
  • 64. 四. 循环语句—for语句【例2.8】 用for语句求累加和并显示计算公式。P45对比: 例2.5 —— 例2.5-1 —— 例2.8 while语句——do-while语句——for语句64
  • 65. 四. 循环语句—for语句例:如果一个人出生于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) || (year%400==0) ) { System.out.println(year);} }1972 1976 1980 1984 1988 1992 1996 2000 2004 2008 2012 2016 2020 2024 2028 2032 203665
  • 66. 四. 循环语句—for语句B.for语句循环执行次数问题讨论for语句循环执行次数最少是0次; 条件不合适时,for语句也会出现死循环。for(i=0;i<0;i++) for(i=0;i<=0;i++) for(i=0;i<10;i++) for(i=1;i<=10;i++) for(i=1;i<10;i--) //循环次数为0 //循环执行1次//循环执行10次,i取值为0-9 //循环执行10次,i取值为1-10 //死循环例如:66
  • 67. 四. 循环语句—for语句for语句中,循环变量的变化规律由<表达式3>给出,不只是增1或减1运算 B.for语句循环执行次数问题讨论for(i=1;i<=8;i+=2) 例如://循环执行4次,i取值为1、3、5、7 <表达式3>由for语句自动执行,循环体中不需要改变循环变量的值。如果循环体中改变了循环变量的值,则会改变循环的实际执行次数。例如:for(i=1;i<=10;i++) i++//表面循环10次,实际循环5次 67
  • 68. 四. 循环语句—for语句 C.使用for语句需要注意的问题① for语句中,在条件表达式之后没有分号,在语句之后才有分号;②for语句中的<表达式1>和<表达式3>都可以是逗号表达式,并且<表达式1> 还可以声明变量,此处所声明变量的作用域仅限于for语句的循环体。③虽然for语句中的3个表达式在语法上均可以省略,分号不能省略,但这样就体现不出for语句的长处,不是结构化程序设计的好方法,极易产生错误。例如:for(i=1;i<=10;i++); s+=i;例如:for ( int i=1, j=1; i<=10; i++, j++ )例如:for ( ; ; )// 等价于while (true),死循环68
  • 69. 1 使用while语句 int count=1; int sum=0; while(count<=100){ sum+=count; count++; }3 使用do…while语句 int count=1; int sum=0; do{ sum+=count; count++; } while(count<=100);2 使用for语句 int sum=0,count; for(int count=0;count<=100;count++){ sum+=count; }① 找出三种语 句形式中的组成部分? ②比较三种循环语句的差异。将循环初始值count设为101,观察其sum的值。四. 循环语句—总结对比69
  • 70. 循环的嵌套 一个循环体内包含另一个完整的循环结构 嵌套的层次多,多重嵌套 while循环、do-while循环、for循环相互嵌套四. 循环语句—多重循环4. 多重循环 【例2.9】 输出九九乘法表。P46 —— 演示for-for的两重循环结构。 课下练习:70
  • 71. 五.转移语句return语句的语法格式: return [返回值];1.return语句 功能是从当前方法中退出,并返回到调用该方 法的语句处继续执行程序,同时将方法中的运行结 果也带回到调用方法中。 71
  • 72. switch中用到的(已介绍),用来中止一个语句序列。 break可以用来退出一个循环。 带标号的break,跳出标号表示的循环体。五. 转移语句break语句—立即退出当前switch语句或循环语句。2.break语句 72
  • 73. 不带标号的break语句 class Test { public static void main(String args[]) { for (int j = 1; j <6; j++) { if (j ==3)‏ break; System.out.print(“j=“ + j); } System.out.println(“ stop”); } }j=1 j=2 stop五. 转移语句73
  • 74. 用来略过并跳到本次循环体的结尾,结束本次循环,回到循环条件,继续判断是否执行下一次循环。 即如果想循环继续,但是要忽略本次重复剩余的循环体语句时,就应采用continue。五.转移语句3.continue语句continue可以用来退出一次循环过程。 带标号的continue,跳出本次循环,进入标号表示的循环体。74
  • 75. 五.转移语句不带标号的continue语句 class Test { public static void main(String args[]) { for (int k = 6; k >=0; k-=2) { if (k == 4)‏ continue; System.out.print(“k=“ + k + “\t”); } } }k=6 k=2 k=075
  • 76. §2.3 数组◆ 在Java中数组是相同类型的对象的集合,并通过一个名称(就是数组名)来引用这个集合。 ◆可以声明任何类型的数组,无论是Java基本数据类型,还是类。76
  • 77. §2.3 数组◆ 数组是一组同类型的变量或对象的集合 * 数组的类型可以是基本类型,或类和接口 *数组中每个元素的类型相同 *引用数组元素通过数组名[下标] *数组下标(数组的索引)从0开始 ◆数组是一种特殊的对象(Object)‏ * 定义类型 (声明)‏ *创建数组 (分配内存空间) : new * 释放 (Java虚拟机完成)‏ ◆一维数组、多维数组77
  • 78. §2.3 数组一维数组 二.二维数组78
  • 79. §2.3 数组一维数组1. 声明一维数组变量 2. 使用new为数组分配空间 3. 数组长度length 4.数组元素表示及运算 5. 数组声明时赋初值 6. 数组元素的初始化 7. 数组的引用模型 8. 复制数组79
  • 80. 一.一维数组1.声明一维数组变量注意: <数据类型>是数组元素的数据类型; <数据变量>是用户声明的标识符; 方括号[]是必需的括号运算符,不是可选项,一对[]表示一维数组。数据类型[] 数组变量 数据类型 数组变量[]例如:int a[] 或int[] a; //声明数组变量a,[]中没有长度,a没有获得内存空间80
  • 81. 一. 一维数组2.使用new为数组分配空间数组变量 = new 数据类型[长度]注意: <数据类型>是数组元素的数据类型;该数据类型必需与< 数组变量>的数据类型匹配; <长度>是数组申请的存储单元个数;必需为大于0的正整数。例如: a=new int[5]; //数组a获得5个存储单元的内存空间,存储单元的大小由元素的数据类型决定 int a[]=new int[5]; //声明数组变量时,也可以申请存储空间81
  • 82. 一. 一维数组3.数组长度length数组变量.lengthJava语言自动为每个数组变量提供length属性表示数组占用的存储单元个数。4.数组元素表示及运算数组变量[下标]一维数组的一个元素由一个下标唯一确定。 <下标>是确定数组元素位置的表达式,其数据类型是整数类型,取值为0—a.length-1。 数组元素可以参加其数据类型所允许的运算。82
  • 83. 一. 一维数组4.数组元素表示及运算Java将严格检查数组下标范围:程序运行时如果下标i取值超 出范围,则作为错误处理。产生“数组下标越界”异常,程序运行终止。图2.8 一维数组83
  • 84. 一. 一维数组5.数组声明时赋初值例如: int a[]={1,2,3,4,5};数组变量在声明时可以赋初值。6.数组元素的初始化Java对所有使用new运算符动态分配的存储单元都进行初始化工作,变量根据其所属的数据类型获得相应初值。【例2.10】 用一维数组保存Fibonacci序列值。P4984
  • 85. 一. 一维数组7.数组的引用模型Java语言不支持C/C++中的指针类型,所以对数组的操作只能使用下标,不能使用指针。 Java的数组都是动态数组,并且是引用数据类型。引用数据类型与基本数据类型变量: 共同点:都需要声明,都可以赋值; 不同点:存储单元的分配方式不同,两个变量之间的赋值方式 也不同。85
  • 86. 一. 一维数组7.数组的引用模型(1)基本数据类型变量的传值赋值 基本数据类型的变量获得存储单元的方式是静态的,声明了变量就意味着该变量占据了存储单元。 变量保存数据值,两个变量之间赋值,传递的是值。图2.9 基本数据类型变量赋值时传递值86
  • 87. 一. 一维数组7.数组的引用模型(2)数组变量的引用赋值 引用数据类型的变量获得存储单元的方式都是动态的,必须使用new运算符申请并动态获得存储单元。引用变量保存地址、长度、引用计数等特性。 数组是引用数据类型。一个数组变量保存一个数组的引用,即 该数组占用的一块存储空间的首地址、长度及引用计数等特性。 两个数组变量之间的赋值是引用赋值,传递地址等引用特性,没有申请新的存储空间。例如: int a[]={1,2,3,4,5}, b[]; b=a; b[1]=10; 87
  • 88. 一. 一维数组7.数组的引用模型(2)数组变量的引用赋值图2.10 一维数组的引用模型88
  • 89. 一. 一维数组7.数组的引用模型(2)数组变量的引用赋值图2.10 一维数组的引用模型89
  • 90. 一. 一维数组7.数组的引用模型(2)数组变量的引用赋值使用关系运算(==、!=)能够判断两个数组变量是否引用同一个数组。例如: a==b; //结果为true时引用同一个数组 b=new int[4]; //可以再次为数组变量分配存储空间通常程序不需要释放数组,Java将自动收回不再使用的数组占用的存储空间。特殊需要时,可将数组变量赋值为null(引用数据类型空值),释放数组空间。例如: b=null; //对数组变量初始化或释放数组空间90
  • 91. 一. 一维数组8. 复制数组 Java的System类提供复制数组的arraycopy()方法。 public static void arraycopy ( Object src, int srcPos, Object dest, int destPos, int length )arraycopy()方法将src数组从srcPos下标开始的length个元素复制到dest数组从destPos开始的若干个存储单元中。例如: int a[]={1,2,3,4,5}, b[]; arraycopy(a,0,b,1,4); //将a数组的前4个元素复制到b数组91
  • 92. §2.3 数组二.二维数组1. 声明二维数组 2. 二维数组的引用模型 3. 不规则的二维数组92
  • 93. 二.二维数组1.声明二维数组 在声明二维数组变量及申请存储空间时,用括号运算符[][]标明二维。 数组声明后不能被访问,因为未为数组元素分配内存空间。int mat[][]; //声明一个二维数组变量mat mat = new int[2][3]; //申请2×3个存储单元 int mat[][] = new int[2][3]; //声明和申请存储空间可以合起来写 int mat[][] = {{1,2,3},{4,5,6}}; //声明时可以为二维数组赋初值, 将值用多层花括号括起来 二维数组变量[下标][下标]; mat[i][j] //表示第i行第j列的数组元素93
  • 94. 二.二维数组2. 二维数组的引用模型 图2.11 二维数组的引用模型94
  • 95. 二.二维数组2. 二维数组的引用模型 例如: mat.length //返回二维数组的长度,即二维数组的行数 mat[0].length //返回一维数组的长度,即二维数组的列数【例2.11】 幻方。P5295
  • 96. 二.二维数组3. 不规则的二维数组 例如: int mat[][]; mat = new int[2][]; //申请第一维的存储空间 mat[0]=new int[2]; //申请第二维的存储空间 mat[1]=new int[3];由于Java的二维数组采用动态引用模型,二维数组mat中 每个一维数组mat[0]、mat[1]等是分散存储的,因此各一 维数组mat[0]、mat[1]等占用的存储空间可以分多次申 请,且长度可不相同。96
  • 97. 二.二维数组3. 不规则的二维数组 图2.15 多次申请二维数组存储空间97
  • 98. §2.4 静态方法函数:实现特定功能的、可被调用执行并能返回值的程序段。 函数=函数声明+函数体 函数声明:定义函数名、形式参数及返回值。 函数体:由执行操作的语句序列组成。 函数调用必须指定函数名和实际参数,函数执行后返回结果值。Java语言没有全局函数,函数声明在类中,称为成员方法,分静态方法和实例方法两种。98
  • 99. §2.4 静态方法方法声明与调用 二.参数传递 三.方法重载 四.递归方法99
  • 100. 一.方法声明与调用1. 方法声明[修饰符] 返回值类型 方法 ( [参数列表] ) { 语句序列; [return [返回值]]; }<修饰符>:指定方法的访问权限等特性; <参数列表>:声明形式参数的数据类型,参数名是标识符,多个参数之间以逗号分隔;即使没有参数,()也不能省略。 <语句序列>:描述实现该方法所要求功能的操作,最后用return语句给出方法返回值,该值的数据类型必须与方法声明的返回值类型匹配;没有返回值时,该语句可以省略。100
  • 101. 一.方法声明与调用1. 方法声明局部变量:在方法体中声明的变量; 局部变量和形式参数的作用域都是局部的,仅限于声明它的方法之内。 Java不支持类之外的全程变量。 局部作用域,既使得变量不会被非法访问或修改,增加了安全性,又可在不同作用域中声明同名变量,不会互相干扰。 101
  • 102. 一.方法声明与调用2. 方法调用方法([参数列表])方法调用执行方法体,返回结果值,方法返回值可以参加其数据类型所允许的运算。102
  • 103. 一.方法声明与调用3. 声明main方法public static void main(String args[])参数args是一个字符串数组,它接受命令行参数。 main()方法能够调用该类中的其他静态方法,也可通过对象调用实例成员方法。 main()方法只能被Java虚拟机调用执行,不能被其他方法调用。【例2.12】 输出指定范围内的素数。P55103
  • 104. §2.4 静态方法二.参数传递方法调用时给出的参数是实际参数,可以为常量、变量、表达式或方法调用等。 实际参数必须在数据类型、参数个数和次序等三个方面与形式参数一一对应。 形式参数若是基本数据类型,方法调用时则传递值; 若是引用数据类型,方法调用时则传递引用。 同样,方法返回值也因数据类型不同,分别传递值或引用。104
  • 105. §2.4 静态方法二.参数传递【例2.13】 交换两个变量值问题讨论。P56 ——说明基本数据类型和引用类型在作为方法形式参数时的 参数传递原则。 不能实现交换两个变量值的方法 能够交换两个数组元素值105
  • 106. §2.4 静态方法二.参数传递【例2.14】 合并两组数 P57 ——演示数组作为方法的参数和返回值。申请到一个数组,该数组的地址和长度就是确定的,不能更改。 当数据容量不够时,不能就地扩容。解决数据溢出的办法是, 动态申请另一个更大容量的数据并进行数组元素复制。【例2.15】 杨辉三角。P58 ——课下练习106
  • 107. §2.4 静态方法三.方法重载方法的重载:一个类中如果有多个同名方法但带有不同的参数 列表。 重载的参数列表不同:指参数的数据类型或个数或次序不同。 重载方法之间必须以参数列表相区别,不能以返回值相区别。例如:static int abs(int a) static long abs (long a) static float abs (float a) static double abs (double a) 重载的价值:为一个功能提供多种实现形式。107
  • 108. 四.递归方法 1. 递归定义 递归是数学中的一种重要的概念定义方式,即用一个概念本身直接或间接地定义它自己。递归的两个基本要素: 边界条件——至少有一个初始定义是非递归的。 递推通式——由已知函数值逐步递推计算出未知函数值。108
  • 109. 四.递归方法 2. 递归算法递归算法——存在直接或间接调用自身的算法。 递归定义的问题可用递归算法求解,按照递归定义将问题简化,逐步递推,直到获得一个确定值。【例2.16】 求n!的递归方法。P60【例2.17】 求Fibonacci数列第n项的递归方法。P61109
  • 110. 【例2.16】 求n!。 f(n) = n*f(n-1)‏ 5!=5*4*3*2*1=5*4! 0! = 1 或 1! = 1 n! = n*(n-1)!四.递归方法 110
  • 111. §2.5 字符串字符串:字符的有限序列。Java的字符串String是一个类,属于引用数据类型。 String类的特殊之处在于它具有某些基本数据类型的特性。111
  • 112. §2.5 字符串字符串的基本数据类型特性 二.字符串的类特性112
  • 113. 一.字符串的基本数据类型特性1. 字符串常量字符串常量:由双引号括起来表示的字符序列,可包含转 义字符。例如: “hello!”、“汉字\n”、 “”等。字符串只能在同一行内,不能换行。 字符串长度指其中包含的字符个数。 约定字符串中第一个字符的序号为0,-1表示某字符不在指定字符串中。113
  • 114. 一.字符串的基本数据类型特性2. 字符串变量及运算(1) 赋值运算 String str = “abc”; //字符串变量赋值为字符串常量 String str2 = str; //两个字符串变量赋值注意:用单引号括起来的是字符常量,用双引号括起来的是字符 串常量,;两者数据类型不兼容,不能赋值。(2) 连接运算 str = "abc" + "xyz"; //str的值为"abcxyz“ str+=“xyz”; //连接结果为“abcxyzxyz”114
  • 115. 一.字符串的基本数据类型特性2. 字符串变量及运算注意:只有+=能够用于字符串变量,其他复合赋值运算符均不能 用于字符串变量。当字符串与其他类型值进行连接运算时,Java自动将其他类型值转换为字符串。 int i=10; String str=“i=”+i; //连接结果为“i=10” String str=“”+’a’; //连接结果为”a” System.out.println(“max=”+max);115
  • 116. 一.字符串的基本数据类型特性3. 字符串不是字符数组与C/C++不同,Java语言的字符串不是字符数组,不能以字符数组方式通过下标对指定位置的字符进行操作。例如: str[1] =‘a’; //语法错误,没有str[1]表示方式116
  • 117. 二.字符串的类特性String是一个类,具有构造方法、实例方法等。可通过String对象调用String的方法实现获得字符串长度、获得指定位置字符、获得指定位置子串等功能。 调用String类中的方法,可执行Java定义的操作,实现相应功能。字符串变量.方法 ([参数列表])例如: int week=1; String str=“日一二三四五六”; System.out.println(“星期”+str.substring(week,week+1)); //substring(1,2)获得子串“一”117
  • 118. 二.字符串的类特性String的静态方法format()返回指定格式的字符串,格式字符串定义为:%[参数索引$] [宽度] [.精度] 变换类型<变换类型>取值有:b ( boolean)、c (字符)、C (大写字符)、 d (十进制整数)、o (八进制整数)、x (十六进制整数)、 e (浮点数指数形式)、f (浮点数小数形式)、S(字符串字母大写)。例如: String.format(“%4d”,10); //以4位宽度输出十进制整数“10” String.format(“%9.2f”,12.3); //以9位宽度2位小数形式输出浮点数“12.30”118
  • 119. 二.字符串的类特性【例2.18】 判断标识符。P63119