Java基本数据类型和注释
Java是一种强类型语言,必须为每一个变量声明一种类型。在Java中一共有8种基本数据类型,其中有4种整型,2种浮点型,1种字符类型(用于表示Unicode编码的代码单元),1种用于表示真值的boolean类型。
强类型语言:要求变量的使用严格符合定义,必须先定义后使用。一个变量如果被指定为某个数据类型,如果没有进行强制类型转换,他就永远是该类型了。
整型
整型用于表示没有小数部分的数值,允许是负数。Java提供了四种整型:
类型 | 存储需求 | 取值范围 |
int (默认) | 4字节 | -2 147 483 648~2 147 483 647 |
short | 2字节 | -32 768~32 767 |
long | 8字节 | -9 223 372 036 854 775 808~9 223 372 036 854 775 807 |
byte | 1 | -128~127 |
取值范围可以这样理解(以int举例):一个字节表示8位,因此4个字节有32位,一位可以表示2个字符,32位可以表示个数字,正数,负数,0平均,然后正数是负数的绝对值减1即可。
在通常情况下,int类型最为常用,但是表示某些很大的数比如首富的钱数就要用长整型long。byte, short适合于特定场合,比如底层文件的处理或者存储空间很宝贵的大数组。如果有的数特别大甚至超过long的取值范围,我们也可以用科学计数法表示,但变量要声明为double,如下表示
double num = 2E+10
长整型数值后缀有一个l 或者L,定义时应该按照如下格式定义:
long num = 1000L; //后边的L不能省略
但是在实际使用时,我们会发现有时候即便不加L或者l,编译时依然会通过,输出也正常,如下:
long num = 1000; //对num打印输出的结果是1000;
上边已经指出,不声明时默认整型是int型,这里之所以没有报错是因为存在了自动类型转换,使int自动转换为long型,但是出现以下这种情况使,编译器就会报错:
这是因为100 000 000 000 000 000已经超出了int类型的取值范围,因此就不会自动进行类型转换,从下图可以看出,当在数值后边加上L表明这是长整型时,编译通过。
十六进制有一个前缀0X或者0x,如(0xCAFE)表示的就是一个十六进制数。
八进制有一个前缀0,例如010对应8进制的8,但是这种表示很容易混淆,因此最好不要使用8进制常数。
从Java 7.0开始,加上前缀0B或者0b,就可以写二进制数,例如0b1001就表示十进制数9。同样这个版本,可以位数字字面加下划线,如用1_000_000(或0B1111_0100_0010_0100_0000)表示100万,这些下划线只是为了让人易读,编译时会自动去除这些下划线。
浮点类型
浮点数用于表示有小数部分的数值,在Java种有两种浮点型:
类型 | 存储需求 | 取值范围 |
float | 4字节 | 大约(有效位数6~7位) |
double(默认) | 8字节 | 大约(有效位数15位) |
double表示这种类型数值的精度时float的两倍,也成为双精度。float类型的数值后有一个F或者f,定义格式如下:
float num = 2.1f; //后边的f不可以省略
如果没有f的浮点数值总是默认是double型,与long不同的是,如果缺少f,不论数值是否在float型的范围内,都会报错,因为double类型不能自动向float型转化。
下面是用于表示溢出和出错情况的三个特殊浮点值:
正无穷大:一个正数除以0的值,用常数Double.POISITIVE_INFINITY
表示。
负无穷大:一个负数除以0的值,用常数Double.NEGATIVE_INFINITY
表示。
NaN:计算0/0或者负数的平方根的结果,用常数Double.NaN
注意:Double.
表示对于类的调用,后续会指出这种调用方式。所有的“非数值的值”比如NaN,虽然看上去一样,但是都是不同的,可以用Double.isNaN
方法判断是否是非数值的值。此外,直接运行0/0之类的运算会抛出ArithmeticException,表示算术异常。
浮点值不适用于无法接受舍入误差的金融计算。例如:
System.out.println(2.0-1.1) //结果:0.8999999999999999
输出结果并非是我们认知的0.9,这种误差主要来源于浮点数值来源于二进制系统表示,而二进制系统无法准确表示分数,如果计算要求不允许有任何误差,就应该使用BigDecimal类。
字符类型
char类型原本用来表示单个字符,不过现在有的Unicode字符需要两个char值。
char类型字面量值要用单引号括起来。例如’A’是编码值为65的常量。与’A’不同的是,"A"表示的是一个字符A的值。我们目前可以这样理解,字符代表了一个常量,可以进行数值计算,并且结果可以根据类型可以转换为字符型或者整型,如下:
int i = 'A'-1; //对i打印输出的结果是64,输出的为字符型
char i = 'A'-1; //对i打印输出的结果是@,输出的为整型
char类型的值可以表示十六进制的值,范围从\u0000~\uFFFF,其中\u表示后边跟的数是十六进制数。
下边给出常见的转义序列:
转义序列 | 名称 | Unicode值 |
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\" | 双引号 | \u0022 |
\’ | 单引号 | \u0027 |
\\ | 反斜杠 | \u005c |
这些转义序列都可以用于加引号的字符或者字符串中,例如"Hello,World\n"
,\u也可以用在字符串或者字符之外,例如public static void main(String\u005B\u005D args)
也是正确的。其中\u005B和\u005D分别是[ 和 ]的编码。
**需要注意的是,Unicode转义序列会在代码解析前就进行处理。例如System.out,println("\u0022+\u0022")
**打印的结果是一个空串,因为\u0022表示一个",那么运行时可以理解""+""
,两个空串进行连接,结果还是空串。
boolean类型
boolean类型有两个值:false(默认值)和true,用来判定逻辑条件,与C++不同的是,整型值和布尔值不能相互转化,数值不能代替布尔值。
注释
在Java语言中有3种标记注释的方式,并且注释不会出现在可执行程序中。因此如果必要可以添加无限多的注释,而不需要担心代码膨胀。
- 最常用的注释方法是使用//,其注释内容从//开始到该行末尾;
- 当需要更长的注释,既可以在每行的注释前标记//,也可以用/* 和 */这一对注释界定符将需要注释的地方括起来,跨行进行注释。
- 这种注释可以用来自动地生成文档,这种注释从/**开始,到*/结束。