一、变量
变量的作用
:保存数据
变量的本质
:内存的一块存储区域
变量的三要素
:数据类型、变量名、变量值
- 数据类型:决定内存大小,可以存什么值
- 变量名:如何访问这块存储区域
- 变量值:里面存储的数据
变量的声明和初始化
变量声明
·: 数据类型 变量名;
//例:
int i;
变量赋值
:变量名 = 变量值;
int i;
i = 5;
声明变量的同时赋值
int i = 5;
变量的使用
- 通过变量名来访问这块存储区域
- 变量必须先声明后使用,并且变量在使用之前必须有初始值
变量分类
1.变量的作用域
作用域: 从声明处开始,到它所属的'}'
结束
(1)同一个作用域中,一个变量声明一次
(2)同一个作用域变量不能重名
也就是说变量声明的位置决定了变量的作用域,而通过作用域对变量进行了细致分类
2.成员变量
- 成员变量的声明:在类内部,方法、内部类、代码块外部
- 成员变量有三种初始化方式:
1.显式赋值
2.代码块
3.构造方法
对于final修饰的成员变量来说,只要在使用之前进行初始化即可;
3.局部变量
- 局部变量就是在方法中的变量
- 局部变量在使用前必须显示初始化,否则使用报错;因为成员变量不像成员变量会赋予默认值;
- 局部变量不进行初始化,也没有使用,那么在编译的时候,直接抛弃;这也意味着根本就不会在栈帧中分配内存
public class test{
public static void main(String[] args){
int age;
}
}
这段代码编译后的字节码文件:
局部变量表只有args一个;这意味着age被直接抛弃了;
2.常量
- 常量:java中 final修饰的变量一旦赋值后不可以修改,这种不可变变量又叫做
- 字面量:1,“abc” , true 等这些值叫做字面量
(1)常量和字面量的运算在编译期间完成
byte b = 10 + 10
对于常量和字面量来说,编译期间就能确定值是多少,因此常量的运算在编译的时候就执行完了;
上面的代码中,变量b在编译成.class的时候直接存储的就是20,由于20在byte范围内,所以此代码不会报错
(2)变量的值只能在运行时获取
byte b1 = 10;
byte b = b1 + 10;//编译报错
变量是一个指向内存某一块空间的一个名字,所以他的值只有在运算的时候才能确定,编译的时候不知道变量值是多少;
由于变量b1和10进行运算,需要提升b1为int类型,因此左边byte类型不兼容,所以编译不通过