静态代码块,构造代码块和构造函数的区别

1.执行顺序:静态代码块>构造代码块>构造方法

    理由:静态代码块(static {} )在类加载的时候执行一次。
               构造代码块({}内的部分)在每次创建对象时执行,始终在构造方法前执行。
               构造方法在新建对象时调用( 就是新的时候 )。
    注意:一个静态代码块在类加载的时候就执行,所以的它优先级高于入口main()的方法。
                湾当三种形式不止一次出现,同优先级是按照先后顺序执行。
2.现在来看下有继承时的情况:

[java] view plain copy
public class HelloB extends HelloA {  
//<span style="white-space:pre;">   </span>static HelloB hB = new HelloB();  
     public HelloB(){  
         System.out.println("B的构造方法");  
     }  
     {  
         System.out.println("B的构造代码块");  
     }  
//   public static HelloB hB = new HelloB();  
     static{  
         System.out.println("B的静态代码块");  
     }  
//     public static HelloB hB = new HelloB();  
     public static void main(String[] args){  
         new HelloB();//调用B的构造方法  
     }  
}  
   
class HelloA{  
     public HelloA(){  
         System.out.println("A的构造方法");  
     }  
     {  
         System.out.println("A的构造代码块");  
     }  
     static{  
         System.out.println("A的静态代码块");  
     }  
}
输出结果为:


A的静态代码块
B的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法

可以看出:
        一个。父类始终先调用(继承先调用父类),并且这三者之间的相对顺序始终保持不变 
        静态湾因为代码块在类加载时执行,所以先输出的是父类和子类的静态代码块
        调用角乙构造的方法创建对象时,构造块状语从句:构造方法会一起按顺序执行,还是父类的先调用

以上看下来貌似没什么问题,但看接下来一道阿里笔试题:

[java] view plain copy
public class B  
{  
public static B t1 = new B();  
public static B t2 = new B();  
 {  
     System.out.println("构造块");  
       
 }  
 static  
 {  
     System.out.println("静态块");  
       
 }  
 public static B t1 = new B();  
   
 public static void main(String[] args)  
 {  
       
     B t =new B();   
       
 }  
}  
显示结果为:

构造块 构造块 静态块 构造块
为什么不是:

静态块  构造块 构造块  构造块

原因:
静态块:用静态申明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>主()>构造块>构造方法
因为静缘故T1,T2也上升到静态位,与静态块处于同一优先级,同一优先级就先取按顺序来构造对象,构造对象,静态块

public static HelloB hB = new HelloB();  
是在创建对象,创建对象执行构造块,输出---构造块

接下来还是

public static HelloB hB = new HelloB(); 

输出----构造块


接下来静态块,输出------静态块

接下来主中,创建对象,对象为非静态的,所以先静态块,再构造对象,由于静态块只在加载时执行一次,

所以接下来只输出---构造块

注:
第一段代码补充:如果在B的静态代码块之前加一句:
static HelloB hB = new HelloB();  
静态代码块会在其执行创建对象(执行构造块)完后再执行,结果如下:
A的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
B的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法

如果加在之后,则会先执行,说明优先级相同时是按照先后顺序执行的,结果如下:
A的静态代码块
B的静态代码块
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法
A的构造代码块
A的构造方法
B的构造代码块
B的构造方法


转载:https://blog.csdn.net/qq_39269985/article/details/80357929

posted @ 2019-12-06 10:10  彦博啊  阅读(787)  评论(0)    收藏  举报