我这样给你说吧。在java中成员变量有两种就是你上边所说的静态变量和实例常量
他们最主要的区别就在于静态变量是被static修饰的而实例常量则没有用static修饰
还有静态变量在内存中只有一个。在jvm加载类的时候就为static修饰的静态变量分配了对应的内存,可以被类的所有实例共享,它是可以直接通过类名直接去访问的。它的生命周期主要是取决于类的生命周期的
而实例常量是完全依靠于类的实例的,当类每一次类实例化的时候,jvm就会给会给每一个实例分配对应 的内存 ,它是出于堆内存中的,与静态变量有所不同的就是,它的生命周期是依靠于实例的生命周期的。
下边这几个例子是我自己写的可以帮助你理解
public class Test{
int x=2;//这个就是实例常量不加static修饰
public static void main(String args[]){
int x=1;//出于方法内部定义的变量叫做局部变量,它的应用范围局限于本方法内部。
System.out.println(x);//这个时候你打印出来的是方法内部定义的局部变量
//如果你想取到上边定义的实例常量的话,就需要通过类的实例去引用了
Test t =new Test();//为Test创建实例,实例名为t
System.out.println(t.x);//通过类的实例引用就可以得到类里边的实例常量了,这也就是实例常量的生命周期取决于类的实例周期的原因了
}
}
上边是关于实例常量的一个小例子,下边是关于静态变量的例子
public class Test{
static int x=2;//只要在原有的基础上加static就是静态变量了
public static void main(String args[]){
System.out.println(x);//在没有定义局部变量之前我输出x的值这个时候的值就是上边定义的静态变量的值
int x=1;//出于方法内部定义的变量叫做局部变量,它的应用范围局限于本方法内部。
System.out.println(x);//这个时候你打印出来的是方法内部定义的局部变量
System.out.println(Text.x)//在定义局部变量之后如果想用静态变量的话可以直接通过类名引用。当然也可以通过实例
}
}
通过上边的例子,我相信能帮助你更好的理解 了,最后我再说一点就是static修饰的变量属于一个公共变量,就像我在上边所说的它的生命周期取决于类的生命周期,也就是无论是这个类的那个实例改变了它的值,那么其他实例的值也会随之改变,而实例常量则不会
在写一个简单的例子
public class Test{
static int x=1;
int y=0;
public static void main(String args[]){
Test t=new Test();
t.x=3;
t.y=2;
Test t1=new Test();
System.out.println(t.x);//结果是3
System.out.println(t.y);//结果是2
System.out.println(t1.x);//结果是3
System.out.println(t1.y);//结果是0
}
}
从上边的例子我想你应该明白了其中的原因了吧!
|