第四课 Java中的变量和基本数据类型
跟着彦磊学Java系列为Java基础入门系列。通过此系列,我们将了解Java基础知识,包括变量、数据类型、运算符,选择结构、循环结构、数组等基本知识。此系列总结彦磊多年的经验,采用边讲边练的方式一起带领零基础的朋友走进Java世界。
本系列每章都会有大量的练习题,请大家在学习过程中,认真的进行练习,并和我提供的参考代码比较,反复感悟。要把一门语言学好,只学不悟是不可能学好的,用心自我”感悟“,多练,多想是学好一门语言的基础。
当前章节为系统章节的第四课。
您也可以通过下面连接查看其它章节
Java由小白到高手之零基础学Java系列目录
在本课中,我们将学习Java中的变量、数据类型。
为什么要使用变量
在计算机中,任何数据想进行显示或运算,都需要先放到内存中,才能后续操作。
下面的动图,演示了第一次让计算机计算1+2=3的过程及第二次计算 4+5=9的过程,请您认真品一下,以了解为什么要使用变量:
在上图示例,我们可以看到,在计算机中存放数据的过程:
当内存中没有存放数据的空间时:
- 开一块儿空间。
- 把数据放到空间中。
当内存中已经有了存放数据的空间时,可以让空间重用,只需要把数据放到空间里就行。您可以发现,同一块儿空间中的数据是可变的,因此我们在Java中把这块空间称为变量空间。
对于电脑内存来说,总容量是比较小的,我们使用内存时应能少开空间就少开。而现实生活中数据类型是很多的,如整数、小数等。那么,如何让Java开辟合适的空间呢?
这就需要了解Java中的数据类型。
Java中的数据类型决定了Java在内存中开多大的空间来存放数据。我们在使用变量前,必须声明变量的数据类型(即告诉Java在内存中开多大的空间)。
在继续了解变量之前,我们有必要先学习一下Java中的数据类型。
Java中的基本数据类型
Java中的数据类型总的来说分两种:
- 基本数据类型
- 对象数据类型
我们今天重点了解基本数据类型和简单了解对象数据类型中的String类。
下图中描述了Java中的基本数据类型
从上图大家可以看到,不同的基本数据类型占用的内存空间是不一样的,我们每次使用变量前,必须要考虑使用什么样的数据类型。
在整型中,在-231~231的整数范围内,我们常用int类型,而byte和short用在对文件的处理和需要控制占用空间量的大数组中。因此,我们常用的整型一般定义成int类型。
而如果整数的值超过了231范围,就要用用long类型了。如2,147,483,649,必须定义成long类型,因为int类型最大的数是2,147,483,648。
在浮点数(小数)中,常用的类型是double类型,而float很少用。如果需要快速处理单精度数据或需要存储大量数据时,则可考虑float类型。
boolean类型我们在随后章节学习。
除上面基本数据类型外,我们常用的数据类型还有一个String类型,它属于对象数据类型,我们在随后有专门的章节来学习String类。
Java中的变量
使用变量的步骤
- 声明变量(为变量开辟数据空间,并命名)
- 给变量赋值(在数据空间中存放数据)
- 使用变量(输出或参加运算)
变量的声明
语法
变量类型 变量名称;
示例代码:
//声明int类型的变量
int age;
//同时声明三个int类型的变量
int num1,num2,num3;
//声明char类型的变量
char ch;
//声明double类型的变量
double num;
变量命名规范
变量的命名和类相似,均遵循标识符(为类、变量、方法等命名的符号)。
- 标识符可以由字母、数字、下划线(_)和美元符号($)组成,其中数字不能打头。
- 标识符不能使用Java关键字(Java中保留起来,不让用户用的字符)
- 标识符不能使用空格
- 标识符不能使用除下划线和美元符号外的其它特殊字符
- 变量命名遵循Camel模式(即每个英文单词的首字母大写,其它英语单词的小写,如myAge)
- 变量命名不要用单个字符,而应有意义,做到见名知义,如变量为a则是一个不标准的命名,而age则是有意义的命名。
变量的赋值(变量的初始化)
给变量赋值相当于在内存空间中存放数据,变量的赋值也叫变量的初始化。
1、直接赋值(声明的同时赋值)
// 声明的同时赋值。
int age = 18;
// 声明的同时赋值,三个变量的值都为0。
int num1, num2, num3 = 0;
// char类型需要使用英文单引号引住,只能是一个字符
char ch = '彦';
// 字符串类型要使用英文双引号引住
String name = "彦磊";
2、先声明,后赋值
//先声明后赋值
double num;
//这中间可以有其它代码。
num=18.2;
变量的作用域
变量声明后,只在他的作用域范围内能访问到。作用域指包含他的那一对对儿大括号中。
在同一作用域中,变量不能重复声明(即变量名不能相同)。如下面第18行和第20行错误的显示:
不同的作用域中,变量名可以相同。如下图:
成员变量和局部变量
成员变量:声明在类中的变量,叫成员变量,也叫字段。成员变量都有各自的默认值,可以直接声明后使用。
局部变量:声明在方法或其它代码块中的变量,叫局部变量。局部变量必须在赋值后才能使用。
局部变量的优先级要大于成员变量
常用数据类型详解
char(字符类型)
字符型常用于单个字符,必须使用英文单引号引住。我们可以用以下四种形式给字符型变量赋值:
- 直接给变量单个字符,如’a’,’1’,’彦’ 等。
- 通过转义符字符赋值,如’\t’(转义符相关知识请见第一课的讲解)。
- 直接用Unicode值赋值,如’ \u78ca’。
- 直接用一个整数值赋值,如56
参见下面代码:
1. /**
2. * 此类演示了给char类型赋值的常用情况。
3. * @author 彦磊
4. *
5. */
6. public class VariableDemo05 {
7.
8. public static void main(String[] args) {
9. char ch='彦';
10. System.out.println(ch);
11. //改变ch的值为转义符:一个英文单引号
12. ch='\'';
13. //输出单引号
14. System.out.println(ch);
15. //改变ch的值为Unicode值
16. ch='\u78ca';
17. //输出“磊”
18. System.out.println(ch);
19. //改变ch的值为一个int类型。
20. ch=56;
21. //输出“8”
22. System.out.println(ch);
23. }
24. }
运行结果如下图:
整型(int、long)
Java中默认的整型是int类型。
如果想声明long类型请在字面量(下面等号后的数字即为字面量)后加L(参见下面代码 的19至25行)。
Java7对数值类型添加了_分隔符,以更直观的查看数据的位数(参见下面代码12至15行)。_在编译时不会进行编译。
请认真看下面代码的每一句注释。
1. public static void main(String[] args) {
2. //声明并初始化int类型的变量num1;
3. int num1=8;
4. //输出num1的值
5. System.out.println(num1);
6.
7.
8. //把num1中的值传递给num2,等号在这里是赋值运算符,是把右边的值赋值给左边。
9. int num2=num1;
10. System.out.println(num2);
11.
12. //java7中新增用_来分隔数字,_在编译时不会编译
13. //下面代码等同于num1=12345678
14. //更改num1中的值为新值
15. num1=1234_5678;
16. System.out.println(num1);
17.
18. //声明login类型应在后面加L,表明123是长整型。
19. long num3=123L;
20. //此行代码依然正确,但程序进行了自动类型转换,把int 类型的123转成了long
21. long num4=123;
22. //下面的代码已经出错,是因为右侧的11个2,已经超出了int类型的范围。
23. long num5=22222222222;
24. //在11个2后加个L,表明右侧是long类型,程序就不会出错。
25. long num6=22222222222L;
26.
27.
28.
29. }
浮点数
Java默认的浮点类型是double类型。如果定义float类型需要在字面量后加F。
1. public static void main(String[] args) {
2.
3. // 定义float类型应在字面量后加F或f。
4. float num = 2.0F;
5. // 下面代码已经出错,是因为2.0默认为double类型。
6. // num=2.0;
7. // 下面代码没出错,是因为2是int类型,int可以自动转换为float类型。
8. num = 2;
9. //给double类型赋值。
10. double num1=2.0;
11. //依然可以使用_做分隔符。
12. num1=1.22_2222_2222;
13.
14. }
其它的类型我们将在后续课程中了解。
基本数据类型的转换
1、 自动类型转换
数值类型的自动转换
把一个基本类型的值赋值给另一个基本类型的变量,且程序不出错,就是自动类型转换。
数值类型位数少的类型可以自动转成位数大的,下图中从左向右可以发生自动类型转换,反之则出错。
下面代码演示了各种类型的自动类型转换:
1. public static void main(String[] args) {
2.
3. byte byteVal=56;
4. //byte可以自动转换成short类型
5. short shortVal=byteVal;
6. //short类型可以自动转换成int类型
7. int intVal=shortVal;
8. //char哦对噶可以自动转换成int类型
9. intVal='a';
10. //int类型可自动转换成float类型
11. float floatVal=intVal;
12. //float类型可以自动转换成double类型
13. double doubleVal=floatVal;
14.
15. System.out.println(doubleVal);
16.
17. }
基本类型转字符串
当一个基本类型和字符串用“+”连字符运算时,基本类型将自动转换成字符串类型,请看下面例子:
1. String valStr = "1";
2. int valInt = 2;
3. // 基本类型和String类型使用+连字符运算后,会自动转成String类型
4. // 因此程序运行时先将int类型的2转成String类型,然后再和String类型的1相连
5.
6. String result = valStr + valInt;
7. // 输出的是字符串12
8. System.out.println(result);
9.
10. //将基本类型转成String类型的一种方法
11. String intToStringVal = valInt + "";
12.
13. System.out.println(intToStringVal);
下图是输出结果:
因此,当我们想把一个基本类型转成String类型时,最简单的方法就是和一个空字符串相“+”,如上图的第21行代码。
2、 赋值运算符
看下图,当我们把一个double类型的值赋值给float类型时会报错:
上图第9行,第15行的英文等号,叫做赋值运算符:
作用:
赋值运算符的作用是将右侧的变量值或值传递给左侧。
注意事项:
- 赋值运算符的左侧必须是一个变量。
- 赋值运算符两端的数据类型必须一样,或能将右侧的数据自动转成左侧的类型。
因此,想解决上图的错误,就要进行强制类型转换,即下图中从右向左转换,需要进行强制类型转换。
3、 强制类型转换
语法:目标类型 变量=(目标类型)值;
注意事项:强制类型转换有可能会造成数据精度的丢失
下面代码演示了强制类型转换:
1. double doubleVal = 8.99;
2. // 将double类型强制转换成float类型
3. float floatVal = (float) doubleVal;
4. /*
5. * 强制类型转换会造成数据精度的丢失 下面代码转换后得到的值是8。而不是四舍五入的9
6. * 将double类型的数据强制转成int类型
7. */
8.
9. int intVal = (int) doubleVal;
10. //输出8
11. System.out.println(intVal);
练习
本阶段我们学习了Java中的基本数据类型及变量的相关知识。接下来我们通过一波练习来巩固一下所学知识(练习答案在文末):
1、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public static void main(String[] args) {
2. int num;
3.
4. System.out.println(num);
5. }
2、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public static void main(String[] args) {
2. int num;
3. double num=3;
4. System.out.println(num);
5. }
3、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public class Exercises03 {
2. static int num;
3.
4. public static void main(String[] args) {
5. System.out.println(num);
6. }
7. }
4、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public class Exercises04 {
2. static int num;
3.
4. public static void main(String[] args) {
5. int num=3;
6.
7. System.out.println(num);
8. }
9. }
5、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public class Exercises05 {
2. static int num=0;
3.
4. public static void main(String[] args) {
5. int num = num;
6.
7. System.out.println(num);
8. }
9. }
6、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public class Exercises06 {
2.
3. public static void main(String[] args) {
4. int num=3.5;
5.
6.
7. System.out.println(num);
8. }
9. }
7、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public class Exercises07 {
2.
3. public static void main(String[] args) {
4.
5. int num=(int)3.5;
6. int num2=3;
7.
8. System.out.println("输出的结果为:"+num+num2);
9. }
10. }
8、下面代码是否有错,有错指出错误,并改正,没错说出运行结果:
1. public static void main(String[] args) {
2.
3. int num=(int)3.5;
4. int num2=3;
5.
6. System.out.println(num+num2+"是最后的结果");
7. }
总结
最后依然用几幅思维导图总结一下本课的知识:
练习答案
1、错误:第9行会报错局部变量必须赋值后才能使用。
正确的代码参考:
1. int num;
2. /*
3. * 在方法中声明的变量是局部变量,
4. * 局部变量必须在声明后赋值才能使用
5. * 第7行给num赋值后,错误解决。
6. */
7. num=3;
8. System.out.println(num);
2、 错误:同一作用域,变量名不能相同。
正确代码参考:
1. public static void main(String[] args) {
2. int num1;
3. //同一作用域,变量名不能相同。
4. double num=3;
5. System.out.println(num);
6. }
3、 代码正确,声明在类中的变量是全局变量,全局变量不需要赋值,就能直接使用,int类型的全局变量默认值为0,因此输出结果为:0。
4、 代码正确:输出结果为3。
5、 代码错误:
正确代码参考:
6、代码错误:赋值符号左右两端的类型应一样或能发生自动类型转换。
正确代码参考:
7、代码正确:此处的+为连字符。
8、代码正确:程序先进行num+num2的相加运算,再和字符串相连。
本章源码
源码说明 :
下载地址:【第四课 配套源码】