本文总结源自《Java语言程序设计》原书第五版,作者为Y.daniel Liang,习题及编程练习均参照此书。
主要内容
本章对Java中的各种数据类型进行了介绍,并给出了互相转换的方法;本章介绍了Java的语法规则,编写规则和编程错误。
命名标识符的规则
- 必须以字母、下划线(_)或美元符号($)开头,不能用数字开头。
- 不能是java中的关键字。
- Java区分大小写,标识符大小写有区别。
java标识符选取应该“见名知意”,命名通常采用“驼峰命名法”。
常量和变量
- 变量是用来表示特定类型的数据。变量在使用前应该用“=”进行赋值,以减少编程错误。
- 常量使用
final
关键字定义表示常量的值一旦生成就不会改变。
数值数据类型及其运算
- 整数除法的结果是整数,5/2结果是2。整型数可以精确存储而浮点数不能。
- 默认情况下,整型直接量是十进制数。如果要写八进制数,用
0
开头,要写十六进制数,用0x
或者0X
开头。 - double型的值比float型更精确。
- 简捷运算符
+=
,-=
,*=
,/=
,%=
- 加一和减一(假设i=1)
- a=i++; //执行完本条语句后,a=1,i=2
- a=++i; //执行完本条语句后,a=2,i=2
- a=i–; //执行完本条语句后,a=1,i=0
- a=–i; //执行完本条语句后,a=0,i=0
数值类型转换
- 拓宽类型:将一个小范围类型的变量转换为大范围类型的变量;
缩窄类型:将一个大范围类型的变量转换为小范围类型的变量。
拓宽类型不需要明确指出,可以自动执行,缩窄类型必须明确指出。 - 缩窄类型会导致不精确的结果。而且必须得进行显性转换,否则会出现编译错误。
字符数据类型及其运算
- 字符型直接量用单引号扩住:’A’
字符串类型直接量用双引号扩住:”A”
字符型直接量只能是单个字符,字符串直接量可以有多个字符。 - 特殊字符的转义: 使用
\*
,其中,\t
是制表符,\b
是退格键,\n
是指换行 - 字符型数据与数值型数据之间的转换
- 整数转为char型:只使用整数的低16位,其余忽略。
- 浮点数转为char型:先将浮点数转为int型,再转为char型数据。
- char型转换为数值型:字符的Unicode码被转换成指定的数值类型。
如果转换结果在目标变量的范围内,可以使用隐式转换(自动转换)。例如: byte b=’0’。在十六进制表示的0到FFFF之间的任何一个正整数,都可以自动转换成char型数据。 - 当计算
a+b
时。如果b是一个数字或字符,a将会被转换成Unicode数值。如果b是个字符串,a将会以字符串参与运算。
布尔数据类型及其运算
- 比较运算符:
==
,!=
,<=
,>=
,<
,>
- 逻辑运算符:
!
,&&
,||
,^
- 条件和无条件逻辑运算符(布尔运算符,)
&&
,||
称为条件
运算符或捷径
运算符:假设p1&&p2
中p1为false,则无需计算p2的真值。&
,|
称为无条件
运算符或无捷径
运算符:假设p1&p2
中p1为false,但还是需要计算p2的真值。
- 布尔类型不能转换为其他类型。
运算符的优先级和结合方向
- 赋值运算符是右结合的,双目运算符是左结合的。
- 双目运算符左边运算对象的计算先于右边运算对象任何一部分的计算。
- 如果运算对象没有修改变量值的副作用,运算对象的运算顺序是无关紧要的。
- 运算对象的计算顺序的优先级高于运算符的优先级规则。
格式化输出
- 格式化输出:
System.out.printf(format,items);
程序错误
语法错误(syntax error)
:没有遵循语言的规则,它们可以由编译器检查发现。属于编译错误。运行错误(runtime error)
:在程序运行过程中,如果环境发现了一个不可能执行的操作,就会出现运行错误。逻辑错误(logic error)
:如果程序没有按照预期的方案执行,就会发生逻辑错误。
编程风格
- 适当的注释和注释类型
- 块的对齐方式
- 此行风格
- 行尾风格
调试(debug)
略。
复习小结
闰年的计算方式
- 一个年号如果能被4整除但不能被100整除,或者能被400整除,则它是闰年。
((year%4==0)&&(year%100!=0))||(year%400==0)
时间的计算
使用System类中的currentTimeMillis()方法得到Unix时间戳。使用如下步骤可以计算出当前时间的时、分、秒。
1234567long totalMilliseconds = System.currentTimeMillis();long totalSeconds = totalMilliseconds / 1000;int seconds = (int) (totalSeconds % 60);long totalMinutes = totalSeconds / 60;int minutes = (int) (totalMinutes % 60);long totalHours = totalMinutes / 60;int hours = (int) (totalHours % 24);java currentTimeMillis()和nanoTime()方法辨析
currentTimeMillis()和nanoTime都属于java.lang这个包中,其中:- currentTimeMillis() 返回的是当前时间(0区时间)与
1970
年1
月1
日0
时 相差的时间,返回值是long类型,以毫秒计数。可用于计算当前时间。 - nanoTime()返回的是一个随机的纳秒数,与系统当前时间无关,仅用于测量某一个时间段中所用的时间。
- currentTimeMillis() 返回的是当前时间(0区时间)与
从控制台获取输入:
- 使用Scanner类:
Scanner sc = new Scanner(System.in);
- 使用args数组获得输入
java *.class args[0] args[1]
直接量
直接量并非是运算的结果,也不是I/O操作的结果,而是直接写在代码里的数据。
需要注意的几点
- int类型转换byte类型可以得到结果,但结果不精确,仅取相应字节的数据。
- double转换float类型会得到infinity错误,原因是浮点数存储方式不同。
- Java在运算时会自动的提升变量的精度来进行运算。double比float精度高,所以可以自动的从float转化至double再进行运算。
编程练习
习题2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.11程序源代码见我的Github: chapter2