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类的构造代码块之所以没有执行是因为-----构造代码块在创建对象时才会执行,静态代码块,类初始化便执行,静态方法在调用时执行

posted @ 2018-06-10 21:23  andim  阅读(436)  评论(0编辑  收藏  举报