Java之static,自增自减以及静态快构造块问题 javastatic 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Java类和对象初始化顺序:1.加载父类,初始化其静态成员;2.加载类,初始化其静态成员;3.初始化父类实例成员,调用其构造方法;4.初始化类实例成员,调用其构造方法;按照上面的顺序:1.先初始化静态成员k = 0;t1 = new Test1("t1"); t2 = new Test1("t2");i = print("i"); int n = 99;,所以应该是先k=0,2.接着初始化t1,t1的初始化是调用构造方法,所以先初始化对象,而初始化对象就像上面的说明先初始化实例成员j和代码块print("构造块");,此时k=0;++k后k=1,i和n的初始值都为0,因此初始化j的时候打印"1:j i=0 n=0",接着++i;++n;后i和n的值都为1,初始化代码块print("构造块")的时候打印"2:构造块 i=1 n=1";后面的静态成员和实例成员的初始化跟上面步骤1,2类似,自己推导一下就能得到结果; 这不就是阿里的题目吗?初始化的顺序是楼上说的,要注意的一点就是在初始化t1的时候,静态成员变量k,t2,i,n以及静态块在t中已经存在了,所以直接按顺序初始话成员变量和普通块,就是先输出j,然后构造块,然后就是初始化t2跟t1类似,然后初始化i,n,静态块,J,普通块,构造函数。plus:你在每一个语句设置一个断点,一步一步单步跟踪你就晓得执行顺序了 如上代码不变,main函数中新增加一个实例 public static void main(String[] args) { Test20140331 t = new Test20140331("init"); Test20140331 t2 = new Test20140331("init2"); }/** * * 1 程序从main函数开始执行 ,执行main函数,需要先加载class文件 * 2 加载class文件的同时,同时初始化static成员变量和static块,执行顺序为从上到下依次执行 * 3 加载class完成之后,初始化成员变量。注:普通代码块,可以看作成员变量,执行顺序为从上到下依次执行 * 4 上面的过程完成之后,再从main函数的第一条语句开始执行。 * 5 注:静态成员变量和静态代码块只会 在加载class文件的时候 执行一次 *//** * public static Test20140331 t1 = new Test20140331("t1"); * 1> 1:j i=0 n=0 * 2> 2:构造块 i=1 n=1 * 3> 3:t1 i=2 n=2 * * public static Test20140331 t2 = new Test20140331("t2"); * 4> 4:j i=3 n=3 * 5> 5:构造块 i=4 n=4 * 6> 6:t2 i=5 n=5 * * public static int i = print("i"); * 7> 7:i i=6 n=6 * * public static int n = 99; * 8> n=99 * * static { print("静态块"); } * 9> 8:静态块 i=7 n=99 * * Test20140331 t = new Test20140331("init"); * 10> 9:j i=8 n=100 * 11> 10:构造块 i=9 n=101 * 12> 11:init i=10 n=102 * * * Test20140331 t = new Test20140331("init2"); * 13> 12:j i=11 n=103 * 14> 13:构造块 i=12 n=104 * 15> 14:init2 i=13 n=105 * */ //主函数贴错了,应该是下面的这个 public static void main(String[] args) { Test1 t = new Test1("init"); Test1 t2 = new Test1("init2"); }6楼分析了一下整个过程,如果有什么问题,还请各位指正,共同进步 java初级求高手翻译下下图的伪代码(java语言) 一个令人苦恼的问题? 前景问题 如何看JAVA JDK的帮助文档 我做了一个 socket服务器,基于noi的,,但是我想做压力测试,不知道怎么写? 在设置自定义标签里面设置标签属性第一个字母不能是大写吗? 如何调用"getXXX()"该字符窜所代表的方法 一个入门的问题? Stack类问题 ***急救*** 请问我该怎么走我的'主线'和'支线'? InputStream的read()为什么是抽象的 java初学者编写代码时遇到一个小问题!求大神指导!!!
1.加载父类,初始化其静态成员;
2.加载类,初始化其静态成员;
3.初始化父类实例成员,调用其构造方法;
4.初始化类实例成员,调用其构造方法;按照上面的顺序:
1.先初始化静态成员k = 0;t1 = new Test1("t1"); t2 = new Test1("t2");i = print("i"); int n = 99;,所以应该是先k=0,
2.接着初始化t1,t1的初始化是调用构造方法,所以先初始化对象,而初始化对象就像上面的说明先初始化实例成员j和代码块print("构造块");,此时k=0;++k后k=1,i和n的初始值都为0,因此初始化j的时候打印"1:j i=0 n=0",接着++i;++n;后i和n的值都为1,初始化代码块print("构造块")的时候打印"2:构造块 i=1 n=1";后面的静态成员和实例成员的初始化跟上面步骤1,2类似,自己推导一下就能得到结果;
初始化的顺序是楼上说的,要注意的一点就是在初始化t1的时候,静态成员变量k,t2,i,n以及静态块在t中已经存在了,所以直接按顺序初始话成员变量和普通块,就是先输出j,然后构造块,然后就是初始化t2跟t1类似,然后初始化i,n,静态块,J,普通块,构造函数。
plus:你在每一个语句设置一个断点,一步一步单步跟踪你就晓得执行顺序了
Test20140331 t = new Test20140331("init");
Test20140331 t2 = new Test20140331("init2");
}/**
*
* 1 程序从main函数开始执行 ,执行main函数,需要先加载class文件
* 2 加载class文件的同时,同时初始化static成员变量和static块,执行顺序为从上到下依次执行
* 3 加载class完成之后,初始化成员变量。注:普通代码块,可以看作成员变量,执行顺序为从上到下依次执行
* 4 上面的过程完成之后,再从main函数的第一条语句开始执行。
* 5 注:静态成员变量和静态代码块只会 在加载class文件的时候 执行一次
*//**
* public static Test20140331 t1 = new Test20140331("t1");
* 1> 1:j i=0 n=0
* 2> 2:构造块 i=1 n=1
* 3> 3:t1 i=2 n=2
*
* public static Test20140331 t2 = new Test20140331("t2");
* 4> 4:j i=3 n=3
* 5> 5:构造块 i=4 n=4
* 6> 6:t2 i=5 n=5
*
* public static int i = print("i");
* 7> 7:i i=6 n=6
*
* public static int n = 99;
* 8> n=99
*
* static {
print("静态块");
}
* 9> 8:静态块 i=7 n=99
*
* Test20140331 t = new Test20140331("init");
* 10> 9:j i=8 n=100
* 11> 10:构造块 i=9 n=101
* 12> 11:init i=10 n=102
*
* * Test20140331 t = new Test20140331("init2");
* 13> 12:j i=11 n=103
* 14> 13:构造块 i=12 n=104
* 15> 14:init2 i=13 n=105
*
*/
Test1 t = new Test1("init");
Test1 t2 = new Test1("init2");
}6楼分析了一下整个过程,如果有什么问题,还请各位指正,共同进步