《Java第二章Java程序设计.ppt》由会员分享,可在线阅读,更多相关《Java第二章Java程序设计.ppt(140页珍藏版)》请在装配图网上搜索。

1、第2章 Java基本语法,2.1 Java程序的构成 2.2 数据类型、变量和常量 2.3 运算符和表达式 2.4 流程控制 2.5 数组 习 题,学习目的与要求 深刻理解并熟记Java 的语法规范。 熟练使用各种数据类型的定义、表示和引用。 熟练使用各种控制语句。 熟练使用一维数组,文件命名规则,总则文件名必须与类名一致。 (1)如果文件只有一个类,那么文件名必须与类名完全一致,包括大小写。 (2)一个文件中,只能有一个public类; (3)如果文件中不只一个类,那文件名必须与声明为public的类名保持一致;,(4)如果文件不只一个类,没有声明为public类,则文件名可以与其他类的名字。

2、中的一个保持一致; (5)如果类中有main方法,并声明为public类,main方法必须位于public类中; (6)如果类中有main方法,没有声明为public类,文件名保存为与含有main方法的类名一致。,/*检测类名与文件名的一致性*/ class StudentTest public static void mainString args Student aStudentnew Student; aStudent.setName“张楠”; aStudent.setStudentNum“2010416001”; System.out.println“学生的姓名是”aStudent.g。

3、etName”,学号是”aStudent.getStudentNum; ,class People private String name; public String getName return name; public void setNameString strName namestrName; ,class Student extends People private String studentNum; public String getStudentNum return studentNum; public void setStudentNumString strStudentN。

4、um studentNumstrStudentNum; ,文件名只能保存为StudentTest.java才能运行。 思考在class StudentTest前面加上public后,再保存为People.java或Student.java,编译会出现什么情况。,2.1 Java程序的构成,2.1.1 逻辑构成 Java源程序逻辑构成分为两大部分程序头包的引用和类的定义。 1. 程序头包的引用 主要是指引用JDK软件包自带的包,也可以是自己定义的类。引用之后程序体中就可以自由应用包中的类的方法和属性等。,2. 类的定义 源程序必须有一个主类; 在应用程序中,主类为包含main方法的类; 在App。

5、let中,主类为用户自定义的系统Applet类的扩展类。在Java源程序中,主类的名字同文件名一致。 类的定义又包括类头声明和类体定义。类体中包括属性声明和方法描述。,2.1.2 物理构成 Java源程序物理上由三部分构成,分别为语句、块和空白。 1 语句指一行以分号“;”结束的语句。 2 块指用括号对界定的语句序列,块可以嵌套使用。 3 空白指语句之间、块内部或者块之间的空白行。空白不影响Java源程序的编译和运行,适当地运用空白,可以形成良好的代码风格。,2.1.3 注释语句 行注释为以开始的行; 块注释以/*开始和*/结束 例如,下面的语句就是注释语句用来说明程序文件名称的。 程序文件名。

6、称为WelcomeApplet.java 上述的语句注释可以更改为 /*程序文件名称为WelcomeApplet.java*/ 或 /* 程序文件名称为 WelcomeApplet.java */,2.1.4 标识符、关键字和转义符 在Java语言中,标识符是赋予变量、类和方法等的名称。由编程者自己指定,但需要遵循一定的语法规范 1 标识符由字母、数字、下划线_、美元符号组成,但美元符号用得较少。 2 标识符从一个字母、下划线或美元符号开始。 3 Java语言中,标识符大小写敏感,必须区别对待。 4 标识符没有最大长度的限制,但最好表达特定的意思。 5 标识符定义不能是关键字。,例如_abc 。

7、, ABC ,2A ,A ,For,顺时 Java开发的命名习惯 所有的命名要望文生义,这样才具有良好的可读性 Total,Sum,ShunshiStudent 类名,接口名每个单词的首字母大写,其他字母小写 如类MyFirstJava,Player,Teacher 属性,方法,,局部变量名第一个单词全小写,从第二个单词开始以后每个单词首字母大写,其他字母小写 如方法 getName setDoctorBirthday 常量每个单词所有字母全部大写,单词之间用_来连接 java中使用final修饰 final int MARK_GREED22; 包名所有字母全部小写 如package com.。

8、shunshi.corejava.day01,_abc , ABC ,2A ,A ,For,顺时 关键字又称保留字,是指Java语言中自带的用于标志数据类型名或者程序构造名等的标识符,如public、double等。,关键字对Java技术编译器有特殊的含义,可以被编译器识别执行 abstract do implements private throw boolean double import protected throws break else instanceof public transient byte extends int return true case false inter。

9、face short try catch final long static void char finally native super volatile class float new switch while continue for null synchronized default if package this,Java关键字特点 java关键字与c很多相似,只要与c一样的,它的含义都与c中的相同 有些关键字c有,而java没有 sizeof求出某种类型的变量的占内存的大小 为什么c有sizeof 因为不同机器内存占用空间大小不一样 16,32,64位,取决于操作系统平台。 为什么。

10、Java不需要 因为有JVM。 java中的关键字都是小写的 true、false和null为小写,而不是象在C语言中那样为大写。严格地讲,它们不是关键字。,有些关键字java没有取消保留下来,但它自己也不用它也不给程序员用 goto和const不是Java编程语言中使用的关键字,而是保留字。 什么是保留字 为什么保留下来但不能用 在java中final替代const goto在c代表无条件跳转,功能很好,但不能经常用,要谨慎。 很多建议去掉goto关键字,没有理解goto真正含义。 为什么c到现在都没有删除掉goto它有一个特殊使命 Java中使用break代替goto 跳出一层循环 bre。

11、ak 跳出多层循环break out out是一个标号,可以跳到out标识处 break避免滥用goto,把goto功能削弱了,只能跳到外层循环 java中加入新的关键字enum assert enum枚举 assert断言,表2.1 转 义 符转义符是指一些有特殊含义的、很难用一般方式表达的字符,如回车、换行等。所有的转义符以反斜线开头,后面跟着一个字符来表示某个特定的转义符,如表2.1所示。,2.2 数据类型、变量和常量,2.2.1 数据类型 Java编程语言定义了八种基本的数据类型见表2.2,共分为四类整数类byte、short、int、long、文本类char、浮点类double、fl。

12、oat和逻辑类boolean。,表2.2 Java的数据类型,1. 整数类 1 采用三种进制十进制、八进制和十六进制。 2 十进制值是2; 077 首位的0表示这是一个八进制的数值; 0 xBAAC 首位的0 x表示这是一个十六进制的数值。 2 具有缺省int。 3 用字母“L”和“l”定义long。 4 所有Java编程语言中的整数类型都是带符号的数字。,2. 文本类 1 代表一个16 bit Unicode字符。 2 必须包含用单引号 引用的文字。 3 使用下列符号 a一个字符。 t一个制表符。 u 一个特殊的Unicode字符,应严格使用四个十六进制数进行替换。,3. 浮点类 默认为do。

13、uble类型,如果一个数字包括小数点或指数部分,或者在数字后带有字母F或ffloat、D或ddouble,则该数字为浮点数。,4. 逻辑类 boolean数据类型有两种值true和false。 例如boolean flag true; 上述语句声明变量flag为boolean 类型,它被赋予的值为true。,数据类型转换分为自动类型转换和强制类型转换 自动类型转换 整型、浮点型、字符型数据可以混合运算。在执行运算时,不同类的数据先转化为同一类型,然后进行运算。转换从低级到高级的顺序为 Short或byte int longfloat double char 强制类型转换 高级数据要转换成低级。

14、数据需用强制类型转换,格式为 (数据类型)数据或(数据类型)(表达式) 注逻辑类数据不能和其它类型的数据转换。,强制类型转换只要不能自动转换的,则只能是强制转换 整型数据之间的强转改变数据的符号;改变数值 int a0 x2aff; byte bbytea; b为-1 强制转换的原理从最低位开始取到目标类型长度为止 整型之间的强转是保留二进制低位,去掉高位,需要考虑在内存中如何存储 实型强转整型是保留整数,去掉小数,不考虑实型在内存中的如何存储 bytebyte会自动提升为int byte a11,a22;byte a3a1a2;精度丢失 不进行类型提升 byte c3; cc3; c3;Sy。

15、stem.out.printlnc; 默认整型为int,int,long提升为float有精度丢失 float fa37; System.out.printlnfa; int iaintfa; System.out.printlnia;,2.2.2 变量与常量 常量是指整个运行过程中不再发生变化的量 变量是指程序的运行过程中发生变化的量,通常用来存储中间结果,或者输出临时值。 变量的声明也指变量的创建。执行变量声明语句时,系统根据变量的数据类型在内存中开辟相应的存储空间并赋予初始值。变量有一个作用范围,超出它声明语句所在的块就无效。,Java的常量 Java中的常量分为整数型常量、浮点型常量、。

16、布尔型常量、字符型常量和字符串常量 常量的定义格式为 final 常量类型 常量名1常量值,常量名2常量值2. final是定义常量的关键字。 Java中的常量值区分为不同的类型,类型可以是Java中任何合法的数据类型,Java的变量 Java变量定义的格式 类型名 变量名1,变量名2,; 或类型名 变量名1初值,变量名2初值,; 变量按作用域分类 局部变量在方法或方法的代码块中声明,作用域从该变量的定义位置起到它所在的代码块结束。 方法参数形式参数传递给方法的参数,作用域是这个方法。 异常处理参数传递给异常处理代码,作用域是异常处理部分。 注意 局部变量必须先赋值再使用 局部变量的作用域是从。

17、定义它开始到定义它的代码块结束 在同一重合范围内不允许有2个同名局部变量出现, 类(成员)变量在类定义中声明,作用域是整个类。 在一个确定的域中,变量名应是唯一的。通常,一个域用大括号来划定,下面看一个使用各种类型变量声明并改变的示例。程序中pi为常量,s1、i1、l1、ch1、f1、d1、b1为全局变量,可以在方法change中发生改变,然后在方法main中输出。而s2、i2、l2、ch2、f2、d2、b2是方法main的局部变量,它们的作用范围只局限于方法main中。 【例2.2】测试不同数据类型的变量,程序输出如图2.2所示。源程序代码如下 程序文件名称为SetVariable.java。

18、 public class SetVariable 全局变量,static double pi 3.141592654;数学常量static short s1; static int i1; static long l1; static char ch1; static float f1; static double d1; static boolean b1; public static void mainString args ,局部变量 short s2 35; int i2 -32; long l2 34555L; char ch2 A; float f2 897.89F;。

19、 double d2 34.345; boolean b2 false; 输出常量 System.out.println数学常量pi pi; 输出局部变量,System.out.println局部变量; System.out.println短整型变量s2 s2; System.out.println整型变量i2 i2; System.out.println长整型变量l2 l2; System.out.println字符变量ch2 ch2; System.out.println浮点数类型f2 f2; System.out.println双精度型变量d2 d2; S。

20、ystem.out.println布尔型变量b2 b2; 调用方法修改全局变量的值,change; 输出全局变量的值 System.out.println全局变量; System.out.println短整型变量s1 s1; System.out.println整型变量i1 i1; System.out.println长整型变量l1 l1; System.out.println字符变量ch1 ch1; System.out.println浮点数类型f1 f1; System.out.println双精度型变量d1 d1; System.out.println布尔型变。

21、量b1 b1; ,方法修改全局变量的值 public static void change s1 125; i1 88; l1 987654321L; ch1 B; f1 3.2590F; d1 -1.04E-5; b1 true; ,图2.2 变量输出结果2.3 运算符和表达式,Java常用的运算符分为五类算术运算符、赋值运算符、关系运算符、布尔逻辑运算符、位运算符。 表达式是由常量、变量、对象、方法调用和操作符组成的式子。表达式必须符合一定的规范,才可被系统理解、编译和运行。表达式的值就是对表达式自身运算后得到的结果。 根据运算符的不同,表达式相应地分为以下几类算术表达式。

22、、关系表达式、逻辑表达式、赋值表达式,这些都属于数值表达式。,2.3.1 算术运算符及算术表达式 Java中常用的算术运算符如下 加运算符 -减运算符 *乘运算符 /除运算符 取模运算除运算的余数 增量运算符 减量运算符,【例2.3】测试运算符及表达式,程序输出如图2.3所示。源程序代码如下 程序文件名称为NumberOper.java public class NumberOper public static void mainString args 变量初始化 int a 30; int b 20; 定义结果变量 int r1,r2,r3,r4,r5,r6,r7,r8,r9; 计算结果。

23、 r1 a b;,r2 a-b; r3 a * b; r4 a / b; r5 a b; r6 a ; r7 b; r8 a; r9 b; 输出结果 System.out.printlna a b b; a,b的值 System.out.printlnab r1; System.out.printlna-b r2;,System.out.printlna*b r3; System.out.printlna/b r4; System.out.printlnab r5; System.out.printlna r6; System.out.p。

24、rintlnb r7; System.out.printlna r8; System.out.printlnb r9; ,图2.3 程序输出结果,2.3.2 关系运算符 关系运算符用于比较两个数据之间的大小关系,关系运算表达式返回布尔值,即“真”或“假”。Java中的常用关系运算符如下 等于 不等于 大于 大于等于 小于等于,【例2.4】编写程序,测试关系运算符及其表达式,程序输出如图2.4所示。源程序代码如下,程序文件名称为TestRelation.java public class TestRelation public static void mainString arg。

25、s 变量初始化 int a 30; int b 20; 定义结果变量 boolean r1,r2,r3,r4,r5,r6; 计算结果,r1 a b; r2 a b; r3 a b; r4 a b; r6 a b r3; System.out.printlnab r5; System.out.printlnab r6; ,图2.4 程序输出结果,2.3.3 布尔逻辑运算符,表2.3 布尔运算符及规则,例如 Boolean a false; Boolean b true; a boolean b true; 定义结果变量 boolean r1,r2,r3,r4,。

26、r5,r6; 计算结果,r1 a; r2 a ,图2.5 程序输出结果,2.3.4 位运算符 Java中的常用位运算符如下 位求反 int b 2; 定义结果变量 int r1,r2;,计算结果 r1 a b; r2 a b r1; System.out.printlnab r2; ,图2.6 程序输出结果,2.3.5 赋值运算符 赋值运算符分为简单运算符和复杂运算符。简单运算符指“”,而复杂运算符是指算术运算符、逻辑运算符、位运算符中的双目运算符后面再加上“”。表2.4列出Java常用的赋值运算符及其等价表达式。,表2.4 赋值运算符及其等价表达式,2.3.6 其它操作符及。

27、其表达式 三目运算符相当于条件判断,表达式xyz用于判断x是否为真,如果为真,表达式的值为y,否则表达式的值为z。 例如 int x 5; int a x353; 则a的值为5。如果x 2,则a的值为3。,对象运算符instanceof用来判断一个对象是否属于某个指定的类或其子类的实例,如果是,返回真true,否则返回假false。 例如 boolean b userObject instanceof Applet 用来判断userObject类是否是Applet类的实例。,2.3.7 优先级,表2.5 运算符优先级2.4 流 程 控 制,流程控制分为三种基本结构顺序结构、分支结构和循。

28、环结构。 分支结构包括单分支语句if-else语句和多分支语句switch语句; 循环结构包括次数循环语句for语句和条件循环语句while语句。,2.4.1 分支语句 分支语句分为两类单分支语句和多选语句。 1. if-else语句 if-else语句的基本格式为 if布尔表达式 语句或块1; else 语句或块2; ,【例2.7】测试if-else语句,如果x10,则输出x的值,并提示结果正确,否则输出x 10,提示结果不正确。程序输出结果如图2.7所示。源程序代码如下 程序文件名称为TestIf.java public class TestIf 声明全局变量x static int x;。

29、 public static void mainString args x 12; ifx10 ,System.out.printlnx x 结果正确; else System.out.printlnx 10 结果不正确; change; System.out.println修改x的值之后; ifx10 System.out.printlnx x 结果正确; else System.out.printlnx 10 结果不正确; ,change方法修改x的值 public static void change x 5; ,图2.7 程序输出结果,2. switch语句 s。

30、witch语句的基本格式为 switch表达式1 case 表达式2 语句或块2; break; case表达式3 语句或块3; break; case 表达式4 语句或块4; break; default 语句或块5; break; ,其中 1 表达式1的值必须与整型兼容。 2 case分支要执行的程序语句。 3 表达式2、3、4是可能出现的值。 4 不同的case分支对应着不同的语句或块序列。 5 break表示跳出这一分支。,【例2.8】测试switch语句,当x1、2、3时,分别打印1、2、3,x不为这三个值时,打印x的值。程序输出结果如图2.8所示。源程序代码如下 程序文件名称为Te。

31、stSwitch.java public class TestSwitch public static void mainString args 声明变量x int x; x 12;,System.out.printlnx12时打印的值; choosex; x 3; System.out.printlnx3时打印的值; choosex; choose方法switch语句结构 public static void chooseint x switchx ,case 1 System.out.println1; break; case 2 System.out.println2; break;。

32、 case 3 System.out.println3; break; default System.out.printlnx; ,图2.8 程序输出结果,2.4.2 for循环语句 for循环语句实现已知次数的循环,其基本格式为 for初始化表达式;测试表达式;步长 语句或块; ,其执行顺序如下 1 首先运行初始化表达式。 2 然后计算测试表达式,如果表达式为true,执行语句或块;如果表达式为false,退出for循环。 3 最后执行步长。,【例2.9】用for循环统计1100包括100之间数的总和。程序输出结果如图2.9所示。源程序代码如下 程序文件名称为TestFor.java pub。

33、lic class TestFor public static void mainString args int sum 0; forint i 1; i100; i sum i; System.out.println1到100包括100的数的总和为 sum; ,图2.9 程序输出结果,2.4.3 while循环语句 while循环语句实现受条件控制的循环,其基本格式为 while布尔表达式 语句或块; 当布尔表达式为true时,执行语句或块,否则跳出while循环。,上面for循环语句的例子改为while语句后如下所示 int sum 0; int i 1; while i100。

34、 sum i; i; System.out.println1到100包括100的数的总和为 sum;,2.4.4 do语句 do语句实现受条件控制的循环,其基本格式为 do 语句或块; while布尔表达式,先执行语句或块,然后再判断布尔表达式。与while语句不同,当布尔表达式一次都不为true时,while语句一开始判断就跳出循环,不执行语句或块,而在do语句中则要执行一次。上面那个例子改为do循环为 int sum 0; int i 1; do sum i; i; while i100; System.out.println1到100包括100的数的总和为 sum;3种循环结。

35、构如何选择,要考虑几个因素 首先分析业务问题是否是用循环来实现 分析业务问题判断我们是否已经预先知道循环次数 如果预先知道循环次数用for循环 如果预先不知道次数用while循环 若至少要执行一次循环用dowhile循环 3种不同的循环结构其实可以相互转化,按照上面的规则来选择可以简化编程,跳转语句 Break label在switch语句中,break语句用来跳过分支中的其它语句 ;在循环语句中,break用来跳出当前的循环语句 Continue labelcontinue语句只用于循环结构,用来结束本次循环,即跳过循环体中位于continue语句后面的尚未执的语句 Return 表达式re。

36、turn语句用于从当前方法中退出 Label是指标号,只起到对语句标识的作用2.5 数组,数组 数组array是相同类型变量的集合。 数组变量是引用类型的变量,声明数组变量并不分配内存空间。 声明一个数组实质是要确定数组名、数组的维数和数组元素的数据类型 。,2.5.1 一维数组,一、一维数组定义 语法格式有两种 数组元素类型 数组名; 或 数组元素类型 数组名 如int intSno或int intSno intSno为数组名是符合Java标识符定义规则的用户标识符。 Int表示数组元素的数据类型为整型 方括号数组的标志Java语言中声明数组时不能指定其长度。 int array6; ,二、。

37、初始化 可以通过直接指定初值的方式来完成,也可以用new操作符来完成。 1直接指定初值的方式 例 int a123,-9,38,8,65;,数组a1的初始化,2用关键字new初始化数组 用关键字new初始化数组,只为数组分配存储空间而不对数组元素赋初值。用关键字new来初始化数组有两种方式 1 先声明数组,再初始化数组。格式如下 类型标识符 数组名 ; 数组名new 类型标识符数组长度; 其中,第一条语句是数组的声明语句,第二条语句是初始化语句。,int a ; anew int9;,2 在声明数组的同时用new关键字初始化数组。格式如下 类型标识符 数组名 new 类型标识符数组长度; 或 。

38、类型标识符 数组名new 类型标识符数组长度; 例如 int anew int10;,新创建的数组对象,其元素根据类型被设置为默认的初始值。 数值类型为0 字符类型为u0000 布尔类型为false 引用类型为null,每个数组都有一个属性length获取它的长度,例如a.length 指明数组a的长度元素个数;,三、数组元素引用 数组名数组下标 其中数组下标的取值从0开始,下标值可以是整数型常量或整数型变量表达式。 对intSno数组来说下面两条赋值语句是合法的 intSno432; intSno3286; 但intSno612;是错误的。,增强的for循环JDK 1.5,JDK 1.5引入。

39、一个新的for循环,可以不用下标就可以依次访问数组元素。语法 forelementType value arrayRefVar 例如 forint i 0; i myList.length; i sum myListi; fordouble value myList sum value; ,【示例程序c6_1.java】 数组的声明、初始化和其长度的测定。 public class c6_1 public static void mainString arg int i; double a1 ; 放在变量后面声明 char a2; 放在变量前面声明 a1new double8;为。

40、a1分配8个double型元素的存储空间64字节 a2new char8; 为a2分配8个char型元素的存储空间16字节,int a3 new int8;在声明数组时初始化数组, 为a3分配32字节 byte a4new byte8; 在声明数组时初始化数组,为a4分配8字节 char a5 A,B,C,D,E,F,H,I;直接指定初值方式 下面各句测定各数组的长度,以下各句引用数组中的每一个元素,为各元素赋值 fori0;i8;i a1i100.0i; a3ii; a2ichari97;将整型转换为字符型 System.out.printlna1.lengtha1.length; Syst。

41、em.out.printlna2.lengtha2.length; System.out.printlna3.lengtha3.length; System.out.printlna4.lengtha4.length; System.out.printlna5.lengtha5.length;,下面各句打印各数组元素 System.out.printlnta1ta2ta3ta4ta5; System.out.printlntdoubletchartinttbytetchar; fori0;i8;i System.out.printlnta1ita2it a3ita4ita5i; ,该程序的运行。

42、结果如下 a1.length8 a2.length8 a3.length8 a4.length8 a5.length8,a1 a2 a3 a4 a5 double char int byte char 100.0 a 0 0 A 101.0 b 1 0 B 102.0 c 2 0 C 103.0 d 3 0 D 104.0 e 4 0 E 105.0 f 5 0 F 106.0 g 6 0 H 107.0 h 7 0 I,数组下标的灵活使用 【示例程序c6_2.java】 用数组求解Fibonacci数列的前20项,即使用数组下标表达式求解数学上的迭代问题。,public class c6_2。

43、 public static void mainString args int i; int f new int20;创建数组f,使其可存储20个整型数据 f01;f11; fori2;i20;i fifi-2fi-1;数组元素的下标使用循环变量 fori0;i20;i ifi50System.out.printlnn; System.out.printtfi; ,运行结果是 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,【示例程序c6_3.java】 设数组中的数值是由小到大存放的,编写二分查找程序。 i。

44、mport java.io.*; class FindSearch int binarySearchint arr ,int searchValue int low0; low是第一个数组元素的下标 int higharr.length-1; high是最后一个数组元素的下标 int midlowhigh/2; mid是中间那个数组元素的下标 whilelowhigh 要找的数可能在数组的后半部分中,else highmid-1; 要找的数可能在数组的前半部分中 midlowhigh/2; iflowhigh mid-1; return mid; mid是数组元素下标,若为-1则表示不存在要查。

45、的元素 public class c6_3 public static void mainString argsthrows IOException, BufferedReader keyinnew BufferedReadernew StreamReaderSystem.in; int i,k,search,mid; String c1; int arr 2,4,7,18,25,34,56,68,89; System.out.println打印原始数据; fori0;iarr.length;i System.out.print arri; System.out.printlnn; Syste。

46、m.out.println请输入要查找的整数; c1keyin.readLine ;,searchInteger.parseIntc1; FindSearch p1new FindSearch ; midp1.binarySearcharr,search; ifmid-1 System.out.println没找到; else System.out.println所查整数在数组中的位置下标是mid; ,运行结果 打印原始数据 2 4 7 18 25 34 56 68 89 请输入要查找的整数 68 所查整数在数组中的位置下标是7,四、复制数组,直接使用赋值语句不能实现数组的复制,结果是两个数组。

47、引用变量指向同一个数组对象。 复制数组的方法 使用循环来复制每个元素 使用System.arraycopy方法 使用数组的clone方法,可以把一个数组变量拷贝给另一个,这时两个变量引用同一个数组,如 int aa1,2,3,4,5; int bbaa;,aa,bb,Java.lang.System类的arraycopy方法提供了数组元素复制功能 int source1,2,3; int dest 5,6,7,8,9; 复制源数组中从下标0开始的source.length个元素到 目的数组,从下标0的位置开始存储。 System.arraycopysource, 0, dest, 0, sou。

48、rce.length;System.arraycopysource, 0, dest, 0, source.length;,source,dest,source,dest,五、向方法传递数组,可以将数组变量作为实参传递给方法。 基本数据类型传递的是实际值的拷贝,修改形参,不影响实参。 数组引用变量中传递的是对象的引用,修改形参,将改变实参引用的数组对象。 也可以从方法中返回数组。,日常生活中处理的许多数据,从逻辑上看是由若干行、若干列组成的。例如,矩阵、行列式、二维表格等。图6.8给出了一个简单的矩阵。为适应存放这样一类数据,人们设计出了一种如图6.9所示的数据结构二维数组。,2.5.2 二 。

49、维 数 组,矩阵,二维数组,一、声明 二维数组的声明与一维数组类似,只是需要给出两对方括号,其格式如下 类型说明符 数组名 ; 或 类型说明符 数组名;,例如声明数组名为arr的二维整型数组 int arr ; 或 int arr; 其中类型说明符可以是Java的基本类型和引用类型;数组名是用户遵循标识符命名规则给出的一个标识符;两个方括号中,前面的方括号表示行,后面的方括号表示列。,二、初始化 1用new操作符初始化数组 用new操作符来初始化数组有两种方式,1 先声明数组再初始化数组。 数组名new 类型说明符数组长度 ; 或 数组名new 类型说明符数组长度 数组长度; 其中对数组名、类。

50、型说明符和数组长度的要求与一维数组一致。,例如 int arra ; 声明二维数组 arranew int34;初始化二维数组 上述两条语句声明并创建了一个3行4列的数组arra。也就是说arra数组有3个元素,而每一个元素又都是长度为4的一维数组。实际上共有12个元素,共占用12*448个字节的连续存储空间。这里的语句 arranew int34;,实际上相当于下述4条语句 arranew int3 ;创建一个有3个元素的数组,且每个元素也是一个数组。 arra0new int4;创建arra0元素的数组,它有4个元素。 arra1new int4;创建arra1元素的数组,它有4个元素。 。

51、arra2new int4;创建arra2元素的数组,它有4个元素。 也等价于 arranew int3 forint i0;i3;i arrainew int4;,也就是说,在初始化二维数组时也可以只指定数组的行数而不给出数组的列数,每一行的长度由二维数组引用时决定。但不能只指定列数而不指定行数。 上述语句的作用如图6.11所示。,语句“arranew int34;”的作用,2 在声明数组时初始化数组。格式如下 类型说明符 数组名new 类型说明符数组长度 ; 或 类型说明符 数组名 new 类型说明符数组长度 数组长度; 例如 int arrnew int4 ; int arr new i。

52、nt43; 但是,不指定行数而指定列数是错误的。例如,下面的初始 化是错误的。 int arrnew int 4;,2直接指定初值的方式 在数组声明时对数据元素赋初值就是用指定的初值对数组初始化。例如 int arr13, -9,6,8,0,1,11,9,8 ; 此语句声明并初始化数组arr1,它有3个元素,每个元素又都是有3个元素的一维数组。 用指定初值的方式对数组初始化时,各子数组元素的个数可以不同。例如 int arr13, -9,8,0,1,10,11,9,8;,它等价于 int arr1new int3 ; int ar103,-9; int ar118,0,1; int ar121。

53、0,11,9,8;测定数组的长度及数组赋值 与一维数组一样,也可以用.length成员方法测定二维数组的长度,即元素的个数。只不过当使用“数组名.length”的形式测定的是数组的行数;而使用“数组名i.length”的形式测定的是该行的列数。例如,若有如下的初始化语句 int arr13, -9,8,0,1,10,11,9,8 ; 则arr1.length的返回值是3,表示数组arr1有3行或3个元素。而arr12.length的返回值是4,表示arr12的长度为4,即有4个元素。,【示例程序c6_11.java】 在程序中测定数组的长度。 public class c6_11 public。

54、 static void mainString arg int i,j; int len1 new int2; int len2 new int2; int a11,4,8,9,3,2,2; int a2 90,3,9,12; int a1lena1.length; 将a1数组的长度赋给a1len int a2lena2.length; 将a2数组的长度赋给a2len,System.out.printlna1.lengtha1.length; fori0;i2;i len1ia1i.length; 将a1数组的子数组的长度赋给len1i System.out.printlna1 .lengt。

55、hlen1i; fori0;i2;i forj0;jlen1i;j System.out.print a1ij; System.out.printlnn; ,System.out.printlna2.lengtha2.length; 赋a2数组的子数组的长度 fori0;i2;i len2ia2i.length; System.out.printlna2 .lengthlen2i; 打印a2数组的值 fori0;i2;i forj0;jlen2i;j System.out.print a2ij; System.out.printlnn; ,a2a1;将a1数组赋给a2 System.out.p。

56、rintlna1.lengtha1.length; 赋a1数组的子数组的长度 fori0;i2;i len1ia1i.length; System.out.printlna1 .lengthlen1i; 打印a1数组的值 fori0;i2;i forj0;jlen1i;j System.out.print a1ij; System.out.printlnn; ,System.out.printlna2.lengtha2.length; 赋a2数组的子数组的长度 fori0;i2;i len2ia2i.length; System.out.printlna2 .lengthlen2i; 打印a2。

57、数组的值 fori0;i2;i forj0;jlen2i;j System.out.print a2ij; System.out.printlnn; System.out.printlnn; ,该程序的运行结果是,数组名作为成员方法的参数 与一维数组类似,二维数组的数组名也可以作为参数传递给成员方法。下面通过两个例题说明这个问题。 【示例程序c6_12.java】 编程实现在矩阵用二维数组表示中找最大数。 class Maxvalue int maxvlint arr1 int i,k,max; int lenarr1.length,len1;,maxarr100; fori0;imax m。

58、axarr1ik; return max; public class c6_12 ,public static void mainString args int maxx; int arr 1,3,7,6,78,0,42,5,-98,7,10,-1; Maxvalue p1new Maxvalue ; maxxp1.maxvlarr; System.out.printlnmaxmaxx; 运行结果 max78,【示例程序c6_13.java】 两个矩阵相加。 class AddClass void addint arA ,int arB ,int arC int i,k,len1; int 。

59、lenarA.length; fori0;ilen;i len1arAi.length; fork0;klen1;k arCikarAikarBik; ,public class c6_13 public static void mainString args int i,k; int arA 1,3,7,6,78,0,42,5,-98,7,10,-1; int arB 1,3,7,6,78,0,42,5,-98,7,10,-1; int arC new int34; int lenarA.length,len1; AddClass p1new AddClass ; p1.addarA,arB。

60、,arC; System.out.printlntAttBttC; fori0;ilen;i, len1arAi.length; fork0;klen1;k System.out.print arAik;打印第i行A矩阵 System.out.printt; fork0;klen1;k System.out.print arBik;打印第i行B矩阵 System.out.printt; fork0;klen1;k System.out.print arCik;打印第i行C矩阵 System.out.printlnn; ,运行结果 A B C 1 3 7 6 1 3 7 6 2 6 14 12 78 0 42 5 78 0 42 5 156 0 84 10 -98 7 10 -1 -98 7 10 -1 -196 14 20 -2,。