Java类初步化时若干模块顺序
Java类初始化时若干模块顺序
参考文章:
Java类的初始化顺序
Java中变量的初始化
Java类有两种成员变量,一是没有static修饰的,叫做实例变量,另外一种有static修饰的,叫做类变量或者静态变量。
对于静态变量,静态初始化块,实例变量,构造代码块,构造器,初始化时这几个模块的顺序就是静态变量,静态初始化块,实例变量,构造代码块,构造器。
class Teacher { public static String name = "t1"; public int age = 24; static { System.out.println(name); System.out.println("static code block"); } { System.out.println(age); System.out.println("initial code block"); } public Teacher() { System.out.println("contructor"); } }
测试main方法:
public static void main(String[] args) { new Teacher(); System.out.println(); new Teacher(); }
执行结果:
t1 static code block 24 initial code block contructor 24 initial code block contructor
当涉及父类的操作时,子类和父类的模块初始化顺序如下:
父类—静态变量
父类—静态初始化块
子类—静态变量
子类—静态初始化块
父类—实例变量
父类—构造代码块
父类—构造器
子类—实例变量
子类—构造代码块
子类—构造器
另外,假如父类在构造方法中引用的某个方法在子类中进行了重写,那由于在子类的构造方法中要先调用父类的构造方法,此时父类的构造方法只根据方法名调用将调用到子类的重写后的该方法。
class Super { public Super() { service(); } public void service() { System.out.println("super service method"); } } class Sub extends Super { public Sub() { service(); super.service(); } public void service() { System.out.println("sub service method"); } }
new Sub();执行后的结果:
sub service method sub service method super service method
按照先执行父类的构造方法,可以看出父类构造方法中调用的方法是子类的,而它本身的方法没有发生变化。
对于类的成员变量,如果程序初始化时没有显式地赋值,JVM都会为其赋默认值
boolean false char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d String null 对象 null
另外再说一些关于成员变量和局部变量:
成员变量可以被public protect private static修饰符修饰,而局部变量不能被控制修饰符和static修饰,但两者都可以定义为final类型。成员变量存储在堆,局部变量存储在栈。