Java核心技术卷感悟:第三章 Java 的程序设计结构

本章主要介绍程序设计的基本概念(如数据类型、分支以 及循环)在 Java 中的实现方式。


一个简单的 Java 应用程序


public class FirstSample {


​ public static void main(String[] args) {


​ System.out.println("We will not use 'Hello, World!"');


​ }


}


1. 首先,Java 区分大小写。 如果出现了大小写拼写错误(例如, 将 main 拼写成 Main), 程序将无法运行


2. 关键字 public 称为访问修饰符(access modifier), 这 些修饰符用于控制程序的其他部分对这段代码的访问级別

3. 关键字 class 表明 Java 程序中的全部内容都包含在类中,Java 应用程序中的全部内容都必须放置在类中

4. 关键字 class 后面紧跟类名。 Java 中定义类名的名字必须以字母开头,后面可以跟字母和数字的任意组合,但是不能使用 Java 保留字

5. 标准的类命名规范为(FirstSample)大驼峰:类名是以大写字母开头的名 词,如果名字由多个单词组成,每个单词的第一个字母都应该大写

6. 源代码的文件名必须与公共类的名字相同,并用 .java 作为扩展名

7. 在编译这段源代 码之后就会得到一个包含这个类字节码的文件,Java 编译器将字节码文件自动地命名为 FirstSample. class, 并与源文件存储在同一个目录下

8. 每个 Java 应用程序都 必须有一个 main 方法

9. 在 Java 中,每个句子必须用分号结束。 特别需要说明,回车不是语句的结束标志

10. 在这里,使用了 System.out 对象并调用了它的 println 方法。注意, 点号( • )用于调用 方法


注 释:


Java 中的注释不会出现在可执行程序中。因此, 可以在 源程序中根据需要添加任意多的注释,而不必担心可执行代码会膨胀。在 Java 中,有 3 种标 记注释的方式。


1. 最常用的方式是使用 //,其注释内容从 // 开始到本行结尾。

2. 当需要长篇的注释时, 既可以在每行的注释前面标记 //,也可以使用 /* 和 */ 将一段比较 长的注释括起来。

3. 第 3 种注释可以用来自动地生成文档。这种注释以 / ** 开始, 以 */ 结束


在 Java 中,/* **/ 注释不能嵌套 „ 也就是说, 不能简单地把代码用 /* *和 */ 括起来 作为注释, 因为这段代码本身可能也包含一个 */


数 据 类 型:


Java 是 -种强类型语言。这就意味着必须为每一个变量声明一种类型。在 Java 中, -共有 8 种基本类型( primitive type ), 其中有 4 种整型、2 种浮点类型、 1 种用于表字符类型 char 和 1 种用于表示真值的 boolean 类型。


1. 整型

1. byte型,1字节,

2. short型,2字节

3. int型,4字节

4. long型,8字节,长整型数值有一个后缀 L 或 1 ( 如 4000000000L。)


​ 注意, Java 没有任何无符号(unsigned) 形式的 int、 long、short 或 byte 类型。


2. 浮点类型


1. float类型,4字节,float 类型的数值有一个后缀 F 或 f (例如,3.14F)

2. double类型,8字节,没有后缀 F 的浮点数值(如 3.14 ) 默 认为 double 类型。


下面是用于表示溢出和出错情况 的三个特殊的浮点数值:


•正无穷大 ,常量 Double_POSITIVE_INFINITY


•负无穷大,Double.NEGATIVEJNFINITY


•NaN (不是一个数字),Double.NaN,特别要说明的是, 不能这样检测一个特定值是否等于 Double.NaN:

if (x = Double.NaN) // is never true 所有“ 非数值” 的值都认为是不相同的,然而,可以使用 Double.isNaN 方法:


​ if (Double.isNaN(x)) // check whether x is "not a number"


注意: 浮点数值不适用于无法接受舍入误差的金融计算中。 例如,命令 System.out.println ( 2.0-1.1 ) 将打印出 0.8999999999999999, 而不是人们想象的 0.9。这种舍入误差的主要 原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示分数 1/10。


3. char 类型


char 类型原本用于表示单个字符,如今,有些 Unicode 字符可以用一个 char值描述,另外一些 Unicode 字符则需要两个 char 值。char 类型的字面量值要用单引号括起来。例如:‘A’ 是编码值为 65 所对应的字符常量。它与 "A" 不同,"A" 是包含一个字符 A 的字符串。


char 类型的值可以表示为十六进制值,其 范围从 \u0000 到 \Uffff。例如:\u03C0 表示希腊字母 π。除了转义序列 \u 之外, 还有一些用于表示特殊字符的转义序列,\b 退格,\n 换行(\u00A0),\t 制表(对应\u0009)。更隐秘地, 一定要当心注释中的 \u。注释 // \u00A0 is a newline。会产生一个语法错误, 因为读程序时 \u00A0 会替换为一个换行符。


4. boolean 类型


boolean (布尔)类型有两个值:false 和 true, 用来判定逻辑条件 整型值和布尔值之间 不能进行相互转换


变 量:


1. 在 Java 中,每个变量都有一个类型( type)。在声明变量时,变量的类型位于变量名之 前。

double salary;


2. 尽管 $ 是一个合法的 Java 字符, 但不要在你自己的代码中使用这个字符。它只用 在 Java 编译器或其他工具生成的名字中。


3. 声明一个变量之后,必须用赋值语句对变量进行显式初始化, 千万不要使用未初始化的 变量。要想对一个已经声明过的变量进行赋值, 就需要将变量名放在等号(=) 左侧, 相应取值 的 Java 表达式放在等号的右侧。

int vacationDays;

vacationDays=12;


4. 在 Java 中, 变量的声明尽可能地靠近变量第一次使用的地方, 这是一种良好的程序编写 风格


5. 在 Java 中, 利用关键字 final 指示常量。final double CM_PER_INCH = 2.54;关键字 final 表示这个变量只能被赋值一次。一旦被赋值之后,就不能够再更改了。习惯上, 常量名使用全大写。


运 算 符:


在 Java 中,使用算术运算符 + 、-、 * 、/ 表示加、减、 乘、除运算。


1. 当参与 / 运算的两个 操作数都是整数时, 表示整数除法;否则, 表示浮点除法。

2. 整数的求余操作(有时称为取模) 用 % 表示。例如,15/2 等于 7 ,15%2 等于 1 , 15.0/2 等于 7.50


3. 在 Math类中,包含了各种各样的数学函数。println 方法和 sqrt 方法存在微小的差异。println 方法处理 System.out 对象。但是, Math 类中的 sqrt 方法处理的不是对象,这样的方法被称为静态方法。Java 还提供了两个用于表示 TC 和 e 常量的近似值Math.PI Math.E


4. 自动类型转换:

byte ——short——int——long ——float——double

char——int——long——float——double


5. 强制类型转换:


在必要的时候, int 类型的值将会自动地转换为 double 类型。但另 一方面,有时也需要将 double 转换成 int。 在 Java 中, 允许进行这种数值之间的类型转换。 当然, 有可能会丢失一些信息。在这种情况下,需要通过强制类型转换( cast) 实现这个操 作。double x = 9.997;

int nx = (int) x;

这样, 变量 nx 的值为 9。强制类型转换通过截断小数部分将浮点值转换为整型。


6. 如果想对浮点数进行舍人运算, 以便得到最接近的整数(在很多情况下, 这种操作更有 用,) 那就需要使用 Math_ round 方法double x z 9.997;

int nx = (int) Math.round(x);

现在, 变量 nx 的值为 10。 当调用 round 的时候, 仍然需要使用强制类型转换( int) 其原因 是 round 方法返回的结果为 long 类型


7. X += 4; 等价于: x = x + 4;

如果 X 是一个 int, 则以下语句 x += 3.5; 是合法的, 将把 X 设置为(int)(x + 3.5)。


8. n++ 将变量 n 的当前值加 1, n-- 则将 n 的值减 1

上面介绍的是运算符放在操作数后面的“ 后缀” 形式。 还有一种“ 前缀” 形式:++n。后缀和前缀形式都会使变量值加 1 或减 1。但用在表达式中时, 二者就有区别了。前缀形式会先完成加 1; 而后缀形式会使用变量原来的值。


9. && 和丨| 运算符是按照“ 短路” 方 式来求值的: 如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。

& 和丨运算符也会得到一个布尔值。这些运算符与 && 和丨丨运 算符很类似,不过 & 和丨运算符不采用“ 短路” 方式来求值, 也就是说,得到计算结果之前两个操作数都需要计算。


10. Java 支持三元操作符?:,这个操作符有时很有用。如果条件为 true, 下面的 表达式 condition ? expressioni : expression


11. 自定义枚举类型。枚举类型包括有限个命名的值,enum Size { SMALL, MEDIUM, LARGE, EXTRA.LARCE };现在,可以声明这种类型的变量: Size s = Size.MEDIUM


字 符 串:


1. Java 没有内置的字符串类型, 而是在标准 Java 类库中提供了 一个预定义类,很自然地叫做 String。每个用双引号括起来的字符串都是 String类的一个实 例


2. String 类的 substring 方法可以从一个较大的字符串提取出一个子串。

String greeting = "Hello";

String s = greeting.substring(0, 3);创建了一个由字符“ Hel” 组成的字符串。


3. Java语言允许使用 + 号连接(拼接)两个字符串。当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串


4. String 类没有提供用于修改字符串的方法,由于不能修改 Java 字符串中的字符, 所以在 Java 文档中将 String 类对象称为不可变字 符串, 如同数字 3 永远是数字 3 —样。不可变字符串却有一个优点:编译器可以让字符串共享。总而言之,Java 的设计者认为共享带来的高效率远远胜过于提取、 拼接字符串所带来的 低效率。


5. 可以使用 equals 方法检测两个字符串是否相等,要想检测两个字符串是否相等,而不区分大小写, 可以使用 equalsIgnoreCase 方法。一定不要使用==运算符检测两个字符串是否相等! 这个运算符只能够确定两个字串 是否放置在同一个位置上。

当然, 如果字符串放置在同一个位置上, 它们必然相等。但是, 完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上

String greeting = "Hello"; //initialize greeting to a string

if (greeting == "Hello") . // probably true

if (greeting.substring(0, 3) == "HeV") . . . // probably false


6. 空串 "" 是长度为 0 的字符串。空串是一个 Java 对象, 有自己的串长度( 0 ) 和内容(空)。不过, String 变量还可以存 放一个特殊的值, 名为 null, 这表示目前没有任何对象与该变量关联


7. 调用 s.charAt(n) 将返回位置 n 的代码单元,n 介于 0 ~ s.length()-l 之间。


输入输出:


1. 打印输出到“ 标准输出流”(即控制台窗口)是一件非常容易的事情,只要 调用 System.out.println 即可。然而,读取“ 标准输人流” System.in 就没有那么简单了。要想通 过控制台进行输人,首先需要构造一个 Scanner 对象,并与“ 标准输人流” System.in 关联。Scanner in = new Scanner(System.in);


2. 现在,就可以使用 Scanner 类的各种方法实现输入操作了。String name = in.nextLine();

要想读取一个整数, 就调用 nextlnt 方法。要想读取下一个浮点数, 就调用 nextDouble 方法


3. 可以使用 SyStem.0ut.print(x) 将数值 x 输出到控制台上。这条命令将以 x 对应的数据类型 所允许的最大非 0 数字位数打印输出 X。在 printf中,可以使用多个参数, 例如:

System.out.printf("Hello, %s. Next year, you'll be SSd", name, age)


4. 每一个以 % 字符开始的格式说明符都用相应的参数替换。 格式说明符尾部的转换符将指示被 格式化的数值类型:f 表示浮点数,s 表示字符串,d 表示十进制整数。


5. 可以使用静态的 String.format 方法创建一个格式化的字符串, 而不打印输出:

String message = String.format("Hello, %s. Next year, you'll be %d", name , age);


6. 要想对文件进行读取,就需要一个用 File 对象构造一个 Scanner 对象

Scanner in = new Scanner(Paths.get("niyflle.txt"), "UTF-8")


控 制 流 程:


与任何程序设计语言一样, Java 使用条件语句和循环结构确定控制流程


1. 块(即复合语句)是指由一对大括号括起来的若干条简单的 Java 语句。块确定了变量的作 用域。一个块可以嵌套在另一个块中。


2. 在 Java 中,条件语句的格式为if (condition) statement。这里的条件必须用括号括起来。


3. 当条件为 true 时,while 循环执行一条语句(也可以是一个语句块)。一般格式为

while { condition ) statement

如果开始循环条件的值就为 false, 则 while 循环体一次也不执行 。


4. 如果希望 循环体至少执行一次, 则应该将检测条件放在最后。 使用 do/while 循环语句可以实现这种操 作方式。它的语法格式为: do statement while { condition);


5. for 循环语句是支持迭代的一种通用结构, 利用每次迭代之后更新的计数器或类似的变量 来控制迭代次数。

for (int i = 1; i <= 10; i++)

System.out.println(i);

特别指出,如果在 for 语句内部定义一个变量, 这个变量就不能在循环体之外使用。


6. 在处理多个选项时, 使用 if/else 结构显得有些笨拙。 Java 有一个与 C/C++ 完全一样的 switch 语句。switch语句将从与选项值相匹配的 case 标签处开始执行直到遇到 break 语句,或者执行到 switch i吾句的结束处为止。如果没有相匹配的 case 标签, 而有 default 子句, 就执行这个子句。

有可能触发多个 case 分支。 如果在 case 分支语句的末尾没有 break 语句, 那么就 会接着执行下一个 case 分支语句。这种情况相当危险, 常常会引发错误。


7. Java 还提供了一种带标签的 break语句,用于跳出多重嵌套的循环语句。可以将标签应用到任何语句中, 甚至可以应用到 if语句或者块语句中

最后,还有一个 continue 语句。与 break 语句一样, 它将中断正常的控制流程。continue 语句将控制转移到最内层循环的首部。


大 数 值:


如果基本的整数和浮点数精度不能够满足需求, 那么可以使用java.math 包中的两个 很有用的类:Biglnteger 和 BigDecimal,这两个类可以处理包含任意长度数字序列的数值。 Biglnteger 类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。


使用静态的 valueOf方法可以将普通的数值转换为大数值: Biglnteger a = Biglnteger.valueOf(100);


遗憾的是,不能使用人们熟悉的算术运算符(如:+ 和 *) 处理大数值。 而需要使用大数 值类中的 add 和 multiply 方法


数 组:


数组是一种数据结构, 用来存储同一类型值的集合。通过一个整型下标可以访问数组中 的每一个值。例如, 如果 a 是一个整型数组, a[i] 就是数组中下标为 i 的整数。


1. 在声明数组变量时, 需要指出数组类型 ( 数据元素类型紧跟 []) 和数组变量的名字。下 面声明了整型数组 a:

int[] a;

不过, 这条语句只声明了变量 a, 并没有将 a 初始化为一个真正的数组。应该使用 new 运算 符创建数组

int[] a = new int[100];


2. 创建一个数字数组时, 所有元素都初始化为 0。boolean 数组的元素会初始化为 false。 对 象数组的元素则初始化为一个特殊值 null, 这表示这些元素(还)未存放任何对象。


3. 要想获得数组中的元素个数,可以使用 array.length。一旦创建了数组, 就不能再改变它的大小(尽管可以改变每一个数组元素)。如果经常需 要在运行过程中扩展数组的大小, 就应该使用另一种数据结构—数组列表


4. Java 有一种功能很强的循环结构, 可以用来依次处理数组中的每个元素(其他类型的元 素集合亦可)而不必为指定下标值而分心。这种增强的 for 循环的语句格式为:

for (variable : collection) statement

定义一个变量用于暂存集合中的每一个元素, 并执行相应的语句(当然,也可以是语句块)。 collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象(例如 ArrayList)。

for each 循环语句显得更加简洁、 更不易出错,不必为下标的起始值和终止值而操心。


5. 有个更加简单的方式打印数组中的所有值, 即利用 Arrays 类的 toString 方法。 调 用 Arrays.toString(a), 返回一个包含数组元素的字符串,这些元素被放置在括号内, 并 用逗号分隔, 例如,“ [2,3,5,7,11,13] ”


6. 在 Java中, 提供了一种创建数组对象并同时赋予初始值的简化书写形式

int[] small Primes = { 2, 3, 5, 7, 11, 13 };

这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的 个数


7. 在 Java 中,允许将一个数组变量拷贝给 另一个数组变量。这时, 两个变量将引用同 一个数组。如果希望将 一个数组的所有值拷贝到一个新的数组中去, 就要使用 Arrays 类的 copyOf方法


8. 每一个 Java 应用程序都有一个带 String arg[],参数的 main 方法。这个参数表明 main 方法将接收一个字符串数组, 也就是命令行参数

public static void main(String[] args)

如果使用下面这种形式运行这个程序: java Message -g cruel world


9. 要想对数值型数组进行排序, 可以使用 Arrays 类中的 sort 方法

int[] a = new int[10000];

Arrays.sort(a)这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较 高的


10. 多维数组将使用多个下标访问数组元素, 它适用于表示表格或更加复杂的排列形式。Java 实际上没有多维数组,只有一维 数组。多维数组被解释为“ 数组的数组。”

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP