1、static基本概念
static能够和属性、方法和内部类一起使用,表示是静态的。
类中的静态变量或者静态方法能够与“类名”一起使用,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的变量又称作“类变量”。这于实例变量不同,实例变量必须通过对象来访问,因为它们的值在对象和对象之间有所不同。
class StaticModifyer{
static int i=10;
int j;
staticModifyer(){
j=20;
}
}
public class Test{
public static void main(String args[]){
System.out.println("类变量 i= "+StaticModifyer.i);
StaticModifyer s=new StaticModifyer();
System.out.println("实例变量 j= "+s.i);
}
}
输出结果:
类变量 i=10;
实例变量 j=20;
2、static内存分配
在上面的例子中,无需创建类的对象即可访问静态变量i,之所以会产生这样的结果,是因为编译器只为整个类创建静态变量的副本,因为它可以通过类名进行访问。也就是说一个类中的一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量共享同一个内存空间。实例如下:
public class StaticRAMTest{
public static void main(Stirng args[]){
UserModel user1=newUserModel();
user1.userName="zhangsan";
user1.country="china";
UserModel user2=new UserModel();
user2.userName="张三";
user2.country="中国";
System.out.println("user1.userName==
"+user1.userName+“user1.country== ”+user1.country);
System.out.println("user2.userName==
"+user2.userName+“ user2.country ==”+user2.country);
}
}
class UserModel{
private static String userName;
private String country;
}
输出结果:
user1.userName==张三
user1.country== china
user2.userName==张三
user2.country== 中国
为什么userName会有一样的值呢,就是因为多个User实例中的静态变量userName共享同一个内存空间,
user1.userName和user2.userName指向同一个内存空间,任何一个对象改变此变量都会引起其他对象中该变量的改变,因此就得到了上面的结果。
小结:
(1)static的变量是在类被装载的时候就会被初始化,也就是说只要类被装载,不管你是否使用了这个static变量,它都会被初始化。
(2)类变量(用static修饰的变量),在类加载的时候,分配类变量的内存,以后再生成类的实例对象时,将共享这块内存,任何一个对象对该类变量进行修改,都会影响其他对象。
(3)外部可以通过两种方式访问类变量:通过实例对象来访问或通过类名来访问。
3、statci使用的基本原则
一、一个类的静态方法只能访问静态属性
二、一个类的静态方法不能够直接调用非静态方法
三、如果访问权限允许,static方法和属性可以使用类名加“.”来访问,当然也可以使用实例对象名加“.”来访问
四、静态方法中不存在当前对象,因而不能使用“this”,当然也不能使用“super”
五、静态方法不能被非静态方法覆盖(重写)
六、构造方法不能声明为static的
七、局部变量不能使用static修饰
注:非static变量只限于实例,并且只能通过实例引用被访问。
4、静态初始器--静态块
静态初始器是一个存在于类中方法外面的静态快。静态初始器仅仅在类装载的时候(第一次使用类时)执行一次。
静态初始器的目的:往往用来初始化静态的类属性。