构造代码块
随着对象的加载而加载,创建对象的时候执行
1、构造代码块在创建对象时被调用,每次创建对象都会调用一次
2、构造代码块优先于构造函数执行,同时构造代码块的运行依赖于构造函数
3、构造代码块在类中定义
静态代码块
静态块:用static申明,JVM加载类时执行,仅执行一次
静态代码随着类的加载而加载,
调用类的时候执行,
不需要实例化类就能被加载.
常用来执行类属性的初始化,
不能访问普通变量
- class AA {
- //随着对象的加载而加载,创建对象的时候执行
- //1、构造代码块在创建对象时被调用,每次创建对象都会调用一次
- //2、构造代码块优先于构造函数执行,同时构造代码块的运行依赖于构造函数
- //3、构造代码块在类中定义
- {
- System.out.println("构造代码块");
- }
- //静态代码随着类的加载而加载,
- // 调用类的时候执行,
- // 不需要实例化类就能被加载.
- // 常用来执行类属性的初始化,
- //不能访问普通变量
- static {
- System.out.println("静态代码");
- }
-
- public static void main(String[] args) {
- System.out.println("main");
-
- AA aa = new AA();//把这个注释掉,构造代码块就不会执行
- }
- }
执行顺序为:静态代码块-----main------构造代码块
将new AA();注销则构造代码块不会执行。
这样的情况 首先会执行静态类,然后创建实例化对象,执行构造代码块
- class AA {
- //这样的情况 首先会执行静态类,然后创建实例化对象,执行构造代码块
- static public AA a = new AA();
- {
- System.out.println("构造代码块,再执行静态代码");
- }
- static {
- System.out.println("静态代码");
- }
-
- public static void main(String[] args) {
- System.out.println("main");
-
- AA aa = new AA();
- }
- }
- 输出:
-
- 构造代码块,再执行静态代码
- 静态代码
- main
- 构造代码块,再执行静态代码
1. 有继承的先执行基类
2. 静态类实例化早于静态代码块
3. 静态类实例化,后续接着执行构造代码块和构造函数
3. 静态代码块只执行一次
4. 静态代码块执行早于main函数
5. 子类实例化的时候,执行基类初始化
-
- /**
- * @运行结果:
- * A的构造代码块
- * A的构造方法
- * A的静态代码块
- * A的构造代码块
- * A的构造方法
- * A的构造代码块
- * A的构造方法
- * B的构造代码块
- * B的构造函数
- * B的静态代码块
- * main
- * A的构造代码块
- * A的构造方法
- * A的构造代码块
- * A的构造方法
- * B的构造代码块
- * B的构造函数
- */
- class ClassA{
- public static ClassA classA = new ClassA();//1 静态基类实例化对象,运行基类,输出(A的构造代码块,A的构造方法)
- {
- System.out.println("A的构造代码块");//生成classA对象时执行
- }
- static {
- System.out.println("A的静态代码块");//2.输出A的静态代码块,只执行一次
- }
- public ClassA(){
- System.out.println("A的构造方法");//生成ClassA对象时执行
- }
- }
-
- class ClassB extends ClassA{
- public ClassA classA = new ClassA();//生成ClassB对象时执行,输出(A的构造代码块,A的构造方法)
- public static ClassB classB = new ClassB();//3. 静态子类实例化对象,要牵扯到基类。输出(基类的:A的构造代码块,A的构造方法,生成ClassB对象时执行的:A的构造代码块,A的构造方法,后续执行:B的构造代码块,B的构造函数)
- {
- System.out.println("B的构造代码块");
- }
- static {
- System.out.println("B的静态代码块");// 4. B的静态代码块,只执行一次
- }
- public ClassB(){
- System.out.println("B的构造函数");
- }
-
- public static void main(String[] args) {
- System.out.println("main");//5 输出main
- new ClassB();//6 输出输出(基类的:A的构造代码块,A的构造方法,生成ClassB对象时执行的:A的构造代码块,A的构造方法,后续执行:B的构造代码块,B的构造函数
- }
- }