变量:内存中的一块存储区域,该区域有自己的名称(变量名)及类型(数据类型),该区域中的数据可以在一定区域内不断变化并能重复使用。java是一种强类型语言,在一个变量申明是就决定了他能接受的数据类型。变量定义以后在所定义的{}内有效,变量能存储基本数据类型及各种引用数据类型。
申明变量格式:变量类型 变量名;
java中允许以变量类型 变量名1,变量名2;
但为了提高代码的阅读性,不建议这么做。
java中变量大体可分为成员变量和局部变量,其中局部变量又可分为:
1.形参:在方法签名中定义为局部变量,有方法方法调用着为期赋值,随方法结束而消亡。
2.方法内的局部变量:在方法内定义的局部变量,必须在方法内对其进行显式初始化,这种类型的局部变量从初始化完成开始生效,随方法结束而消亡。
3.代码块内的局部变量:在代码块内定义的局部变量,必须在在代码块内对其显式初始化,随初始化完成而生效,随代码块结合而消亡。
局部变量作用时间很短,都被存储在方法的栈内存中。
申明一个局部变量时,如果变量的类型为基本数据类型,那么变量名和数据都存储在栈内存中,如果变量类型为引用数据类型,那么栈内存中存储的将是变量名及一个指向堆内存的内存地址,真正的数据储存在堆内存中。
当申明的局部变量的代码块结束时,该局部变量就会消失,该变量所占据的内存空间自动释放,引用数据类型在堆内存中所引用的数据不会随着代码块的结束而释放,而是等待垃圾回收器来处理,若该数据还被其他的变量引用,则不会被清除。
成员变量又可分为静态成员变量(类成员)和非静态成员变量(实例成员):
1.类成员:用Static修饰的成员变量,随类的加载而加载并实例化。
2.实例成员:没有Static修饰的成员变量,随对象的实例化而加载并实例化。
成员变量若没有显式初始化,在会首先进行默认初始化。不能在方法体内对已经初始化的成员变量直接赋值。
可在构造方法及构造代码块内对成员变量赋值。
成员变量被储存在堆内存中,类成员被储存在静态区,随类的加载而加载,类成员随对象的实例化而初始化,当实例失去引用后,就等待垃圾回收来处理。
实例化对象时首先对成员变量经行初始化,然后调用构造代码块对成员变量赋值,最后调用构造方法对成员变量赋值。而类成员在有实例化对象之前只能被静态代码块赋值。
public class VarDemo {
static int i ;
public VarDemo(int i){
this.i=i;
}
//static {i=10;}
public static void main(String[] args) {
System.out.println(VarDemo.i);//0//取消静态构造代码块后,打印10
System.out.println(new VarDemo(5).i);//5
}
}
成员变量的默认初始化:
byte、short、int、long默认初始化值为0;
double、float默认初始化值为0.0;
char默认初始化值为’\u0000’;
boolean 默认初始化值为false;
引用型数据类型默认出事化值为null;
java中定义成员变量没有先后顺序,但必须保证合法的向前引用。
class Demo{
long l = i+9;//编译时会报错,而将i定义在l之前则不会报错,将i用static修饰也不会报错,因为此时i会在类加载是加载,而l在实例化时加载,但l和i同时用static就会报错
int i;
}
final修饰的成员变量不能被默认初始化,必须在声明时赋值,或在声明后在构造代码块,构造函数,静态代码块内为期赋初始值,static、final修饰的成员变量只能在声明是或静态代码块内为期赋初始值。