Java第三章节学习总结
到目前为止,Java的第三章学习已经结束了,那么我就来总结一下Java第三章的学习内容吧。
文章目录
一、基本数据类型
Java中有8种基本数据类型来存储数值、字符和布尔值。
1、整形数据类型
根据占用内存的大小不同,可分为四种不同的整形类型。
byte be = 1; //定义一个byte类型的变量,内存占用 1 个字节,取值范围:-2的7次方 ~ +2的7次方减一 short st = 1; //定义一个short类型的变量,内存占用 2 个字节,取值范围:-2的15次方 ~ +2的15次方减一 int it = 1; //定义一个int类型的变量,内存占用 4 个字节,取值范围:-2的31次方 ~ +2的31次方减一 long lg = 1L; //定义一个long类型的变量,内存占用 8 个字节,取值范围:-2的63次方 ~ +2的63次方减一
- 1
- 2
- 3
- 4
注意:long类型变量在赋值时,需要在数值的最后面添加一个大写字母 L ,用于编译器区分。
2、浮点类型
浮点类型简称浮点型,用于存储含有小数的数值,Java中浮点类型分为两种,单精度(float)与双精度(double),两种浮点类型拥有不同的取值范围。
因为浮点类型需要表示带小数点的数据,所以它的取值计算,不像整数类型那般简单粗暴,浮点数类型采用IEEE规定。百度百科链接:baike.baidu.com/item/浮点数标准/22719915
float的32位由最高位的符号位、中间的8位阶码、与最后的23位尾数构成。
取值范围
符号位表示数值的正负,阶码表示数据的取值范围,尾数表示数据的精度
由于是有符号数,所以8位的阶码可表示 -128~+128的范围,所以取值范围在2^-128 – 2^127之间,大概是 -3.4E38 ~ +3.4E38。
float类型内存图
float能表示的精度由尾数决定,所以23bit大概能表示十进制的7到8位。
所以float能精准表示小数点的后7位。
double类型内存图
double类型取值范围与float类型的计算方式相同。
3、字符类型
字符型可存储不同的字符,但只能存储单个字符,并用单引号括起来
char ch='a'; //定义一个字符类型的变量,变量名为ch,值为字母a
- 1
注意: 字符类型之间在涉及计算与赋值时,Java会自动将字符类型的数据进行隐式的整形提升,转换成int类型的值进行计算,而这个值是按照该字母在ASCII码表中的值转换为int值。
//例如 char ch='a'; int num=ch; //低字节赋值到高字节的无需进行强制转换 System.out.println(num); //此时打印的值为 97 ,因为字母a在ASCII表中用十进制表示的话,是97 //注意小写字母与大写字母在ASCII表中的值并不相同
- 1
- 2
- 3
- 4
- 5
4、布尔类型
布尔类型的变量只能存储 真(true)与假(false) 两种值,只占1个bit位,Boolean类型变量默认值位false。
boolean bl=false; //定义一个布尔类型的变量,变量名为bl
- 1
boolean类型变量一般用于判断。
二、变量与常量
1.关键字
关键字又称保留字,是Java语言中已经被赋予特定意义的一些单词,不可以把这些单词作为变量名等标识符来使用。
注意:Java中的关键字都是小写的字母。
该图片来自百度百科,侵删。
2.标识符
标识符可以简简单单地理解为一个名字,是用来标识类名、变量名、方法名等有效字符序列。Java规定标识符由连续的任意顺序的字母、下划线、美元符号和数字组成,且标识符的第一位不能是数字,也不能是Java中的关键字。
例如:合法标识符
//例如 name; age; _user; $password;
- 1
- 2
- 3
- 4
- 5
非法标识符
4word; 456; User name;
- 1
- 2
- 3
3.变量与常量
变量
变量的声明与定义其实在之前的基本数据类型中已经讲过了,这里就不重复叙述了,说点重要的。
变量的声明
变量的申明需要指定数据类型,是因为只有指定的数据类型,编译器才知道需要分配一个多大的内存空间,为了方便使用这块空间,需要取一个变量名,而对变量的操作就是对这块内存空间进行操作。
常量
在程序运行的过程中不会改变的数据称为常量。常量使用 fianl 关键字进行修饰
常量的定义:fianl 数据类型 变量名 = 数据值;,常量在定义的时候必须赋初值。
常量的常量名一般使用大写字母
注意!常量在定义并赋初值后,在程序运行后不能改变常量的数据值。
4.变量的有效范围
变量一般分为局部变量与成员变量。
成员变量: 定义在类体中的变量称为成员变量,成员变量的用于范围是整个类中都可以使用。
例如:
public class Main { static int age=10; //成员变量 static final int number=120; //成员变量 public static void main(String[] args) { } }
- 1
- 2
- 3
- 4
- 5
- 6
不过被static关键字修饰的成员变量又被称为静态变量,静态变量可以通过类名.变量的方式在其他的类中使用。
局部变量: 定义在方法内的变量称为局部变量,且作用范围只在本类中或者 { } 大括号内,当前代码块中有效。
注意!!!如果成员变量与局部变量重名的话,使用时会自动遵循就近原则进行调用。
例如
public class Main { static int age=10; //成员变量 static final int number=120; //成员变量 public static void main(String[] args) { int number=99; //遵循就近原则,输出为值为 99 System.out.println(number); //静态变量使用类名.变量名的方式调用,输出值为120 System.out.println(Main.number); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
三、运算符
运算符是一些特殊符号,主要用于数据值的操作等,一些常用的运算符有,赋值运算符、算术运算符、比较运算符等
1、赋值运算符
赋值运算符就是 = 符号,与数学的 = 符号作用相同,就是将右边的数据值赋值为右边的变量,赋值运算符左边必须是一个变量。
int a=10; //将10赋值给a这个变量代表的内存空间内。
- 1
注意:赋值运算符是从最右边的数据开始处理。
2、算数运算符
算术运算符与数学中的加减乘除作用相同。在此就不多重复叙述了。
此图片来自菜鸟教程,https://www.runoob.com/java/java-operators.html ,侵权自删。
在执行自增或自减运算时,以++运算符为例。如果运算符在变量前面,那么此时变量是先进行自增,后参与其他运算。运算符在变量后面,那么会先使得变量值参与运行,后使得变量自增
int num1=10; //此时运算符在变量前面,先使得num1进行自增 //然后将num1赋值给num2,那么num2的值是11 int num2=++num1; int number1=10; //此时运算符在变量后面 //那么会先将number1的值赋值给number2,然后再使得number1进行自增 int number2=number1++; //次数number1的值是11,但number2的值是10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
需要注意的是,在进行除法运算时,0不能做除数。例如语句 “int a=5/0;”,在执行这条语句时,编译器会抛出一个异常。
3、比较运算符
比较运算符作用与数学中的作用相同,这里就不多复述了
该表格来自菜鸟教程,侵删
https://www.runoob.com/java/java-operators.html
4、逻辑运算符
逻辑运算符只有三种,逻辑与(&&)、逻辑或(||)、逻辑非(!)。逻辑运算符的操作元必须是结果为Boolean型的变量或表达式。
例图:
注意:当逻辑与或者逻辑或这两种逻辑运算符,多个联合使用的时候,会出现一种被称为 “短路” 的现象,在逻辑表达式中可通过左端的表达式可推断出整个表达式的逻辑值,减少判断所用的时间。逻辑非并不具有此功能
如图:
逻辑或(||) 也是如此,从左往右执行,当有一个表达式的结果为true时,那么整个表达式的结果只会是true,所以后面的表达式也不会去执行。
5、位运算符
数据在计算机内的存储方式是二进位存储的,二进制在计算机内表示方式是一些按一定的排列规定进行排列在一起的数字0和数字1,例如:十进制10在计算机内表示是:0000 1010 (仅展示低八位),而位运算符就是可以对数据的每一位二进制数进行一定操作的运算符。
Java中的位运算符有7种,分别是按位与(&)、按位或(|)、按位取反(~)、按位异或(^)、按位左移( << )、按位右移( >> )和无符号右移(>>>)。
如图:此图来自菜鸟教程,侵删。https://www.runoob.com/java/java-operators.html
按位与
按位或的运算规则是:对于数据的每一个二进制位,有1为1,全0为0。而对于按位取反运算符的话,则是将每一个二进制位取反。
按位取反
需要注意的是,位运算符只能由整形数据进行使用,浮点类型是无法使用位运算符的。
6、移位运算符
除了上述的位运算符之外,Java还提供了对数据按二进制数进行操作的移位操作符。移位操作符有以下三种
左移: ( << ) 右移: ( >> ) 无符号右移: ( >>> )
- 1
- 2
- 3
左移运算:将数据整体左移n位,空缺位补0
右移的操作也是如此,只不过在进行右移操作时,如果被操作数时正数,那么右移空出来的二进制位就补0,如果被操作数是负数,那么空位处就补1。
而无符号右移,它在运算时,不论被操作数是正数还是负数,空位处都是填入0。
7、三元运算符
前面我们介绍的运算符都是二元操作符与一元操作符,但Java还提供了一个三元操作符供我们使用。
三元运算符使用格式
条件式 ?值1 : 值2
三元运算符的运算规则为,若条件式为true,则整个表达式的结果取值1,否则就取值2。
boolean val= 12 > 45 ? true : false; //此时val的值就是false
- 1
三元运算符能够直接代替简单的if判断语句,有时候在代码中合理使用三元运算符,能够简化代码。
8、运算符优先级
运算符的优先级决定了表达式中运算执行的先后顺序,在同一语句中优先级高的运算符会比优先级低的运算符更先执行。如果两个运算符优先级相同,那么左边的运算符要比右边的运算符先被处理。
运算符优先级图
注意,在编写程序时尽量使用圆括号来指定运算次序,以免产生错误的运算顺序。
四、数据类型转换
在编写程序的过程用,我们可能需要使用到不同数据类型的变量,以应对不同的需求,而有时候我们会对不同的数据类型进行运算、赋值的时候,我们就需要进行类型转换了。
1、隐式转换
将低精度的数据赋值给高精度的数据时,系统会自动进行类型转换。这些类型按精度从低到高排列的顺序是:byte<short<int<long<float<double。
例如
int x=50; float y=x; //此时系统会自动进行隐式转换
- 1
- 2
2、强制类型转换
把高精度的数据赋给低精度的数据时,必须要进行强制类型转换。如果将高精度的变量赋值给低精度的变量时,超过了低精度变量所能表示的最大范围,那么将会进行溢出,并从低精度变量的另一个极端开始溢出,超过多少,溢出多少。
强制类型转换格式:(类型名)要转换的值
例如
int a=128; //定义一个占四个字节的整形变量,并赋值为128 byte b=(byte)a; //将整形变量赋值给占一个字节的byte类型的变量,并进行强制类型转换 System.out.println(b); //此时输出的却是 -128
- 1
- 2
- 3
上面的代码虽然已经进行了强制类型转换,但是因为byte类型的变量占1个字节,能表示的范围是 -128~+127,此时的+128已经超过了byte类型能表示的数据范围,那么将会出现数据溢出,并且从另一个极端溢出,超过最大表示数多少,就溢出多少。
如图
既然+128溢出后是-128,那么+128的两倍就应该是0了吧?见以下代码。
int a=128*2; byte b=(byte)a; System.out.println(b); //此时输出的是 0 ,可以证明上图
- 1
- 2
- 3
注意,除了Boolean类型不能进行强制类型转换外,其他的基本数据类型都可以进行强制类型转换。
五、结尾
第三章的学习到这里就结束了,进步了很多,也学习到了很多,上述就是我本章学习的总结。如果上文哪里有错误,欢迎大家指出,各位共同进步。