class code { public code(){ System.out.println("hello"); } } public class Test { static { System.out.println("静态代码块"); } static code code=new code(); { System.out.println("非静态代码块"); } code code1=new code(); public static void main(String[] args) { Test test=new Test(); System.out.println("main方法"); } }
1:执行代码会首先加载本类的资源,所以静态代码块和静态成员变量会比main方法先执行。
2:非静态代码块和非静态成员变量需要通过Test对象来使用,执行顺序跟位置有关。
-----------------------------------------------------------------------------------------------------------------------------------
子类父类代码执行:
class code { public code(String str){ System.out.println(str+"-hello"); } } class ParentClass{ static { System.out.println("父类中的静态代码块"); } static code code=new code("static父类"); { System.out.println("父类中的非静态代码块"); } code code1=new code("非静态父类"); code co; public ParentClass(){ System.out.println("父类的构造方法"); this.co=new code("父类"); } } class SubClasses extends ParentClass{ static { System.out.println("子类中的静态代码块"); } static code code=new code("static子类"); { System.out.println("子类中的非静态代码块"); } code code1=new code("非静态子类"); code co; public SubClasses(){ System.out.println("子类的构造方法"); this.co=new code("子类"); } } public class Test{ public static void main(String[] args) { SubClasses subClasses=new SubClasses(); } }
代码分析:
1:实例化了一个subClasses对象,会先加载ParentClass,因为SubClasses构造方法默认调用supr,所以会先加载ParentClass类的静态代码块和静态成员变量,然后加载SubClasses类的静态代码块和静态成员变量。
2:SubClasses类加载完后,会先创建ParentClass对象然后创建SubClasses对象,所以会先加载ParentClass类的非静态代码块和非静态成员变量,然后加载SubClasses类的非静态代码块和非静态成员变量。
3:在java中子类的构造方法会默认调用父类的构造方法,所以先执行ParentClass的构造方法,而后执行SubClasses的构造方法。
萌新勿喷!!!