目录
前言
数据类型
1. 数据类型的分类
2. 基本数据类型
变量
1. 概叙
2. 整型变量
3. 字节型 & 短整型 & 长整型变量
4. 单 / 双精度浮点型变量
5. 字符型变量
6. 布尔型变量
类型转换
1. 自动类型转换(隐式)
2. 强制类型转换(显式)
补充:类型提升
字符串类型
运算符
1. 算术运算符
2. 增量运算符
3. 自增/自减运算符
4. 关系运算符
5. 逻辑运算符
6. 位运算符
7. 移位操作符
8. 条件运算符
结语
前言
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,不仅如此,Java语言还具有简单性、面向对象、分布式、健壮性、安全性、跨平台性、可移植性、多线程与动态性等特点。总之,作为一门优秀的程序设计语言,Java是值得我们认真去深入学习的,从今天起,我们也将正式开启Java的学习之旅!
数据类型
1. 数据类型的分类
在Java中,数据类型主要分为两类:基本数据类型和引用数据类型
2. 基本数据类型
数据类型 | 关键字 | 字节数 | 数值范围 |
---|---|---|---|
字节型 | byte | 1 个字节 | -128 ~ 127 |
短整型 | short | 2 个字节 | -32768 ~ 32767 |
整型 | int | 4 个字节 | -2^31 ~ 2^31 - 1 |
长整型 | long | 8 个字节 | -2^63 ~ 2^63 - 1 |
单精度浮点数 | float | 4 个字节 | 一般不关注 |
双精度浮点数 | double | 8 个字节 | 一般不关注 |
字节型 | char | 2 个字节 | 0 ~ 65535 |
布尔型 | boolean | 无明确规定 | true 和 false |
- 没有long long这种类型
- 整型和浮点型都默认带有符号的
- 整型默认为int类型,浮点型默认为double类型
- 字符串属于引用数据类型,后续我们会先详细介绍
变量
1. 概叙
在Java中,我们会将那些经常改变的内容称为变量,像人的身高,岁数的增长,成绩分数的多少等等。而数据类型就是用来定义不同种类的变量的。
2. 整型变量
// 在定义时就给初始值
public static void main(String[] args) {
int a = 10;
System.out.println(a);
}
// int型变量所能表示的范围
System.out.println(Integer.MAX_VALUE); //2147483647
System.out.println(Integer.MIN_VALUE); //-2147483648
注意事项:
- int类型无论在哪种系统下都是4个字节
- int的表示范围为:-2^31 ~ 2^31 - 1
- 变量在使用前要记得赋值,否则编译会报错
- int的包装类型是Integer(可以简单理解为plus版的int)
3. 字节型 & 短整型 & 长整型变量
public static void main(String[] args) {
byte b = 10; // 字节型
System.out.println(b);
short s = 10; // 短整型
System.out.println(s);
long l = 10L; // 长整型
System.out.println(l);
}
// byte、short、long型变量所能表示的范围
System.out.println(Byte.MAX_VALUE); //127
System.out.println(Byte.MIN_VALUE); //-128
System.out.println(Short.MAX_VALUE); //32767
System.out.println(Short.MIN_VALUE); //-32768
System.out.println(Long.MAX_VALUE); //9223372036854775807
System.out.println(Long.MIN_VALUE); //-9223372036854775808
注意事项:
- byte类型在哪种系统下都是1个字节
- byte的包装类型为Byte
- short类型在哪种系统下都是2个字节
- short的包装类型为Short
- long在初始化时,在要后面加上L,以便区分
- long类型在哪种系统下都是8个字节
- long的包装类型为Long
4. 单 / 双精度浮点型变量
public static void main(String[] args) {
float a = 1.0F; // 单精度浮点型
System.out.println(a);
double b = 2.0; // 双精度浮点型
System.out.println(b);
}
注意事项:
- float类型在哪种系统下都是4个字节
- float在初始化时,在要后面加上F,以便区分
- float的包装类型为Float
- double类型在哪种系统下都是8个字节
- double的包装类型为Double
(浮点型和整型在内存中的存储方式不同,所以它不能单纯用 2^n 的形式来计算;任何一个浮点数都没有一个非常精确的值,但我们可以精确到具体小数点后第几位)
5. 字符型变量
public static void main(String[] args) {
char c1 = 'A'; // 大写字符
char c2 = '1'; // 数字
char c3 = '呵'; // 中文字符
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
注意事项:
- Java中使用 单引号+单个字母 的形式来表示字符变量
- 在Java使用的是Unicode来表示字符,跟C语言的ASCII不一样
- 一个字符占2个字节,因此可以表示的字符种类就更多,也包括中文字符
- char的包装类型为Character
6. 布尔型变量
public static void main(String[] args) {
boolean a = true;
System.out.println(a);
boolean b = false;
System.out.println(b);
}
注意事项:
- boolean类型的变量只有两种取值,true表示真,false表示假。在Java中,不存在 1 表示真,0 表示假
- boolean类型没有明确规定占几个字节,且它不能和其他类型进行转换
- boolean的包装类型为Boolean
类型转换
在Java中,当参与运算数据类型不一致时,就会进行类型转换,Java中类型转换主要分为两种:自动类型转换(隐式)和强制类型转换(显式)
1. 自动类型转换(隐式)
顾名思义,在代码编译时,编译器会自动进行类型转换,一般在数据类型小的转为数据类型大的时候会自动转换
2. 强制类型转换(显式)
当进行操作时,代码需要我们自己强制类型转换才能完成,编译器无法自动完成,一般在数据类型大的转为数据类型小的时候会出现。我们通常采用 (目标类型) + 目标变量 的方式来强制类型转换
注意事项:
- 在强制类型转换时,可能会使数据的精度丢失,要特别注意
- 当我们将一个变量进行赋值时,Java会自动帮我们检查数字是否在该类型的表示范围之内
- 强制类型转换不一定能成功,而且不相干的类型之间是无法相互转换的,比如boolean和其他类型
补充:类型提升
不同类型的数据进行运算时,数据类型小的会自动提升到数据类型大的一边,举个例子
- 当 int 和 long 在一起运算时,int 会被提升为 long,所以就会出现下面的情况:c 因为是 int 类型,无法保存 a + b 得到的 long 类型,会出现丢失数据
- byte 和 byte 的运算
为什么 byte 和 byte 相加后不能赋值给同为 byte 类型的 c 呢?原因在于:a 和 b 在相加前就已经被编译器自动提升为了 int 类型,再来相加,得到的结果当然也就为 int 类型啦,所以将结果直接赋值给 c 就会编译出错。
这种情况在 short 和 short 的运算也会出现,因为在计算机上,CPU通常是按照 4 个字节为单位从内存中读写数据,为了硬件上实现方便,所以低于 4 个字节的类型如 byte 和 short 类型就会先提升成 int,接着再参与计算
字符串类型
这个是最特殊的类型,不同于 C/C++ ,Java单独为字符串创建了一个专门的数据类型 —— String
在这里我们就简单介绍一下字符串类型,关于它的更多知识点我会在后面单独开一篇博客详细讲解的
运算符
1. 算术运算符
加法 | 减法 | 乘法 | 除法 | 取模 |
---|---|---|---|---|
+ | - | * | / | % |
简单使用:
注意事项:
- 以上运算符都是二元运算符,使用时需要有两个操作数
- 在使用除法和取模时,右操作数不能为 0,否则会出现算术异常
- 取模不仅可以对整数取模,也可以对 double 取模,不过没有实际意义,我们还是习惯对整数取模
- 当两侧的操作数类型不一样时,数据类型小的会自动提升到数据类型大的一边
2. 增量运算符
加等 | 减等 | 乘等 | 除等 | 取模等 |
---|---|---|---|---|
+= | -= | *= | /= | %= |
该类运算符在完成操作后,会将结果直接赋值给左操作数
我们在上面讲类型提升的时候说道:“不同类型的数据进行运算时,数据类型小的会自动提升到数据类型大的一边”,但对于增量操作符来说,它会在计算的时候自动帮我们进行类型转换,如下:
3. 自增/自减运算符
4. 关系运算符
相等 | 不相等 | 小于 | 大于 | 小于等于 | 大于等于 |
---|---|---|---|---|---|
== | != | < | > | <= | >= |
注意:关系运算符最后的计算结果只有两种情况:true 或者 false,是 boolean 类型
5. 逻辑运算符
逻辑与 | 逻辑或 | 逻辑非 |
---|---|---|
&& | || | ! |
一假全假 | 一真全真 | 真假互变 |
要注意的是:逻辑运算符的计算结果都是 boolean 类型,true 或者 false
短路求值:我们先来看一个例子
明明我们的除数为 0,应该会提示算术异常,那为什么这里没有提示呢?
这就是所谓的短路情况:
- 对于 &&,如果左侧表达式值为 false,那么结果就一定是 false,不需要再计算右侧表达式
- 对于 | |,如果左侧表达式值为 true,那么结果就一定是 true,不需要再计算右侧表达式
- 但对于 & 和 | 来说,则不会发生短路
6. 位运算符
按位与 | 按位或 | 按位异或 | 按位取反 |
---|---|---|---|
& | | | ^ | ~ |
- 按位与 &:如果两个二进制位都是1,则结果为1,否则结果为0
- 按位或 | :如果两个二进制位都是0,则结果为0,否则结果为1
- 按位取反~ :如果该位为0则转为1,是1则转为0(全部取反)
- 按位异或 ^ :如果两个二进制位相同,则结果为0,相异则结果为1
7. 移位操作符
左移 | 右移 | 无符号右移 |
---|---|---|
<< | >> | >>> |
舍弃最左侧的数 最右侧补0 | 舍弃最右侧的数 最左侧补符号位 | 舍弃最右侧的数 最左侧补0 |
注意事项:
- 移位操作符都是按照比特位来进行移位运算的
- 左移时会丢弃掉符号位,因此正数左移可能会使结果变负
- 左移一位相当于原数字 * 2^1,左移n位就相当于原数字 * 2^n
- 右移一位相当于原数字 / 2^1,右移n位就相当于原数字 / 2^n
8. 条件运算符
表达式1(boolean类型) ?表达式2 :表达式3
- 当 表达式1 的值为 true 时,整个表示式的值就为 表达式2
- 当 表达式1 的值为 false 时,整个表示式的值就为 表达式3
这是Java中唯一一个三目运算符,必须要注意,表达式1要为 boolean 类型
结语
这是我的第一篇Java博客,其实在学习Java的时候,感觉跟C语言有很多相似之处,数据类型啊、运算符啊都很类似,所以打好C语言的基础对学习其他语言真的很有帮助,但是学习Java终究是一条艰难险阻的路。
说实话,这篇博客我拖延了一个星期才终于把它写完,果然放假后我还是一如既往地摆烂,现在临近开学了,才会想着努力学习,忏悔自己摆烂的所作所为。唉~,终于写完了这篇博客,就以此为鉴吧,希望自己能够找回状态,规划好新学期,重点是多敲代码!!!
希望大家能过喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!