在Java中,静态变量
和实例变量
可以统称为成员变量。
- 静态变量也叫做类变量,独立于方法之外的变量,有static修饰。
- 实例变量同样独立也是独立于方法之外 的变量,但没有static修饰。
static int a; // 静态变量
int b; // 实例变量
一、深入理解静态变量和实例变量值的分配变化
public class StaticTest {
private static int staticInt = 1;//静态变量
private int random = 1;//实例变量
public StaticTest() {
staticInt++;
random++;
System.out.println("staticInt = " + staticInt + " random = " + random);
}
public static void main(String[] args) {
StaticTest test = new StaticTest();
StaticTest test2 = new StaticTest();
}
}
输出:
干货详解:
- 实例变量属于某个对象的属性,
必须创建了实例对象,其中的实例变量才会被分配空间
,才能使用这个实例变量。结合上述给出的例子。每创建一个实例对象,就会分配一个random,实例对象之间的random是互不影响的
,所以就可以解释为什么输出的两个random值是相同的了。 - 静态变量不属于某个实例对象,而是属于整个类。
只要程序加载了类的字节码,不用创建任何实例对象,静态变量就回被分配空间,静态变量就可以被使用了
。结合上述给出的例子,无论创建多少个实例对象,永远都只分配一个staticInt 变量,并且每创建一个实例对象,staticInt就会加一
。
总之,实例变量必须创建对象后,才可以通过这个对象来使用;静态变量则可以直接使用类名来引用(如果实例对象存在,也可以通过实例对象来引用)。
其实,这也可以解释,为什么static修饰的方法不用在实例对象创建后,可以调用。而没有static修饰的方法必须要与对象关联在一起,必须创建一个对象后,才可以在该对象上进行方法调用。
二、成员变量可以在类体中声明同时进行赋值,如 静态变量:static int a=1; 实例变量:int b=1;
如:不会报错
public class 静态变量的赋值 {
static int a = 1; // 静态变量
int b = 1; // 实例变量
public static void main(String[] args) {
}
}
三、成员变量不能在类体中先声明(定义)后赋值。但静态变量可以先在类体中声明,然后在方法中赋值(当然实例变量是不行的)
可以发现在类体中先声明后赋值会报错;
但是静态变量可以在类体中声明,静态方法中赋值;实例变量不行
都可以先声明,再通过代码块赋值
代码块要先于构造函数执行
四、java中的全局变量是由public修饰的static成员变量,形如public static int ID;
java中的全局变量是放在静态方法区中的,所有的实例对象会共享同一份全局变量。所以一旦对某个类实例化后对其中的全局变量做出修改,那么其他的实例其中的全局变量值也相应的会被修改。
4.1 Java中非静态方法是可以调用静态方法与变量
public class GlobalVariable {
public static int id;
public static int name;
public static int getId() {
return id;
}
// public static void setId(int id) { //
public void setId(int id) { // 非静态方法也可以给静态变量赋值
GlobalVariable.id = id;
}
public static int getName() {
return name;
}
public static void setName(int name) {
GlobalVariable.name = name;
}
public static void main(String[] args) {
GlobalVariable test1 = new GlobalVariable();
GlobalVariable test2 = new GlobalVariable();
test1.setId(1);
System.out.println(test1.getId()); // 不赋值,int类型的默认为0
System.out.println(test2.getId());
}
}
输出: