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

1. 静态初始化块

  静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值。

2. (非静态)初始化块

  (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值。

3. 构造方法

  构造方法在每次生成实例对象时都执行一次

4. 执行顺序:静态初始化块 ——> 初始化块 ——> 构造方法

测试代码如下:

 1 public class Son extends Father {
 2     static int sNum = 0;
 3     int num = 0;
 4     public static void main(String[] args){
 5         System.out.println("-----");
 6         new Father();
 7         System.out.println("-----");
 8         new Son();
 9         System.out.println("-----");
10         System.out.println("sNum = " + sNum);
11     }
12
13     public Son() {
14         System.out.println("Son构造方法");
15     }
16
17     static {
18         //num = 1;    //报错:无法为非静态变量赋值
19         sNum = 1;
20         System.out.println("Son静态初始化器");
21     }
22
23     {
24         System.out.println("Son初始化块");
25     }
26
27 }
28
29 class Father {
30     {
31         System.out.println("Father初始化块");
32     }
33
34     public Father() {
35         System.out.println("Father构造方法");
36     }
37
38     static {
39         System.out.println("Father静态初始化器");
40     }
41 }

测试结果如下:

总结:

  1. 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行;
  2. 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;
  3. 非静态始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试;
  4. 静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码
  5. 非静态初始化块可以针对多个重载构造函数进行代码复用

只执行一次,即类首次加载时。

原文地址:https://www.cnblogs.com/veonwang/p/9389938.html

时间: 2024-09-30 00:06:49

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

java中类的静态代码块、构造代码块、构造方法、静态成员的初始化顺序详解

一.描述 java中类的静态代码块.构造代码块.构造方法.静态成员的初始化顺序: 首先,在类加载时,为类中的静态成员变量分配内存空间,并为其赋予默认值(整数型为0,浮点型为0.0,布尔型为false,字符型为'\u0000',引用型为null): 其次,执行静态成员变量的显式初始化操作.静态成员的初始化方法有两种,其一为在声明的时候直接初始化,其二为使用静态代码块进行初始化, 这两种初始化方式会按照在类中的出现顺序来执行,而且只在类加载的时候执行一次. 再次,如果创建了类的对象,便会在堆中为类的

2.24 Java基础总结 ①访问权限②static③静态方法④实例初始化块⑤静态初始化块

①访问权限②static③静态方法④实例初始化块⑤静态初始化块一.访问权限 默认是同包protected是有关系的,即同包和不同包的子类private只有本类,public全部   本类   同包 不同包       子类 非子类 子类 非子类 private √         默认(同包) √ √ √     protected √ √ √ √   public √ √ √ √ √ 二.static静态成员变量,类级别,全类共享一个Person.country = "中国":一般用

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

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

面试趣闻之java 代码块 静态代码块 构造方法 执行顺序

初级程序员总会遇到这样的问题,代码块 静态代码块 构造方法 执行顺序 父类 public class ClassSup { public ClassSup(){ System.out.println("父类构造器"); } static { System.out.println("父类静态代码块"); } { System.out.println("父类代码块"); } public void mathod01(){ System.out.pri

Java之static静态代码块

Java之static静态代码块 构造代码块 使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域 public class HelloA { /** ... */ { System.out.println("I'm A construct code block"); } } 构造函数代码块 构造函数代码块指的是构造函数中所包含的代码,类似className(){}中的代码块 public class H

关于静态块、静态属性、构造块、构造方法的执行顺序

总结: 1.类加载时,执行静态代码块和初始化静态变量.执行顺序跟代码顺序一致. 2.类实例化时,初始化变量.执行代码块.执行构造.其中初始化变量和代码块的顺序跟代码顺序一致.执行构造是在最后. 3.实例化子类时,会先调用父类的构造方法.调用构造方法之前,会先执行该类的代码块. 4.类只会加载一次. 5.静态变量或静态方法中如果调用构造,可以把构造当做一个普通方法来看.但会先执行一遍代码块. 下面是在网上找到的比较典型的例子,以此来说明 例一: class A { static { System.

java中的静态代码块,构造代码块,构造函数,普通代码块

java中的静态代码块,构造代码块,构造函数,普通代码块 静态代码块: 格式: public class Test1{ static{ System.out.println("这是一个静态代码块");  } } 说明: 1.静态代码块在类加载时也就是项目启动时运行并且只运行一次相当于main函数,有多个静态代码块从上往下依次执行,他是一种主动运行的机制. 2.静态代码块不能存在于任何方法中 构造代码块 格式: public class Test2{ { System.out.print

静态块、main方法、构造块、构造方法的执行顺序

在牛客网做题,遇到关于静态块.main方法.构造块.构造方法的执行顺序的问题,添加该随笔记之. 题目是写出如下java代码执行后所打印的顺序: 1 public class B 2 { 3 public static B t1 = new B(); 4 public static B t2 = new B(); 5 { 6 System.out.println("构造块"); 7 } 8 static 9 { 10 System.out.println("静态块")

Java Object 构造方法的执行顺序

Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象 2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用 3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块. 类初始化时构造方法执行顺序 对于某一个子类时: (1)初始化对象的存储空

Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法.   Class ThisClass{ } 默认隐式添加无参的构造方法,相当于 Class ThisClass{ public ThisClass(){ } } 2.构造方法的执行顺序.     (1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法. public ThisClass(){ } 默认隐式添加父类无参构造方法,相当于