Java语言中普通代码块,静态代码块,构造代码块,构造方法的区别
1.普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
普通代码块的结构:
{ 普通代码块 }
2.静态代码块:
(1)静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
(2)如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
(3)注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量和实例方法,需要通过类的实例对象来访问。
静态代码块的结构:
static {
静态语句代码块
}
3.构造代码块:直接在类中定义且没有加static关键字的{}代码块称为构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
构造代码块的结构:
{ 构造代码块 }
4.构造方法:它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化(Java提供了为类的成员变量赋初值的专门方法)。
当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
1 /* 2 * 首先加载Demo类文件,执行Demo类中的static代码块;执行main函数中的new ClassB(),因为继承ClassA, 3 * 加载ClassA,执行ClassA中的static代码块->加载ClassB,执行ClassB中的static代码块; 4 * 执行classA的构造代码块->执行classA的构造函数->执行classB的构造代码块->执行classB的构造函数 5 */ 6 public class Demo { 7 /* 8 * 第二步(运行main函数),先运行父类中的函数(先运行父类中的静态代码块, 9 * 然后运行子类中的静态代码块,然后依次运行父类中的构造代码块和父类中的构造函数, 10 * 最后依次运行子类中的构造代码块和构造函数) 11 */ 12 public static class ClassA { 13 // 14 public ClassA() { 15 System.out.println("ClassA"); 16 } 17 // 18 static { 19 System.out.println("static A class"); 20 } 21 // 22 { 23 System.out.println("A class"); 24 } 25 } 26 //子类 27 public static class ClassB extends ClassA { 28 public ClassB() { 29 super(); 30 System.out.println("ClassB"); 31 } 32 // 33 static { 34 System.out.println("static B class"); 35 } 36 // 37 { 38 System.out.println("B class"); 39 } 40 // 41 public void print() { 42 System.out.println("B print"); 43 } 44 } 45 //第二步运行main函数 46 public static void main(String []args) { 47 new ClassB(); 48 } 49 //第一步运行Demo类中的静态代码块 50 static { 51 System.out.println("static Demo class"); 52 } 53 //Demo类中的构造代码块不运行 54 { 55 System.out.println("Demo class"); 56 } 57 58 }
结果为:
运行顺序为:
父类--静态代码块
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
注释:Demo类的构造代码块之所以没有执行是因为-----构造代码块在创建对象时才会执行,静态代码块,类初始化便执行,静态方法在调用时执行