1、程序设计结构,第三章,一个简单的Java应用程序,public class FirstSample public static void main(String args)System.out.println(“We will not use Hello, World“);,注释,与大多数程序设计语言一样,Java中的注释也不会出现在可执行程序中。因此,可以在源程序中添加任意多的注释。在Java中,有三种表示注释的方式。最常用的方式是使用单行注释/,其注释内容从/开始到本行结尾。System.out.println(“We will not use Hello, World“); /这里添加注
2、释内容当需要比较长的注释时,可以在每行的注释前面标记/,也可以使用多行注释/*和*/将一段比较长的注释括起来。 /* 这里添加 注释内容 */第三种注释可以用来自动地生成文档,即文档注释。这种注释以/*开始,以*/结束。,数据类型,Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型,其中有4个整型、2个浮点类型、1个用于表示 Unicode编码的字符单元的字符类型char和1个用于表示真值的boolean类型。,整型,整型用于表示没有小数部分的数值,它允许是负数。Java提供了4种类型,具体内容加下表所示:,浮点型,浮点型用于表示有小数部分的数值
3、。在Java中有两种浮点类型,具体内容如下表所示double表示的数值精度是float类型的两倍,有人称之为双精度。float类型的数值有一个后缀F(例如,3.402F)。没有后缀F的浮点数值(如3.402)默认为double类型。当然,也可以在浮点数值后面添加后缀D(例如,3.402D)。注:F和D,不区分大小写,f和d也可以。,char类型,char类型是使用单引号括起来的一个字符,如a、B、&等等,可以是英文、数字、特殊字符等等的unicode字符集中的字符。另外还有一种特殊形式的字符常量-转义字符,转义字符以“”开头,下面是常用的转义字符表:,boolean类型,boolean(布尔)
4、类型有两个值:false和true,用来判定逻辑条件。,小知识:在C+中,数值可以代替boolean值,如0相当于false, 非0相当于true。但是在Java中则不行。,变量,数据类型 变量名 = 数值;,数据类型 变量名; 变量名 = 数值;,int money = 1000;,int money; money = 1000 ;,1、字母 2、下划线_ 3、$ 符号,首字母,任意多的: 1、数字 2、字母 3、下划线_ 4、$ 符号,其余部分,变 量 名,Java语言中,变量命名要符合一定规则,变量命名规范: 简短且能清楚地表明变量的作用,通常第一个单词的首字母小写,其后单词的 首字母大
5、写。例如:myScore,变量命名规则,变量命名规则续,检查下面这些是否是合法的变量名,principal,cost_price,marks_3,$lastname,city,123rate,discount%,zip code,City,int,初始化变量,声明一个变量之后,必须利用赋值语句对变量进行显式初始化,千万不要使用一个未被初始化的变量,Java编译器会报错,如下面代码: int count; System.out.println(count); 这会引发一个编译错误:The variable count may not have been initialized(变量count未被
6、初始化)。 要想对一个已经声明过的变量进行赋值,就需要将变量名放在等号“=”的左侧,变量的值放在等号的右侧,如: int count; count=1; 当然,也可以将变量的声明与赋值放在同一行中,如上面的代码可以简化成: int count = 1;,小结1,使用变量存储以下MP3信息,并打印输出 品牌(brand):爱国者F928 重量(weight):12.4 电池类型(type):内置锂电池 价格(price):499,定义变量有哪两种方式?,常量,在Java中,利用关键字final声明常量,如:final double PI = 3.141592653589793; 关键字final
7、表示这个变量只能被赋值一次。一量被赋值之后,就不能够再更改了。,小知识: 习惯上,常量名使用大写。,运算符,在Java中,使用算术运算符+、-、*、/表加加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用%表示。例如,15/2等于7,15%2等于1。,注意: 整数被0除会产生一个异常,而浮点数被0除则会得到无穷大或NaN。 二元运算符:+=、-=、*=、/=,如: x+=4等价于x=x+4,自增运算符与自减运算符,+运算符,又分为前自增与后自增,前自增是先加1然后再参与运算,而后自增是先参与运算再加1,看下面的例子: in
8、t n=12; int m=n+;这里m的结果是多少?那么: int n=12; int m=+n;的结果呢? -运算符,和自增运算符一样,同样分别前自减和后自减,接着看下面的例子: int n=12; int m=n-; 与 int n=12; int m=-n;的结果分别是多少呢?,关系运算符与boolean运算符,= 比较是否相等 != 比较是否不相等大于 = 大于等于 & 逻辑与 | 逻辑或 ! 逻辑非,关系运算符与boolean运算符(续),& 与 | 是按照“短路”方式求值的,即如果第一个操作数已经能够确定结果了,第二个操作数就不必计算了。比如:expression1 & expr
9、ession2如果expression1为false,那么结果不可能为真,因而第二个表达式也就没有必要计算了。 与之类似,对于expression1 | expression2如果第一个表达式为true,整个结果为true,因而不必再计算第二个表达式了。 三元运算符 ? :,位运算符,& 按位与 | 按位或 按位异或 按位非 右移,1、根据天数(46)计算周数和剩余的天数,2、已知圆的半径radius= 1.5,求其面积,小结2,数学函数与常量,在Math类中,包含了各种各样的数学函数。如:Math.sqrt:求平方根 三角函数: Math.sin Math.cos Math.tan 两个常量
10、:Math.PI和Math.E,数值类型之间的转换,在程序运行时,经常需要将一种数值类型转换为另一种数值类型,下面给出了数值类型之间的合法转换:,强制类型转换,前面提到的数据类型转换是自动的(因此称为自动类型转换),但在有些时候需要强制的进行数据类型转换。它的语法格式是:在圆括号中结出想要转换的目标类型,随后紧跟待转换的变量名。 如: double x = 9.997; int nx = (int)x; 这样,变量nx的值为9。强制类型转换将通过截断小数部分来把一个浮点值转换为整形。 如果想对浮点数进行舍入运算,得到最接近的整数,就需要使用Math.round方法。,强制类型转换(续),dou
11、ble x = 9.997; int nx = (int) Math.round(x); 现在,变量nx的值为10.注意这里仍然进行了强制类型转换,原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显示的强制类型转换才能够将long类型转换成int类型。,括号与运算符级别,运算符优先级,枚举类型,有些时候,变更的取值仅在一个有限的集合内,例如:销售的服装或比萨饼只有小、中、大和超大这四种尺寸。从JDK 5.0开始,我们可以自定义枚举类型。自定义枚举类型包括有限个命名的值。如: enum SizeSMALL, MEDIUM,LARGE,EXTRA_LARGE;
12、现在,可以声明这样一种类型的变量: Size s = Size.MEDIUM; Size类型的变量只能存储该类型声明中给定的某个枚举值。或者NULL值。 有关枚举类型的详细内容我们会有单独的章节详细介绍。,字符串,Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类String。每个用双引号括起来的字符串都是String类的一个实例,如: String s = “; /空字符串 String greeting = “Hello“;,子串,String类的substring方法可以从一个较大的字符串提取出一个子串,例如: String greeting = “Hello“;
13、String s = greeting.substring(0,3); /结果为“Hel“,字符串编辑,String类没有提供用于修改现存字符串的方法。如果希望将greeting的内容修改为“Help!“,不能直接地将greeting的最后的两个位置的字符修改为p和!,那么如果来实现呢?在Java中实现这项操盘相当容易,首先提取需要的子串,然后再拼接上需要替换的字符串。 greeting = greeting.substring(0,3)+“p!“; 上面这条语句将greeting当前值修改为“Help!“。,拼接,Java允许使用+号连接(拼接)两个字符串,如: String s1 = “a
14、bc“; String s2 = “def“; String s3 = s1+s2; s3结果是:“abcdef“。 当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串,例如: int n= 13; String m = “2“+n; 结果是:“213“。,检测字符串是否相等,Java使用equals方法比较两个字符串是否相等,而非使用“=”,例如:“Hello“.equals(greeting); 要想比较两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法,如:“Hello“.equalsIgnoreCase(“hello“);,StringBuff
15、er,StringBuffer:String增强版 StringBuffer声明StringBuffer的使用,StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer(“aaa“);,创建空字符串,创建一个变量存储字符串aaa,sb.toString(); /转化为String类型,sb.append(“*“); /追加字符串,联机API帮助,关于更多的帮助信息,可以查看JDK的API帮助文档。,大数值,如果基本的整数和浮点数精度不能满足需求,就可以使用java.math包中的两个很有用的类:BigInt
16、eger和BigDecimal。这两个类可以处理任意长度的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。 使用静态的valueOf方法可以把普通的数值转换为大数值:BigInteger a = BigInteger.valueOf(100); 可惜的是,不能使用人们熟悉的算术运算符(如+、-、*、/、%)处理大数值。而需要使用大数值类的add、subtract、multiply、divide、mod方法,如:BigInteger c = a.add(b); / c = a + bBigInteger d = c.multiply(b.ad
17、d(BigInteger.valueOf(2); / d = c * (b + 2),数组,数组是一种数据结构,用来存储同一类型的集合,通过一个整型下标可以访问数组中的每一个值。例如,如果a是一个整型数组,那么ai是数组中下标为i的整数。 在声明数组变量时,需要指出数组类型和数组的名字。下面声明了整型数组a:int a; 这条语句只声明了变量a,并没有把a初始化为一个真正的数组,应该使用new关键字来创建数组。int a = new int100; 这条语句创建了一个可以存储100个整数的数组。 注意,这个数组的下标从099,而不是从1100。一旦创建了数组,就可以给数组元素赋值,例如,使用一
18、个循环: int a = new int100; for (int i = 0; i 100; i+)ai = i; / fills the array with 0 to 99,注意: 如果创建了一个100个元素的数组,并且试图访问元素a100(或任何在099之外的下标),程序就会引发 “array index out of bounds“异常而终止运行。 要想获得数组中的元素个数,可以使用array.length,例如: for (int i = 0; i a.length; i+)System.out.println(ai); 一旦创建了数组,就不能再改变它的大小,如果经常需要在运行过程
19、中扩展数组的大小,就应该使用另一个数据结构-数组列表。(以后会详细介绍),小知识: 可以使用下面两种形式中任何一种声明数组 int a; 或 int a;,数组初始化器以及匿名数组,在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式,如:int smallPrimes = 2, 3, 5, 7, 11, 13 ; 注意,在使用这种语句时,不需要调用new。 甚至还可以初始化一个匿名数组:new int 17, 19, 23, 29, 31, 37 这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数,使用这种语法形式可以在不创建新变量的情况下重新
20、初始化一个数组,例如:smallPrimes = new int 17, 19, 23, 29, 31, 37 ; 它是下列语句的简写形式:int anonymous = 17, 19, 23, 29, 31, 37 ;smallPrimes = anonymous;,注意: 在Java中,允许数组的长度为0: new elementType0 数组长度为0,与null不同。,数组拷贝,在Java中,允许将一个数组变量拷贝给另一个数组变量,这时,两个变量将引用同一个数组:int luckyNumbers = smallPrimes;luckyNumbers5 = 12; / now small
21、Primes5 is also 12 下图显示了拷贝的结果:,数组拷贝(续),如果希望将一个数组的所有值拷贝到另一个数组中去,就要使用System类的arraycopy方法,它的语法格式为:System.arraycopy(from, fromIndex, to, toIndex, count); 数组to必须有足够的空间来存放拷贝的元素。 例如,下面这段语句:int smallPrimes = 2, 3, 5, 7, 11, 13;int luckyNumbers = 1001, 1002, 1003, 1004, 1005, 1006, 1007;System.arraycopy(smal
22、lPrimes, 2, luckyNumbers, 3, 4);for (int i = 0; i luckyNumbers.length; i+)System.out.println(i + “: “ + luckyNumbersi);,数组拷贝(续),所得到的结果如下图所示:,数组排序,要想对数值型数组进行排序,可以使用Arrays类中的sort方法: int a = new int10000; . . . Arrays.sort(a) 这个方法使用了优化的快速排序算法,先看一个例子:执行结果:,import java.util.Arrays; public class ArraySort
23、Test public static void main(String args) int a = 7,8,5,3,9,2,6,4;for(int output: a)System.out.print(output);System.out.println(“n-“);Arrays.sort(a);for(int output: a)System.out.print(output); ,多维数组,多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式,我们这里只研究二维数组,更多维的数组留给感兴趣的人自己研究。 先来看一个二维数组的例子:int a = 1,2,3,4,5,6,
24、7,8,9;它可以看作是以数组为元素的数组。 二维数组有哪些应用,举个最常见的例子:某公司有m个工厂(这个是第一维); 每个工厂有n个仓库(这个是第二维); 那么要确定这个公司的工厂与仓库的关系,就可以使用二维数组了,形式如下:int factory = new intmn;,二维数组的初始化,静态初始化int a = 1,2,3,4,5,6;/合法int a32 = 1,2,3,4,5,6;/不合法 动态初始化int a = new int32; int a = new int3;a0 = new int2;a1 = new int3;,命令行参数,前面已经看到了多次使用Java数组的例子,
25、每一个Java应用程序都有一个带String args参数的main方法,这个参数表明main方法将接收一个字符串数组,也就是命令行参数。例如:,public class Message public static void main(String args) if (args0.equals(“-h“)System.out.print(“Hello,“);else if (args0.equals(“-g“)System.out.print(“Goodbye,“);/ print the other command-line argumentsfor (int i = 1; i args.l
26、ength; i+)System.out.print(“ “ + argsi);System.out.println(“!“); ,小结3,模仿命令行参数提示功能。 完输入任何一组整,将该组整进行排序。,练习,填空: Java中有_种表示注释的方式,分别是_。 数组的各元素具有相同的_和_。 用于引用数组中某一特定元素的序号称为数组的_。 按顺序排列一个数组元素的过程称为数组的_。 确定下列计算完成之后每个变量的值,假设每条语句开始执行时各变量的值都为整数5.product *= x+;product /= +x;,练习,写出给变量x加1的4种Java语句。 写出完成下列功能的Java语句:
27、x和y相加,将结果赋给z,然后再将x的值加1。 将变量x减1,然后再从变量total中减去该值。 计算q除以divisor的余数,并将结果赋给q。使用两种方法写出该语句。 写出一条Java语句,完成下列功能: 将变量sum和x声明为int类型。 将1赋给变量x。 将0赋给变量sum。 将变量x和sum相加,并将结果赋给变量sum。 打印“The sum is: ”和变量sum的值。,练习,判断下列问题是否正确,如果不正确,请解释原因: 数组能够存储不同类型的值; 数组下标通常是float类型的; 如果将单个的数组元素传递给一个方法,并在方法中将其修改,则在被调用方法执行完之后,该元素的值将改为
28、修改后的值。 假设有一个数组fractions(分数),编写语句完成下列问题: 定义一个常量变量arraySize并将其初始化为10; 声明一个有arraySize个元素的float类型数组; 引用数组第4个元素; 将值1.667赋给数组元素9; 用一个for循环结构求出所有数组元素的和,定义整数变量i作为循环的控制变量。,拓展练习,1.定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。 2.定义一个int型的一维数组,包含10个元素,分别赋值为110, 然后将数组中的元素都向前移一个位置,即,a0=a1,a1=a2,最
29、后一个元素的值是原来第一个元素的值,然后输出这个数组。 3. 定义一个int型的一维数组,包含40个元素,用来存储每个学员的成绩,循环产生40个0100之间的随机整数,将它们存储到一维数组中,然后统计成绩低于平均分的学员的人数,并输出出来。 4.(选做)承上题,将这40个成绩按照从高到低的顺序输出出来。 5.(选做)编写程序,将一个数组中的元素倒排过来。例如原数组为1,2,3,4,5;则倒排后数组中的值为5,4,3,2,1。 6. 要求定义一个int型数组a,包含100个元素,保存100个随机数。再定义一个int型数组b,包含10个元素。统计a数组中的元素对10求余等于0的个数,保存到b0中;对10求余等于1的个数,保存到b1中,依此类推。,Thank You,