1.方法与字段
表明它为这个类的成员共有。
类加载器对static 字段/函数 的处理过程见下。
按照静态字段或函数的出现顺序依次初始化。所以下面的代码会报错。
java不能有静态抽象方法。
抽象类可以有静态方法,但不能有抽象静态方法。
百度知道有这么一个回答:
抽象类一定有抽象方法吗?我来说说吧,静态是属于字节码的;一个抽象类可以没有抽象方法,只是为了不让别人来实例化它; 以上两点可以说明,静态方法只要有字节码存在就可以运行,所以抽象类中可以有静态方法。 我再多说一嘴,静态和抽象不能共存与方法上,因为静态属于字节码,不需要对象就可以运行,而抽象方法没有方法体,运行没有意义,所以不能共存。
2.语句块
static后直接跟大括号。当第一次用到这个类时,里面的语句得到执行。
何为第一次?
答:使用 Class<?>[] java.lang.Class.getClasses()是不行的,即使用A.class.getClassLoader()不能执行到A类的static{}块。
需要使用Class<?> java.lang.Class.forName(String className) 才可以。JDK中该函数的源码见下:
@CallerSensitive public static Class<?> forName(String className) throws ClassNotFoundException { return forName0(className, true, ClassLoader.getClassLoader(Reflection.getCallerClass())); }所以可以用这种方法避免延迟加载,例如程序启动时就初始化好DAO层的连接池等,避免业务第一次访问时才初始化,不让用户等。
个人觉得这是构造函数需要做的事情。而现在变成了没名字的语句块,囧。
3.内部类
static只能用在内部类上,详见:内部类。