static可用来修饰nested class,method,field,static block,在jdk5后,还有static import(用import static 将其他类或包中的static member引入到当前类中,就像是当前类本身的member一样使用它们).
通用的规则是,你想在所有objects间共享数据了,那就可以做成static的。
static像其他java关键字一样可用于method,nested class,member variable。但不可以修饰top level class 。
static variable属于整个类而属于某个object。类只是一个“蓝本”(blueprint),object才是instance!static variable 和 non-static variable区别在:static variable属于整个类,所有对象共享它;而non-static属于object!当多线程编程时,对static variable要用synchronized同步!为了避免麻烦,不建议在multi-thread时使用static variable!
static variable由于是在编译是“静态绑定”,所以比non-static 运行时绑定,要faster。
static variable 在类加载的时候初始化,而instance variable 是在创建instance的时候。
static method也属于类,所以不需要创建类的实例对象,只用类名就可以调用它。
在static method中不可以引用non-static variable 。否则会编译错误。
static method不可以被override!因为它属于class而不是object!当子类父类中有同样的方法时,调用的方法会是对象所在的类中声明的那个方法。
public static void main(String[] args) {
Father f = new Father();
Son s = new Son();
f.f();
s.f();
}
class Father{
static void f(){
System.out.println("inside super static");
}
}
class Son extends Father{
static void f(){
System.out.println("inside sub static");
}
}
output:
inside super static
inside sub static
static block,当类被加载的时候,执行static block中的代码,注意,如果在static block中抛出异常的话,会报java.lang.NoClassDefFoundError 异常,因为加载类失败了!
Best Practice
1,将static的variable搞成static final的,使之成为一个常量,避免在任何地方修改它!如果要改变static final的值,比如在 enum String pattern, 需要重新编译所有用到这个变量的类,因为static final variable会cached到client side。
2,不要使用static 和 non-static 同步方法去保护共享的数据,因为它们的lock不一样,这意味着它们可以并发执行。see more here Java Mistake 2 - Mixing non static and static method in Java
3,
什么是静态内部类?
nested static class 是top level class 的一个static member。要创建内部类的实例,需要外部类的实例对象,但要创建静态内部类的实例,就不需要任何外部类的实例!
public class StaticClass{
public static void main(String args[]){
StaticClass.NestedStaticClass ns = new StaticClass.NestedStaticClass();
System.out.println(ns.getDescription());
}
static class NestedStaticClass{
public String NestedStaticDescription =" Example of Nested Static Class in Java";
public String getDescription(){
return NestedStaticDescription;
}
}
}
Output:
Example of Nested Static Class in Java
什么时候使用静态内部类?
将类做成static的,是为了作成单一资源(唯一的),并在所有对象间共享它。一般被所有组件共享的工具类及自身没有状态的,适合使用静态内部类。面试中常问,when to use Singleton vs Static Class in Java ,如果自身无状态,并且在给定的数据上工作,那就用nested static class,否则用 Singleton pattern较好。
什么时候使用静态方法
1),当方法不需要依赖对象的状态,也即member field,只需要传入参数即可时,此时,不需要实例对象,用类名直接调用方法即可。
2),需要global access时