java代码块
代码块分为静态代码块和普通代码块,接下来将从以下几个方面了解两种代码块:
-
同一个类中,该类无继承类(除开Object类),静态代码块和普通代码块以及本类构造函数的执行顺序
-
静态代码块比普通代码块先执行
-
public class CodeBlockDemo04 { public static void main(String[] args) { C c = new C(); } } class C { public C() { System.out.println("构造函数"); } // 普通代码块 { System.out.println("普通代码块"); } // 静态代码块 static { System.out.println("静态代码块"); } } /* 静态代码块 普通代码块 构造函数 */
-
-
同一个类中,该类除Object类外还有其他继承父类,静态代码块、
super()
、普通代码块三者的执行顺序-
执行顺序:子类静态代码块,super(), 普通代码块
-
public class CodeBlockDemo05 { public static void main(String[] args) { D c = new D(); } } class D extends D1{ public D() { // super() //隐式传递 System.out.println("构造函数"); } // 普通代码块 { System.out.println("普通代码块"); } // 静态代码块 static { System.out.println("静态代码块"); } } class D1 { public D1() { System.out.println("spuer()"); } } /* 静态代码块 spuer() 普通代码块 构造函数 */
-
-
同一个类中,有多个静态代码块和多个普通代码块的执行顺序
-
同一个类中,所有静态代码块都优于所有普通代码块先执行,同类代码块之间的执行顺序与定义顺序一致
-
public class CodeBlockDemo06 { public static void main(String[] args) { E e = new E(); } } class E { { System.out.println("普通代码块1"); } { System.out.println("普通代码块2"); } { System.out.println("普通代码块3"); } static { System.out.println("静态代码块1"); } static { System.out.println("静态代码块2"); } static { System.out.println("静态代码块3"); } public E() { System.out.println("构造函数"); } } /* 静态代码块1 静态代码块2 静态代码块3 普通代码块1 普通代码块2 普通代码块3 构造函数 */
-
-
子类和父类中,分别有静态代码块,普通代码块,它们的执行顺序
-
子类和父类,同类代码块始终是父类先执行,对于静态代码块,子类静态代码块比父类静态代码块后执行,比父类其他任意代码块先执行,其他代码块和构造函数就是按照子类父类加载顺序执行的
-
public class CodeBlockDemo07 { public static void main(String[] args) { F e = new F(); } } class F extends F1 { { System.out.println("子类普通代码块"); } static { System.out.println("子类静态代码块"); } public F() { System.out.println("子类构造函数"); } } class F1 { { System.out.println("父类普通代码块"); } static { System.out.println("父类静态代码块"); } public F1() { System.out.println("父类构造函数"); } } /* 父类静态代码块 子类静态代码块 父类普通代码块 父类构造函数 子类普通代码块 子类构造函数 */
-
-
一个类被多次new对象,静态代码块和普通代码块分别执行多少次
-
一个类被多次实例化,静态代码块只执行一次,因为静态代码块随类对象一起加载,而一个类在方法区只有一个类对象,不管该类被实例化多少次;而普通代码块和构造器的执行次数一致
-
public class CodeBlockDemo08 { public static void main(String[] args) { G e = new G(); G e1 = new G(); G e2 = new G(); } } class G { { System.out.println("普通代码块"); } static { System.out.println("静态代码块"); } public G() { System.out.println("构造函数"); } } /* 静态代码块 普通代码块 构造函数 普通代码块 构造函数 普通代码块 构造函数 */
-
-
静态代码块可以调用的类中的变量,普通代码块可以调用的类中的变量
-
静态代码块可以调用的方法和变量与静态方法调用原则一致,普通代码块与普通方法调用原则一致
-