static 修饰的变量、方法、代码块 即静态变量、静态方法、静态代码块,又叫类变量、类方法。
在方法体内不允许static修饰任何变量(事实上方法体内允许用到的修饰符只有final)
相对于非静态变量 是只有在对象创建的时候才开始分配内存,
静态变量 在类加载的过程就完成了内存分配。因此也意味着执行顺序肯定先于构造函数。
(什么时候能够触发类的加载? )-----
0.main方法所在的类;
1.最常见的new;
2.Class.forName(String className);
3.通过ObjectInputStream的readObject方法反序列化得到的对象实例
4.直接调用类变量,如下类A
class A {
static String s = new String("ssss");
static B b = new B();
}
class B {
B() {
System.out.println("B init");
}
}
public class Test {
public static void main(String[] args) {
String s = A.s;
System.out.println(s);
}
}
输出:B init
ssss
静态方法可以直接通过类名调用。因此静态方法中不能有this,super;静态方法中不能调用非静态变量及非静态方法;静态方法必须实现而不能定义为abstract。
静态方法不能被重写,即没有多态
class Father {
public static void methodA() {
System.out.println("this is Father's method.");
}
}
public class Son extends Father {
public static void methodA() {
System.out.println("this is Son's method.");
}
public static void main(String [] args) {
Father son = new Son();
son.methodA(); // 这里父类的方法并没有被override
Son son2 = new Son();
son2.methodA();
}
}
输出:
this is Father's method.
this is Son's method.