static关键字主要有两种作用: 为某特定数据类型或对象分配单一的存储空间,而与创建的对象无关; 实现某个方法或属性与类而不是对象关联在一起, 也就是在不用创建对象的情况下就可以通过类来直接调用方法或使用类的属性.
1). static成员变量: 静态变量属于类,在内存中只有一个复制(只在类被创建时在内存中创建一次),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态变量的引用有两种方式,分别是“类.静态变量"和”对象.静态变量", 静态变量被所有的对象共享; 实例变量属于对象,只有对象被创建后,实例变量才会被分配内存空间,才能被使用,它在内存中存在多个复制,只有用“对象.实例变量”的方式来引用。
2).static成员方法:Java中提供了static方法和非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用; static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。
3).static代码块: static代码块在类中是独立于成员变量和成员函数的代码块的。注意:这些static代码块只会被执行一次, 在JVM加载类时会执行static代码块, 如果有多个static代码块, JVM按按顺序来执行.
4). static内部类: static内部类是指被声明为static的内部类, 它可以不依赖于外部类实例对象而被实例化, 而通常的内部类需要在外部实例化后才能实例化.
5). static与final结合使用: 对于变量,若使用static final修饰,表示一旦赋值不能修改,并且通过类名可以访问, 对于方法,若使用static final修饰,表示该方法不可被覆盖,并且可以通过类名直接访问。