变量的定义、数据类型、类型转换、作用域
一、变量的定义
变量的数据类型 变量名称;
变量名称=初始值
要使用一个变量,都要先定义,在使用
二、数据类型
Java是一门强类型的编程语言,它对变量的数据类型有严格的限定。在定义变量时必须声明变量的数据类型,在为变量赋值时必须赋予与变量同一种类型的值,否则程序会报错。
1、整型类型变量
整数类型变量用来存储整数数值,即没有小数部分的值。在Java中,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为4种不同的类型分别是字节型(byte)、短整型(short)、整型(int)和长整型(long)。
//定义字节变量
byte b = 23;
//定义短整型变量
short s = 1223;
//定义整型变量
int i = 456666666;
//定义长整型变量
long l = 88888888888l; //给长整型变量赋值超过int类型的取值范围,给赋值后面加上L或者l
需要注意的是,在为一个long类型的变量赋值时,所赋值的后面要加上字母L(或小写字母l),说明赋的值为long类型。如果赋的值未超出int类型的取值范围,则可以省略字母L(或小写字母l)。
2、浮点类型变量
浮点类型变量用于存储小数数值
表中取值范围中的E(也可写为小写字母e)表示以10为底的指数,E后面的“ + ”和“ - ”代表正指数和负指数。例如,1.4E-45表示1.4×10的负45次方。
小数会被默认为double 类型的值,因此在为一个float类型的变量赋值时,在所赋值的后面一定要加上字母F(或者小写字母 f ),而为double类型的变量赋值时,可以在所赋值的后面加上字母D(或小写字母d),也可以不加。示例:
//定义单精度类型变量
float f = 12.3f; //给单精度类型变量赋值,要在赋值后面加F或者f
float f1 = 100; // 也可以省略
//定义双精度类型变量
double d = 3.4d; //给双精度类型变量赋值,要在赋值后面加D或者d
double d1 = 3.50; // 也可以省略
也可以为一个浮点数类型变量赋予一个整数数值。示例:
float f = 100; // 声明一个float类型的变量并赋整数
double d = 100; // 声明一个double类型的变量并赋整数
3、字符串类型变量
字符串类型变量用char表示,用于储存单一字符。Java中每个char类型的字符变量都会占用2个字节。在给char类型的变量赋值时,需要用一对英文半角格式的单引号( ' ' )把字符括起来,如 ' a ' 。
ASCII。
Java使用的就是Unicode字符码系统Unicode中的小写字母a是用97表示的,在计算时,计算机会自动将字符转换为所对应的数值。
示例:
//定义字符类型变量
char ch = 'a'; // 为一个char类型的变量赋值字符a
char c = 97; // 为一个char类型的变量赋值整数97,相当于赋值字符a
4、布尔类型变量
在Java中 ,使用Boolean定义布尔类型变量,布尔类型变量只有 true 和 false 两个值,定义布尔类型变量如下:
boolean flag = false; //定义一个boolean类型的变量flag,初始值为flase
flag = true; //改变变量flag的值为true
三、类型转换
1、自动类型转换
自动类型转换也称为隐式类型转换,是指两种数据类型在转换的过程中不需要显式声明,由编译器自动完成。自动类型转换必须同时满足两个条件:一是两种数据类型彼此兼容;二是目标类型的取值范围大于源类型的取值范围。
byte b = 3;
int x = b;
上面的代码中,使用byte类型的变量b为int类型的变量x赋值,由于int类型的取值范围大于byte类型的取值范围,编译器在赋值过程中不会丢失数据,所以编译器能够自动完成这种转换,在编译时不报告任何错误。很多类型之间也可以进行自动类型转换。
public class Example02 {
public static void main(String[] args){
// 自动转换(隐形转换)
byte a = 10; //字节型
int b = a; //整型
float f = 12.5f; //单精度型
double d = a + b + f; //双精度型
System.out.println("变量b的值:" +b);
System.out.println("变量b的值:" +d);
}
}
- 整型类型之间可以实现转换。列如,byte类型的数据可以赋值给short 、int 、long类型的变量 ; short 、char 类型的数据可以赋值给int 、 long类型的变量 ;int类型变量的数据可以赋值给long类型的变量。
- 整数类型转换为float类型。例如,byte 、char 、short 、int类型的数据可以赋值给float类型的变量。
- 其他类型转换为double类型。列如,byte 、char 、short 、int 、long 、 float类型的数据可以赋值给double类型的变量。
2、强制类型转换
强制类型转换也称为显式类型转换,是指两种数据类型之间的转换需要进行显式声明。当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。
例子:(出现报错)
public class Example03 {
public static void main(String[] args){
int num = 298;
byte b = num; // 强制类型转换
System.out.println(b); //42 原因是当强制转换类型的值大于目标数据类型的取值范围,丢失数据精度
}
}
结果:
程序提示数据类型不兼容,不能将int类型转换成byte类型,原因是将一个int型的值赋给byte类型的变量b时,由于int类型的取值范围大于byte类型的取值范围,这样的赋值会导致数值溢出也就是说一个字节的变量无法存储4个字节的整数值。
- 针对以上情况。需要进行强制类型转换,即强制将int类型的赋值给byte类型的变量。强制类型转换
目标类型 变量 = (目标类型)值
- 将以上第四行代码修改为
byte b = (byte)num;
例子:(数据精度丢失)
修改代码为强制类型转换之后,程序可以正确编译运行。需要注意的是,在对变量进行强制类型转换时,如果将取值范围较大的数据类型强制转换为取值范围较小的数据类型,如将一个int类型的数转换为byte类型,极易造成数据精度丢失。
public class Example03 {
public static void main(String[] args){
int num = 298;
byte b = (byte) num; // 强制类型转换
System.out.println(b); //42 原因是当强制转换类型的值大于目标数据类型的取值范围,丢失数据精度
}
}
四、变量的作用域
变量在需要它的作用范围内才可以被使用,这个作业范围称为变量的作用域。在程序中,变量一定会被定义在某一括号中,该大括号所包含的代码区域便是这个变量的作业域。
例子:
public class Learn {
public static void main(String[] args) {
int x = 12; // 定义变量x
{
int y = 96; // 定义变量y
System.out.println("x is " + x); // 访问变量x
System.out.println("y is " + y); // 访问编写y
}
y = x; // 访问变量x ,为变量y赋值
System.out.println("x is " + x); // 访问变量x
}
}
结果是
因为y = x ;不在作用域里所以会报错,把此代码注释掉后就可以运行正确了。