静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序

Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下: 
static { 
静态语句代码块 
}


非静态语句代码块 

 
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。 
不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数)。

 1 public class Test_Static_Class {
 2     //静态代码块
 3     static {
 4
 5        System.out.println("静态代码块");
 6    }
 7    {
 8        System.out.println("普通代码块1");
 9    }
10
11    public   Test_Static_Class() {
12        System.out.println("执行了构造方法");
13 }
14    //普通的成员方法
15    public void test() {
16        System.out.println("在方法中的普通代码块");
17        //普通的代码块
18        {
19            System.out.println("普通代码块");
20        }
21
22 }
23    public static void main(String[] args) {
24     System.out.println("执行了主方法");
25     System.out.println("--------------------");
26     new Test_Static_Class();
27     System.out.println("------第二次创建对象---------------");
28     new Test_Static_Class();
29     System.out.println("------第三次创建对象---------------");
30     new Test_Static_Class().test();
31 }
32
33    {
34        System.out.println("普通代码块2");
35    }
36 }  

多次创建对象,静态代码块只执行一次,且最先执行。

接下来执行的是非静态语句代码块(即:普通代码块) ,会每创建一个对象执行一次,且多个非静态语句代码块会由上到下的执行。

在接下来执行的是构造方法,构造方法也是每创建一个对象就会执行一次。

在接下来就是调用普通的方法中的代码块,执行的顺序,在方法中没有什么特殊的。

对于静态属性,与静态代码块一样,也是在类加载时就会被自动执行,属于整个类的属性。

静态方法只能访问静态属性,一定不能访问非静态属性,但是注意这种说法的与我们通过对象来访问该静态属性,就是 对象名.非静态属性变量名, 这种方式就是我们通常在main方法中的一种访问方式。 这种访问的方式是可以的,但不能直接非静态属性变量名或静态属性方法。

对于静态方法中也不能直接使用this对象。

静态代码块是属于类的,在JVM加载类时就自动执行。静态代码块定义时不能添加作用域符。

时间: 2024-12-16 22:55:13

静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序的相关文章

静态块、非静态块(方发体)以及构造方法的执行顺序

/*类的成员变量会在类加载时先默认初始化,方法体和代码块局部变量必须指定初始值.否则不可访问          *  方法局部变量  代码块局部变量  能用代码块局部变量就用代码块          *            *  赋值优先级大于构造方法.          *          *          * 运行的优先级是 静态块(从上到下按顺序执行,且在类加载的时候就会执行)          * 父类静态块->本类静态块->父类非静态块->父类构造->父类非静态块

静态代码块、非静态代码块、构造方法的执行顺序

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的.结构如下: static { 静态语句代码块 } { 非静态语句代码块 } 异同点 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋     值. 不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造方法).     静态代码块只在第一次new执行一次,之后不在执行,而非静态

静态代码块&非静态代码块&构造函数

总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数. 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值. 不同点:静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法). 静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每

区分同步代码块、静态同步方法、非静态同步方法的锁

同步代码块.静态同步方法.非静态同步方法的锁分别是: 同步代码块可以使用自定义的Object对象,也可以使用this或者当前类的字节码文件(类名.class): 静态同步方法的锁是当前类的字节码文件(类名.class): 非静态同步方法的锁是this: 证明方法: 两个线程之间实现同步,一个线程使用同步代码块,一个线程使用同步方法. 如果这两个线程同步了,说明了使用的是同一个锁: 创建线程类(以售票为例) /** * @methodDesc 售票线程类 */ public class Threa

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

java synchronized静态同步方法与非静态同步方法,同步语句块

摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间.而且可以选择要获取哪个对象的对象锁.但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同

Java:初始化块、静态初始化块、构造方法的执行顺序

1. 静态初始化块 静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值. 2. (非静态)初始化块 (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值. 3. 构造方法 构造方法在每次生成实例对象时都执行一次 4. 执行顺序:静态初始化块 --> 初始化块 --> 构造方法 测试代码如下: 1 public class Son extends Father { 2 static int sNum = 0; 3 int num =

关于静态变量和非静态变量的区别

关于静态变量和非静态变量的区别 静态变量:被static修饰的变量,加载类的时候被创建,不随对象的创建而改变,静态变量位于方法区,类消失对应的变量消失. 非静态变量:不被static修饰的变量,每创建一次对象,就会为变量分配一次内存,存放在堆内存中,对象消失对应的变量消失. JAVA中初始化的顺序: 加载类: 静态变量初始化 静态代码块:[其只能调度静态的,不能调度非静态的] 成员变量 构造代码块 构造方法 普通代码块 原文地址:https://www.cnblogs.com/wangwswan

Java显示的静态初始化和非静态实例初始化

静态初始化只执行一次,实例初始化每次创建实例都会执行. 1.创建一个Spoon类: package com.samsung.wx; public class Spoon { static { System.out.println("显示的静态初始化"); } { System.out.println("非静态实例初始化"); } public void f1(int i) { System.out.println(i); } } 2.测试代码: package co