• Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序


      1 //据说这是一道阿里巴巴面试题,先以这道题为例分析下
      2 public class Text {
      3     public static int k = 0;
      4     public static Text t1 = new Text("t1");
      5     public static Text t2 = new Text("t2");
      6     public static int i = print("i");
      7     public static int n = 99;
      8     public int j = print("j");
      9 
     10     {
     11         print("构造块");
     12     }
     13     static {
     14         print("静态块");
     15     }
     16 
     17     public Text(String str) {
     18         System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
     19         ++i;
     20         ++n;
     21     }
     22 
     23     public static int print(String str) {
     24         System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
     25         ++n;
     26         return ++i;
     27     }
     28 
     29     public static void main(String args[]) {
     30         Text t = new Text("init");
     31     }
     32 }
     33 
     34 //执行结果
     35 1:j   i=0    n=0
     36 2:构造块   i=1    n=1
     37 3:t1   i=2    n=2
     38 4:j   i=3    n=3
     39 5:构造块   i=4    n=4
     40 6:t2   i=5    n=5
     41 7:i   i=6    n=6
     42 8:静态块   i=7    n=99
     43 9:j   i=8    n=100
     44 10:构造块   i=9    n=101
     45 11:init   i=10    n=102
     46 
     47 结果分析:
     48 实例化Text,执行顺序如下
     49 --public static int k = 0;无任何打印结果
     50 
     51 --public static Text t1 = new Text("t1");给t1赋值new Text("t1"),每次实例化对象都会依次加载非静态变量,代码块(在构造函数前面加载),构造函数,
     52 public int j = print("j");
     53 //打印1:j   i=0    n=0  此时i和n都还没赋值,初始值为0,k先自增再赋值后等于1
     54 {
     55         print("构造块");
     56     }
     57 //打印 2:构造块   i=1    n=1 第一次打印后i和n的值都为1
     58 public Text(String str) {
     59         System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
     60         ++i;
     61         ++n;
     62     }
     63 //打印3:t1   i=2    n=2 
     64 //执行构造函数
     65 
     66 --public static Text t2 = new Text("t2");
     67 逻辑同上,实例化加载非静态变量,代码块(在构造函数前面加载),构造函数
     68 //打印4:j   i=3    n=3
     69 //打印5:构造块   i=4    n=4
     70 //打印6:t2   i=5    n=5
     71 
     72 --public static int i = print("i");
     73 //打印7:i   i=6    n=6
     74 
     75 --public static int n = 99;
     76 //n赋值为99
     77 
     78 -- static {
     79         print("静态块");
     80     }   
     81 //执行完j静态变量执行静态代码块
     82 //打印8:静态块   i=7    n=99
     83 
     84 --public int j = print("j"); //非静态变量
     85 //打印9:j   i=8    n=100
     86 
     87 --{
     88         print("构造块");
     89     }
     90 //打印10:构造块   i=9    n=101
     91 
     92 --public Text(String str) {
     93         System.out.println((++k) + ":" + str + "   i=" + i + "    n=" + n);
     94         ++i;
     95         ++n;
     96     } 
     97 //最后才执行main方法里面实例化调用的构造函数
     98 //打印11:init   i=10    n=102
     99 
    100 //总结:在不存在继承关系的情况下,
    101 //代码执行顺序:静态变量-静态代码块-非静态变量-构造块-构造函数

    存在继承关系的后面找时间在补上

  • 相关阅读:
    非常好用的JS滚动代码
    在vs中使用ZedGraph
    通用SQL分页过程
    使用 Request.QueryString 接受参数时,跟编码有关的一些问题
    一个验证Email 的Javascript 函数
    DOS 下将文件名列表写入文件
    .NET 开发人员应该下载的十个必备工具
    中文全文搜索(一)
    关于<![if IE]>
    Lucene 全文索引心得
  • 原文地址:https://www.cnblogs.com/suruozhong/p/6045361.html
Copyright © 2020-2023  润新知