文章目录
零、本讲学习目标
1、学会变量的定义
2、了解变量的数据类型
3、掌握变量类型转换的方式
4、明确变量的作用域
5、熟悉Java中的常量
编写程序对数据进行加工处理,原始数据、中间结果以及最终结果都需要存放,而变量就是内存里用来存放各种数据的容器。对于变量,顾名思义,也就是说一个变量里存放的数据在程序执行过程中是可以不断变化的。在程序执行期间,数据保持不变的容器,那就是常量了。
一、变量(Variable)
1、变量定义
(1)变量定义语法格式
在程序运行期间,随时可能产生一些临时数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元我们称之为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。
(2)变量定义示例
(3)变量在内存中的状态变化图
2、变量数据类型
Java是一门强类型的编程语言,它对变量的数据类型有严格的限定。在定义变量时必须先声明变量的数据类型,在为变量赋值时必须赋予和变量同一种类型的值,否则程序在编译期间就会出现类型匹配错误的问题。
Java有8种基本数据类型:byte、short、int、long、float、double、char、boolean。
(1)整数类型变量
类型名 | 占用空间 | 取值范围 |
---|---|---|
byte | 8位(1个字节) | |
short | 16位(2个字节) | |
int | 32位(4个字节) | |
long | 64位(8个字节) |
在为一个long类型的变量赋值时,所赋值的后面要加上一个字母“L”(或小写“l”),说明赋值为long类型。如果赋的值未超出int型的取值范围,则可以省略字母“L”(或小写“l”)。
(2)浮点数类型变量
类型名 | 占用空间 | 取值范围 |
---|---|---|
float | 32位(4个字节) | 1.4E-45 ~ 3.4E+38,-1.4E-45 ~ -3.4E+38 |
double | 64位(8个字节) | 4.9E-324 ~ 1.7E+308,-4.9E-324 ~ -1.7E+308 |
一个小数会被默认为double类型的值,因此在为一个float类型的变量赋值时,所赋值的后面一定要加上字母“F”(或者小写“f”),而为double类型的变量赋值时,可以在所赋值的后面加上字符“D”(或小写“d”),也可以不加。
(3)字符类型变量
- 字符类型变量用于存储一个单一字符,在Java中用char表示。
- Java中每个char类型的字符变量都会占用2个字节。
- 在给char类型的变量赋值时,需要用一对英文半角格式的单引号(’’)把字符括起来,如’a’,也可以将char类型的变量赋值为0~65535范围内的整数,计算机会自动将这些整数转化为所对应的字符,如数值97对应的字符为’a’。
(4)布尔类型变量
布尔类型变量用来存储布尔值,在Java中用boolean表示,该类型的变量只有两个值,即true和false。
(5)案例:演示变量数据类型
package net.hw.lesson04;
/**
* 功能:演示基本数据类型
* 作者:华卫
* 日期:2020年3月4日
*/
public class Example402 {
public static void main(String[] args) {
// 数值型变量
byte b = 127;
short s = 32767;
int i = 2147483647;
long l = 9223372036854775807L;
float f = 3.4028235E38f;
double d = 1.7976931348623157E308;
System.out.println(b + " " + s + " " + i + " " + l + " " + f + " " + d);
// 数值型变量范围
System.out.println("Byte.MIN_VALUE = " + Byte.MIN_VALUE);
System.out.println("Byte.MAX_VALUE = " + Byte.MAX_VALUE);
System.out.println("Short.MIN_VALUE = " + Short.MIN_VALUE);
System.out.println("Short.MAX_VALUE = " + Short.MAX_VALUE);
System.out.println("Integer.MIN_VALUE = " + Integer.MIN_VALUE);
System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
System.out.println("Long.MIN_VALUE = " + Long.MIN_VALUE);
System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
System.out.println("Float.MIN_VALUE = " + Float.MIN_VALUE);
System.out.println("Float.MAX_VALUE = " + Float.MAX_VALUE);
System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);
// 字符型变量
char c1 = 'a';
char c2 = 'A';
int c1asc = c1;
int c2asc = c2;
System.out.println(c1 + "的ASCII:" + c1asc);
System.out.println(c2 + "的ASCII:" + c2asc);
// 转义字符(\n,\t……)
System.out.println("你喜欢Java吗?\n那还用说!\n为什么喜欢呢?\nJava排名第一!");
System.out.println("张峰\t\t李玟\t\t王刚");
// 布尔型变量
boolean b1 = true;
boolean b2 = false;
System.out.println("b1 = " + b1 + "\nb2 = " + b2);
}
}
运行程序,查看结果:
3、变量类型转换
在程序中,当把一种数据类型的值赋给另一种数据类型的变量时,需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:自动类型转换和强制类型转换。
(1)自动类型转换
- 自动类型转换也叫隐式类型转换,指的是两种数据类型在转换的过程中不需要显式地进行声明。当把一个类型取值范围小的数值直接赋给另一个取值范围大的数据类型变量时,系统就会进行自动类型转换。
- 自动类型转换就好比将小瓶水倒入到大瓶的换装过程。我们将小瓶水倒入到大瓶中时,由于小瓶的容量比大瓶的容量小,所以倒入的水永远不可能溢出大瓶。
- Java中支持不同数据类型之间的自动转换
package net.hw.lesson04;
/**
* 功能:测试自动类型转换
* 作者:华卫
* 日期:2020年3月4日
*/
public class Example403 {
public static void main(String[] args) {
byte b = 3;
int i0 = b; // 允许字节型自动转换成整型
System.out.println("i0 = " + i0);
char c = 'a'; // 对应的ASCII码是97
int i = c; // 允许字符型自动转换成整型
System.out.println("i = " + i);
long l = i; // 允许整型自动转换成长整型
System.out.println("l = " + l);
float f = l; // 允许长整型自动转换成浮点型
System.out.println("f = " + f);
double d = f; // 允许浮点型自动转换成双精度
System.out.println("d = " + d);
}
}
运行程序,结果如下:
(2)强制类型转换
-
强制类型转换也叫显式类型转换,指的是两种数据类型之间的转换需要进行显式地声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。
-
强制类型转换就好比将大瓶水倒入到小瓶中一样,如果大瓶中的水的容量小于小瓶的大小,那么水是可以完全倒入的;否则多出来的水就会溢出。所以系统默认不支持这种行为,只能由开发者自己决定是否进行强制类型转换。
-
在对变量进行强制类型转换时,会发生取值范围较大的数据类型向取值范围较小的数据类型的转换情况,如将一个int类型的数转为byte类型,这样做极容易造成数据精度的丢失。
-
出现丢失精度的原因是,变量b为int类型,在内存中占用4个字节,而byte类型的数据在内存中占用1个字节,当将变量b的类型强转为byte类型后,前面3个高位字节的数据已经丢失,这样数值就发生了改变。
(3)表达式类型自动提升
表达式是指由变量和运算符组成的一个算式。变量在表达式中进行运算时,也有可能发生自动类型转换,这就是表达式数据类型的自动提升,如byte
、short
和char
类型的变量在运算期间类型会自动提升为int
,然后再进行运算。
package net.hw.lesson04;
/**
* 功能:测试表达式类型自动提升
* 作者:华卫
* 日期:2020年3月4日
*/
public class Example404 {
public static void main(String[] args) {
byte b = 23;
short s = 120;
char c = 'a';
int sum = b + s + c;
System.out.println("sum = " + sum);
}
}
运行程序,结果如下:
如何判断b+ s + c表达式里的各个变量类型已经自动提升到int类型?
由此可以看到,变量b、s、c自动提升为int类型,其和也是int类型,赋给short或byte类型变量,都是要报错的。
(4)强制类型转换格式
目标类型 变量名 = (目标类型)值;
package net.hw.lesson04;
/**
* 功能:测试强制类型转换
* 作者:华卫
* 日期:2020年3月4日
*/
public class Example405 {
public static void main(String[] args) {
// 声明部分
double score = 98.5;
float s = (float) score; // 将双精度强制转换成浮点型
long l = (long) score; // 将双精度强制转换成长整型
int n = (int) score; // 去尾取整
int m = (int) (score + 0.5); // 四舍五入取整
int k = (int) (score + 1); // 进位取整
// 输出部分
System.out.println("score = " + score);
System.out.println("s = " + s);
System.out.println("l = " + l);
System.out.println("n = " + n);
System.out.println("m = " + m);
System.out.println("k = " + k);
}
}
运行程序,结果如下:
4、变量作用域
变量需要在它的作用范围内才可以被使用,这个作用范围称为变量的作用域。
可以看到,在代码块里可以访问在代码块之前的变量x。
但是,我们来看一下,在代码块后能否访问在代码块里定义的变量y呢?
可以看到,变量y的作用域只在代码块里,出了代码块,变量y就不再存在了,因此提示“无法解析符号y”。
变量作用域的三个级别:代码块级别——>方法级别——>类级别
低级别范围可以访问高级别变量,反之则不能访问,编译器会报错。
二、常量(Constant)
常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符’a’、浮点数3.2等。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。
1、字面常量(Literal Constant)
(1)整型常量
- 二进制:由数字0和1 组成的数字序列。在JDK 7以后,允许使用二进制字面值来表示整数,此时二进制数值前面要以0b或0B开头,目的是为了和十进制进行区分,如:0b01101100、0B10110101。
- 八进制:以0开头,并且其后由0 ~7范围(包括0和7)内的整数组成的数字序列,如:0342。
- 十进制:由数字0~9范围(包括0和9)内的整数组成的数字序列。如:198。
- 十六进制:以0x或者0X开头,并且其后由0-9、A-F(包括0和9、A和F)组成的字符序列,如:0x25AF。
不同进制整数之间的相互转换:
package net.hw.lesson04;
/**
* 功能:演示进制转换
* 作者:华卫
* 日期:2020年3月4日
*/
public class Example408 {
public static void main(String[] args) {
// 将十进制数转换成二进制、八进制与十六进制字符串
int num = 234;
System.out.println("十进制" + num + "的二进制:" + Integer.toBinaryString(num));
System.out.println("十进制" + num + "的八进制:" + Integer.toOctalString(num));
System.out.println("十进制" + num + "的十六进制:" + Integer.toHexString(num));
// 将二进制转换成十进制
int n1 = 0b11101010;
System.out.println("二进制11101010的十进制:" + n1);
// 将八进制转换成十进制
int n2 = 0352;
System.out.println("八进制352的十进制:" + n2);
// 将十六进制转换成十进制
int n3 = 0xea;
System.out.println("十六进制ea的十进制:" + n3);
}
}
运行程序,结果如下:
课堂练习:将十六进制数7d3e5a转换成其它几种进制。
(2)浮点型常量
浮点数常量就是在数学中用到的小数,分为float单精度浮点数和double双精度浮点数两种类型。
2e3f 3.6d 0f 3.84d 5.022e+23f
单精度浮点数后面以F
或f
结尾,而双精度浮点数则以D
或d
结尾。当然,在使用浮点数时也可以在结尾处不加任何后缀,此时Java虚拟机会将浮点数默认识别为double
双精度浮点数。
(3)字符常量
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号(’ ')引起来,它可以是英文字母、数字、标点符号以及由转义序列来表示的特殊字符。
‘a’ ‘1’ ‘&’ ‘\r’ ‘\n’ ‘\t’
转义字符:
在字符常量中,反斜杠(\)是一个特殊的字符,被称为转义符,它的作用是用来转义紧随其后的一个字符。转义后的字符通常用于表示一个不可见的字符或具有特殊含义的字符,例如“\n”表示换行。
常见转义字符:
- \r :表示回车,将光标定位到当前行的开头,不会跳到下一行。
- \n :表示换行,换到下一行的开头。
- \t :表示制表符,将光标移到下一个制表符的位置,就像在文档中用Tab键一样。
- \b :表示退格符号,就像键盘上的Backspace。
- \’ :表示单引号字符,表示字符的开始和结束,如果直接写单引号字符(’),程序会认为前两个是一对,会报错,因此需要使用转义(\’)。
- \" :表示双引号字符,表示字符串的开始和结束,包含在字符串中的双引号需要转义,比如"he says,“thank you”."。
- \\ :表示反斜杠转义字符,由于在Java代码中的斜杠(\)是转义符,因此需要表示字面意义上的\,就需要使用双斜杠\\。
(4)字符串常量
字符串常量用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号(" ")引起来。
“Hello World” “903213” “Welcome to Luzhou~”
(5)布尔常量
布尔常量即布尔类型的两个值true和false,该常量用于区分一个条件的真假。
(6)null常量
null常量只有一个值null,表示对象的引用为空。
2、符号常量(Symbolic Constant)
Java符号常量,其实就是特殊的变量,也是固定不变的量,有且只能进行一次赋值。只需要在定义变量的语法基础上加上一个final
关键字修饰即可。
(1)符号常量定义格式
final 常量类型 常量名 [= 初始值];
(2)案例:计算圆面积(采用符号常量PI)
package net.hw.lesson04;
import java.text.DecimalFormat;
/**
* 功能:演示符号常量
* 作者:华卫
* 日期:2020年3月4日
*/
public class Example409 {
public static void main(String[] args) {
final double PI = 3.1415926;
double r = 2;
double area = PI * r * r;
System.out.println("area = " + area);
System.out.println("area = " + String.format("%.2f", area));
System.out.println("area = " + (int) (area * 100 + 0.5) / 100.0);
System.out.println("area = " + Math.round(area * 100) / 100.0);
DecimalFormat df = new DecimalFormat("#.##");
System.out.println("area = " + df.format(area));
}
}
运行程序,结果如下:
本案例,采用了几种方式来实现保留到小数点后面两位。大家可以选择一种自己喜欢的方式,在后面的教学案例里还会用到这个东西。
Python里也有方法实现保留到小数点后面多少位。
三、课后作业
1、简述Java基本数据类型
- 说明每种类型的关键字、占用多少个字节
2、输入两个实数,编程计算其和差积商。
- 提示:加减乘除运算符号分别是+、-、*、/