一.静态变量,成员变量,局部变量
1)局部变量
方法或语句块内部定义的变量。
生命周期是从声明位置开始到方法或语句块执行完毕为止。
注:局部变量必须先声明,再赋值(初始化),才能被使用。
2)成员变量(实例变量)
方法外部、类的内部定义的变量。
从属于对象,生命周期伴随对象始终。
注:如果成员变量不进行初始化,它会自动初始化成该类型的默认初始值。
使用成员变量,还需要先创建这个类的对象。
public class TestStatic {
int a=4;
public void test() {
System.out.println(a); //不会报错
}
}
因为在类内部的时候默认为this,也就是本对象。但是如果你在该类中的main方法中的话,只是一个程序的入口,不代表该类,你要使用该类还是得new。在该类的static方法中的话也是,需要先new出实例化对象。
使用成员变量,还需要先创建这个类的对象,在其他类中也一样。
public class TestStatic {
int a=4;
public static void test() {
TestStatic tt = new TestStatic();
System.out.println(tt.a); //4
}
}
class Test2{
public void test1() {
TestStatic tt = new TestStatic();
System.out.println(tt.a); //4
}
}
3)静态变量(类变量)
使用static关键字定义。
从属于类,生命周期伴随类始终,从类加载到卸载。
public class TestStatic {
static int a=4;
public static void test() {
System.out.println(a); //在本类中可以直接调用,不用实例这个类的对象。
}
}
class Test2{
public void test2() {
System.out.println(TestStatic.a); //在其他类中使用的话可以通过 类.变量名的方式直接调用,不用实例那个类的对象。
}
}
二.成员变量的静态和静态在内存中的区别
成员变量有静态和非静态。
一:局部变量:每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法的成员变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量的生命周期决定于方法
其中当局部变量可以是基本类型的变量,也可以是引用类型的变量,
(1)当声明是基本类型的变量的时,其变量的名称和数值是放在方法栈中
(2)当声明的是引用变量时,所声明的变量(引用:地址)是放在方法的栈中,该变量所指向的对象是放在堆类存中的
二:成员变量,放在堆中的,同样成员变量既可是基本类型的变量 也可是引用类型的变量
(1)当声明的是基本类型的变量其变量名及数值是时放在堆类存中的。
(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象
三:静态成员变量是共享数据,在共享区中,也叫方法区中。
非静态成员变量在堆内存中。
四:局部变量如果是基础类型,则在栈上,如果是引用类型,则引用被存在栈上,引用指向的对象是在堆上的。局部变量定义在方法中,方法结束内存释放。
五:静态成员变量存储于方法区中,在类定义的时候已经被装载和分配,所以在实例化对象之前,就可以被调用。