什么是变量?
变量就是在程序执行的过程中,在某个范围内其值可以发生改变的量。
java层面:
1、你想要定义变量,得有个限定条件,如何限定呢?
数据类型
2、将来我们参与运算的时候,不能直接拿内存中的空间去参与运算。应该给这个空间起个名字。
变量名
3、仅仅只拿到这个空间,但是里面没有值,这样也是不能够参与运算的,我们得先赋值,才能参与运算。
初始化值
变量的定义格式:
1. 数据类型 变量名=初始化值;(格式是固定的,记住格式,以不变应万变。)
2.数据类型 变量名;
变量名 = 初始化值;
推荐使用上面的定义变量格式
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间。
数据类型的分类:
数值类型的表数范围:
| 类型 | 占用储存空间 | 表数范围 | |
|
整数 类型 |
byte(字节变量) | 1字节 | -2^7~2^7-1//-128~127 |
| short(短整型) | 2字节 | -2^15~2^15-1 | |
| int(整型) | 4字节 | -2^31~2^31-1 | |
| long(长整型) | 8字节 | -2^63~2^63-1 | |
|
浮点 类型 |
float(单精度浮点型) | 4字节 | -3.403*10^38~3.403*10^38(特殊) |
| double(双精度浮点型) | 8字节 | -1.798*10^308~1.798*10^308(特殊) | |
|
字符 类型 |
char | 2字节 | |
|
布尔 类型 |
boolean | 1字节 |
原理:
例如
byte型:1byte=8bit
| byte | |||||||
| 8bit | |||||||
其中每个bit有两个值0和1,而且第一位是符号位(不参与运算) ,所以范围是-2^7~2^7-1
注意:
1.定义long类型的变量时,末尾要加上L或者l
推荐使用L
2.整数默认类型:int
小数默认类型:double
3.定义float类型的变量,末尾要加上F或者f
推荐使用F
程序举例:
public classDataType{
public static void main(String[] args){
//定义变量的格式:数据类型 变量名=初始化值
//定义一个字节变量
byte b=10;
System.out.printIn(10);//输出整型常量10
System.out.printIn(b);//输出变量b的值为10
//定义一个短整型变量
short s=100;
System.out.printIn(s);
//定义一个整型变量
int i=1000;
System.out.printIn(i);
//定义一个长整型变量
long l=1000000000000000000000L;
System.out.printIn(l);
//定义一个单精度浮点型变量
float f = 12.34F;
System.out.println(f);
//定义一个双精度浮点型变量
double d = 12.34;
System.out.println(d);
//定义一个字符类型变量
char c1 = \'a\';
char c2 = \'b\';
char c3 = \'0\';
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
//定义一个布尔类型变量
boolean b1 = true;
boolean b2 = false;
System.out.println(b1);
System.out.println(b2);
}
}
数值型精度排序(由小到大):byte<short<int<long<float<double
使用变量注意事项:
1.作用域:变量定义在哪一级的大括号内,哪个大括号的范围就是这个变量的作用域。
相同的作用域内不能定义两个同名变量。
2.若方法内部变量没有赋予初始化值,则不能直接使用(输出)。你只需要在使用之前赋值就可以了,不一定非要在定义的时候给。
3.每一行上建议只定义一个变量。
+ 在Java中是一个运算符,用于数据的加法。
一般来说,我们在运算的时候,要求参与运算的数据类型要保持一致
基本数据类型之间存在默认转换和强制转换。
boolean类型不能转换为其他数据类型
默认转换与强转换
默认转换(由小到大)
byte,short,char➡int➡long➡float➡double
byte,short,char互相之间不转换,他们参与运算首先转化为int类型。
强制转换
目标类型 变量名=(目标类型)(被转换的数据),,如果被转换的数据是一个变量(不是表达式)的时候可以不加括号。
例如:
int i=1000;
byte b=10;
// byte c = i+b;
byte c =(byte)(i+b);
口诀:
byte,short,char一律自动转换为int
小的用大的接收不用强转
大的用小的接收需要强转
强制类型转换的原理
如图因为位数不够,计算机在做加法之前会先把byte a 补全
之后会进行相加
加完之后红框内的数据会被计算机截掉
所以说强制类型转换有精度损失
1、思考题:
1) 请问以下的代码有没有问题
double d=12.34; √
float f=d; × double➡float需要强制转换
2)看程序说明有没有问题
float f1=(float)12,34; √ f1是通过double类型强制转换到float
float f2=12,34F; √ f2是本身就是float类型
2、面试题
byte b1=3,b2=4,b;
b=b1+b2; ×
b=3+4;
那一句编译失败?为什么?
**变量相加,首先看类型问题,最终把结果的赋值也会去考虑类型问题。
**常量之间相加,首先会做加法运算,然后看这个结果是不是在接收数据类型的范围内,如果在,就直接赋值,不会报错。
因为byte,short,char相互之间不转换,他们参与运算首先转化为int类型。
b=b1+b2; × ➡ b=(byte)(b1+b2); √
3、思考题
byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
有问题,因为byte的精度范围是-128~127。
可以进行强转,我们知道计算机通过二进制补码进行运算。
整数默认是int类型,占4个字节
00000000 00000000 00000000 10000010 这就是130的原码、反码和补码。
强制类型转换(做截取操作)
10000010(补码)
已知补码求原码
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
因为最高位是符号位不参与运算,所以把原码1111110换算成十进制。
64 + 32 + 16 + 8 + 4 + 2 = 126 ➡ -126