一、变量和类型
在介绍下面各种类型之前我们先总的浏览一下有哪些类型(图中类型,以下并没有全部介绍,一些引用类型会在后面章节再介绍)
1. 整型变量
-
语法格式
int 变量名 = 初始值;
-
代码示例 int num = 10;
System.out.println(num);
-
注意事项
-
在 Java 中,一个 int 变量占4个字节,和操作系统没有直接关系 -
int 类型数据范围是 -231 ~ 231-1,也就大概是 -21亿 ~ 21亿 -
可以使用以下代码查看 Java 中的整形数据范围 System.out.println(Integer.MAX_VALUE); // int 的最大值
System.out.println(Integer.MIN_VALUE); // int 的最小值
-
如果尝试将最大值加1的话,你会发现结果是最小值,如 System.out.println(Integer.MAX_VALUE+1);
这其实和我在 【剖析C语言数据在内存中的存储】 这章画的 char 类型的圆形图很像,最小值减1就变成了最大值,最大值加1就变成了最小值 -
如果你定义一个整型,初始化的值超过了 int 范围,如2147483648,你会发现报错,因为这是已经超出了 int 的最大范围。但是由于编译器不同,如果你将代码写成这样,也是可能通过的 int a =2147483647 + 1;
2. 长整型变量
-
语法格式
long 变量名 = 初始值;
-
代码示例 long num = 10L;
System.out.println(num);
-
注意事项
-
定义一个长整形变量,初始值后面要加 L 或 l 会更好一些 -
long 类型数据范围是 -263 ~ 263-1 -
可以使用以下代码查看 Java 中的长整形数据范围 System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
3. 双精度浮点型
-
语法格式
double 变量名 = 初始值;
-
代码示例 double num = 1.0;
System.out.println(num);
-
注意事项
-
在 Java 中,int 除以 int 的值任然是 int(会直接舍弃掉小数部分),如 int a = 1;
int b = 2;
System.out.println(a/b);
将 int 改为 double 才能得到结果0.5 -
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和 C 语言一样),尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差。我们看一段代码 double num = 1.1;
System.ou.println(num * num);

因为 double 可以精确表示11位,而之后的数都不是精确值,总结就是,小数没有精确值
-
虽然 Java 中的 double 是8个字节,但是浮点数的内存布局和整数的差别很大,不能单纯的用 2n 的形式表示数据范围 -
可以使用以下代码查看 Java 中的双精度浮点类型数据范围 System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
4. 单精度浮点型
-
语法格式
float 变量名 = 初始值;
-
代码示例 float num = 1.0f;
System.out.println(num);
-
注意事项
-
float 类型的数值后有后缀 F 或 f,没有后缀的浮点数默认为 double 类型,也可后缀 D 或 d -
如果上述代码数值后没有 f,则会报错。因为 Java 是强类型语言,1.0 默认是 double 型,等号左右类型不匹配 -
可以使用以下代码查看 Java 中的双精度浮点类型数据范围
System.out.println(Double.MAX_VALUE);
System.out.println(Double.MIN_VALUE);
5. 字符类型变量
-
语法格式
char 变量名 = 初始值;
-
代码示例 char ch = 'C';
System.out.println(ch);
-
注意事项
-
在 Java 中的 char 是一个无符号的整数。为什么这么说呢,我们可以看一个代码 char ch1 = 97;
char ch2 = -7;
System.out.println(ch1);
System.out.println(ch2);
也因此 char 类型的范围在 0 ~ 216 -
可以使用以下代码查看 Java 中的字符类型数据范围 System.out.println(Character.MAX_VALUE);
System.out.println(Character.MIN_VALUE);
而最小值对应的字符是 '\u0000' ,最大值对应的字符是 '\uFFFF' 。 -
在 C 语言中 char 是一个字节,而在 Java 中 char 是两个字节,其表示的字符种类也更多,如有中文 -
在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符 -
执行 javac 编译含有中文的代码时可能报错,因为 Java 中使用 Unicode 编码字符,而编译时使用的是 GBK 解码,所以不能正确的将中文给编译出来。如果编译代码改成这样就可以了 javac -encoding utf-8 文件名.java
6. 字节类型变量
-
语法格式
byte 变量名 = 初始值;
-
代码示例 byte value = 0;
System.out.println(value);
-
注意事项
-
在 Java 中 byte 是一个字节,故其范围为 -128 ~ 127 -
可以使用以下代码查看 Java 中的字节类型数据范围 System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);
-
大家可以判断一下这段代码的结果是多少 byte a = Byte.MAX_VALUE + 1;
System.out.println(a);
答案会像 int 类型一样变成该类型的最小值吗?不会,因为1是整形,占4个字节,两种类型计算的话都会先转化成 int 类型,然后又被转换为 byte 类型而丢失精度,故结果报错
7. 短整型变量
-
语法格式
short 变量名 = 初始值;
-
代码示例 short a = 0;
System.out.println(a);
-
注意事项
8. 布尔类型变量
-
语法格式
boolean 变量名 = 初始值;
-
代码示例 boolean value = true;
System.out.println(value);
-
注意事项
- boolean 类型的变量只有两种取值,true 表示真,false 表示假
- Java 的 boolean 类型和 int 不能相互转换,不存在 非0 表示 true, 0 表示 false 这样的用法
- JVM 规则下,没有明确 boolean 类型的大小,有些书里表明是占1个字节, 有些表明是占1个比特位
9. 字符串类型变量
-
语法格式
String 变量名 = “初始值”;
-
代码示例 String name = "LiXiaoBo";
System.out.println(name);
-
拼接用法
- 拼接:字符串和任意类型的数据,使用 “+” 号拼接后,其结果也是字符串,如
int a = 10;
System.out.println("a = " + a);
再看一个代码
int a = 10;
int b = 20;
System.out.println("ab = " + a + b);
这个结果为 `ab = 1020` ,但是我再将代码改一下是多少呢?
int a = 10;
int b = 20;
System.out.println(a + b + "= ab");
结果为 30 = ab 。所以要注意,只有字符串在前面时,才能直接拼接,不然可能会先进行其他运算
- 如果字符串里有特殊字符,则需要加上转义符号,如
String str = "hello \"吞吞吐吐大魔王\"";
System.out.println(str);
大家可以看一下特殊的转义字符有哪些
| 特殊字符的转义序列 | |
---|
转义序列 | 名称 | Unicode 值 | \b | 退格 | \u0008 | \t | 制表 | \u0009 | \n | 换行 | \u000a | \r | 回车 | \u000d | \ ‘’ | 双引号 | \u0022 | \ ’ | 单引号 | \u0027 | \ \ | 反斜杠 | \u005c |
-
注意事项
String 的类型其实与上面的内置类型不一样,它其实是引用类型。因为它所定义的变量叫做引用变量。按照示例代码,引用变量 name 里面存放的不是字符串"LiXiaoBo" ,而是将字符串所占的那片空间的地址存放在 name 里面
10. 变量的作用域
和 C 语言类似,在 java 中,变量的作用域就是该变量能生效的范围,一般时变量定义所在的代码块内(相邻大括号中)
11. 变量的命名规则
-
硬性指标
- 一个变量名只能包含数字、字母、下划线
- 数字不能开头
- 虽然语法上允许使用中文/美元符($)命名变量,但是不推荐
-
推荐
以上简介了简单的、实用的命名规则,如果想知道在 java 中具体命名的一些规则,可以浏览 第三章 Java的基本程序设计结构(1) 我写的这篇《Java 核心技术卷I》的阅读笔记里的内容
12. 常量
概念
常量指的是运行时类型不能发生改变,主要有一下两种体现形式
-
字面常量 10
010
0x10
10L
1.0
1.5e2
1.0f
true
'a'
"abc"
-
final 关键字修饰的常量
- 在 Java 中,利用关键字 final 指示常量,如
final double CM_PER_INCH=2.54;
13. 理解数值提升
如果大家对于类型转换与强制类型的使用有疑惑,可以直接去浏览 第三章 Java的基本程序设计结构(1) 我写的这篇《Java 核心技术卷I》的阅读笔记里的内容。而这里我则举一些例子有助你更好的理解,如
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
这个如果编译其实会报错,为什么呢?因为 a 和 b 虽然都是 byte 类型,但是计算时会先将 a 和 b 都提升成 int 类型再进行计算,得到的结果也是 int 类型,然后赋值给 c 当然会报错。修改成这样就可以
byte a = 10;
byte b = 20;
byte c = (int)(a + b);
System.out.println(c);
由于计算机的 CPU通常是按照4个字节为单位从内存中读写数据,所以对于 byte 和 short 这种低于4个字节的类型,计算时我们要格外注意。因为他们会通常先提升为 int 类型
14. int 和 String 之间的相互转换
-
int 转换成 String
-
String 转换成 int
二、运算符
在 java 中基本运算都和 C 语言中差不多,以下介绍一些不一样或者是特殊的情况
-
% 表示取余,不仅可以对 int 求模,也能对浮点类型求模,如 System.out.println(1.4%2);
-
对于复合运算符,如 +=、-=、*=、/=、%= 等等,使用它们时,对于 byte 和 short 这种低于4个字节的类型,就不需要担心类型的问题。因为它会帮你自动进行类型的转换。如 short a = 10;
a = a + 20;
System.out.println(a);
这种情况编译就会报错,因为计算时 short 类型会先提升为 int 类型。但是如果使用增量运算符,就没有这种情况 short a = 10;
a += 20;
System.out.println(a);
-
& 和 | 如果操作数为 boolean 的时候,也表示逻辑运算。但是它们不支持短路运算 -
在使用位运算符时,我们不仅要知道十进制与二进制的快速转化,还要知道八进制、十六进制和二进制的快速转换
- 十六进制转二进制:一个十六进制数字对应4个二进制位,如
int a = 0xf1;
- 八进制转二进制:一个八进制数字对应3个二进制位,如
int a = 072;
-
在 Java 中,移位运算符多了一个 >>> 符号,它叫做无符号右移。它与 >> 右移运算符不同的是,它右移时,高位补0。而 >> 运算符右移时,高位补符号位
并且移位运算符我们需要知道下面的规律
- 左移 n 位,相当于原数字乘以 2n
- 右移 n 位,相当于原数字除以 2n
三、 注释
Java 中的注释主要分以下三种
- 单行注释:// 注释内容
- 多行注释:/* 注释内容 */ (不推荐)
- 文档注释:/** 文档内容 */ (常见于方法和类之上描述方法和类的作用,可用来自动生成文档)
注意
在使用注释时,如果注释内容里包括转义字符可能会出现错误,如
这是由于
- Unicode 转义序列会在解析代码之前得到处理
\u000a 的含义是换行符,故该语句后面的内容都换到下一行了。
如果转义字符超过自己的数值范围,也会报错。
快捷键(注释和取消注释一样)
行注释:Ctrl + /
块注释:Ctrl + Shift + /
四、 关键字
关键字是 Java 中一些具有特定含义的单词。并且我们定义的变量名不能和关键字冲突。
我们先简单浏览 Java 中有哪些关键字吧!
| | | | | |
---|
用于定义访问权限修饰符的关键字 | private | protected | public | | | | | | | | | 用于定义类、函数、变量修饰符的关键字 | abstract | final | static | synchronized | | | | | | | | 用于定义类与类之间关系的关键字 | new | this | super | instanceof | | | | | | | | 用于异常处理的关键字 | try | catch | finally | throw | throws | | | | | | | 用于包的关键字 | package | import | | | | | | | | | | 其他修饰符关键字 | native | strictfp | transient | volatile | assert |
五、 总结
我的 Java 学习之旅已经开始啦!果然 C 语言学好了,再开始学习其他语言时会很舒服。希望自己继续努力,并且可以在学习的时候找到一种更加高效、专注的学习状态。也希望我的学习记录能给大家带来收获。奥里给!
|