静态的,修饰符,在一个类中每个对象都具有相同的属性值时,可以把这个成员变量加上一个static修饰符,这样该成员变量值就被所有对象共享。比如定义一个女生类,类中含有sex属性,显然,每个调用该类的对象的性别都是女,即每个对象的sex属性值都相同,所以就对sex赋一次值,每个对象调用时sex的值相同,除非重新赋值。
特点:
静态修饰的成员变量被所有对象共享,只有一份。
静态内存分析:
静态的成员变量存放在方法区里面的静态区。在加载class文件时.class文件区对于静态成员变量存放的是她在静态区的地址,非静态成员变量存放在class文件区即有了默认的初始值,在new一个对象时,把class内容(成员变量和方法)复制一份放在堆区,静态变量复制过去的也是他的地址。在给对象赋值时,即在堆区的对象的变量赋值,该值存在于堆区。而对象在使用静态变量时,根据堆中存放的地址,找到静态区中的静态变量,对其进行赋值。当创建第二个对象对该静态变量进行使用时,同样是根据地址找到静态区中的静态变量,此时该变量已经有了第一个对象对其赋的值,所以第二个对象在使用时得到的还是第一个对象赋值,这样就不用多次赋值了。如果第二个对象对该变量重新赋值了,那么静态区中该变量的值发生改变,再次访问此变量时就是改变后的值。即便是使用该变量的对象是在重新赋值之前已经创建好的,在她访问该变量时还是按照访问时的值进行使用。
即针对static修饰的成员,class文件中和堆内存中保存的都是静态标记(地址),该静态成员变量真正的值在静态区。静态区中存储的有静态变量也有静态方法(比如main方法)。
静态方法的调用方式与非静态变量的调用方式不同,静态成员变量由于其值是被所有对象共享的,所以他不属于某一个对象,它属于整个类共有的,因而调用该静态变量时可以直接使用类名.变量名,而非静态变量调用时需要创建对象,通过对象名.变量名。
注意:
1.在静态方法内不能访问非静态成员(变量和方法),因为静态成员是随着类的加载而加载的,当静态成员加载的时候还没有产生对象,非静态成员必须是通过对象才能调用,所以在静态成员中加入非静态的成员就会出错。即在静态方法中不能使用this关键字。
2.在非静态方法中可以访问静态变量和方法。
3.静态变量的利与弊:利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份,可以直接用类调用。
弊:生命周期过长,访问有局限性,只能访问静态成员。
静态变量和非静态变量的区别:
1. 存放位置:静态变量随着类的加载存放于方法区中,非静态变量随着对象的创建存在于堆内存中。
2. 生命周期:静态变量的生命周期最长,随着类的加载而加载。随着类的消失而消失。非静态变量随着对象的消失而消失。