public class Test{
public Test() {
num1++;
}
public static int num1;
static {
num1 += 3;
System.out.println("num1 was initailized");
}
public static void main(String[] args) {
System.out.println(Test.num1);
Test test = new Test();
System.out.println(test.num1);
System.out.println(Test2.num2);
}
}
class Test2{
public static final int num2 = 0;
static {
System.out.println("num2 was initailized");
}
}
结果打印什么,为什么?
10 个解决方案
#1
num1 was initailized
3
4
num2 was initailized
0
3
4
num2 was initailized
0
#2
num1 was initailized
3
4
0
3
4
0
#3
num1 was initailized
3
4
0
3
4
0
#4
结果:
num1 was initailized
3
4
0
解释:
1.调用MAIN方法会引起MAIN方法所在类的初始化方法(<clinit>)的调用.
2.访问public static final 变量不会引起类的初始化方法(<clinit>)的调用.
num1 was initailized
3
4
0
解释:
1.调用MAIN方法会引起MAIN方法所在类的初始化方法(<clinit>)的调用.
2.访问public static final 变量不会引起类的初始化方法(<clinit>)的调用.
#5
楼上正解。对未初始化的变量,java默认将其初始化为0.所以num1的初始值未0.然后在调用前执行初始化块,所以System.out.println(Test.num1);输出为3.之后产生Test对象,num1为static,所以System.out.println(test.num1);输出为4.至于后一个输出就不用说了吧。
#6
System.out.println(Test.num1);
//结果:num1 was initailized 3
/**
原因:
Test第一次被装载,运行static初始化
1.num1 为3
2.打印
*/
Test test = new Test();
System.out.println(test.num1);
//结果:4
/**
原因:Test被装载,并且num1 static 的,且为3,又在构造方法里 ++ 所以为4
*/
System.out.println(Test2.num2);
//结果num2 was initailized 0
/**
原因:Test2第一次装载,运行 static 初始,
1.打印
*/
#7
目前只有一位说出原因的
#8
num1 was initailized
3
4
0
加载public类时同时加载其static代码块中的内容
num1置为3
num1 was initailized 被输出
System.out.println(Test3.num1); 自然输出3
然后你new Test,调用Test()构造方法,num1变为4
System.out.println(test.num1); 输出4
System.out.println(Test2.num2);输出0
3
4
0
加载public类时同时加载其static代码块中的内容
num1置为3
num1 was initailized 被输出
System.out.println(Test3.num1); 自然输出3
然后你new Test,调用Test()构造方法,num1变为4
System.out.println(test.num1); 输出4
System.out.println(Test2.num2);输出0
#9
也学习了。
4楼的正解。
这里确实突出了2点:
1.public static void main,执行这个的时候,哪怕里面什么都不写,也会初期化当前对象的静态成员和static程序块。6楼的这一点解释就不对了,并不是在执行"System.out.println(Test.num1); "的时候。
对于这一点,我理解main也是一个static函数吧,那么调用这个static函数,就需要先初始化这个对象的静态成员和static程序块。
2.final的变量调用,不需要初始化static块,如果去掉final,那么就会初始化static块了。
对于这一点,我觉得是主要是java优化了一些东西吧。因为final的是不会再static中变化的,所以不必初始化static中的,而如果非final的,那么static中可能会对其进行再赋值,就省略不得。
4楼的正解。
这里确实突出了2点:
1.public static void main,执行这个的时候,哪怕里面什么都不写,也会初期化当前对象的静态成员和static程序块。6楼的这一点解释就不对了,并不是在执行"System.out.println(Test.num1); "的时候。
对于这一点,我理解main也是一个static函数吧,那么调用这个static函数,就需要先初始化这个对象的静态成员和static程序块。
2.final的变量调用,不需要初始化static块,如果去掉final,那么就会初始化static块了。
对于这一点,我觉得是主要是java优化了一些东西吧。因为final的是不会再static中变化的,所以不必初始化static中的,而如果非final的,那么static中可能会对其进行再赋值,就省略不得。
#10
public static void main() 本来就是静态的了
#1
num1 was initailized
3
4
num2 was initailized
0
3
4
num2 was initailized
0
#2
num1 was initailized
3
4
0
3
4
0
#3
num1 was initailized
3
4
0
3
4
0
#4
结果:
num1 was initailized
3
4
0
解释:
1.调用MAIN方法会引起MAIN方法所在类的初始化方法(<clinit>)的调用.
2.访问public static final 变量不会引起类的初始化方法(<clinit>)的调用.
num1 was initailized
3
4
0
解释:
1.调用MAIN方法会引起MAIN方法所在类的初始化方法(<clinit>)的调用.
2.访问public static final 变量不会引起类的初始化方法(<clinit>)的调用.
#5
楼上正解。对未初始化的变量,java默认将其初始化为0.所以num1的初始值未0.然后在调用前执行初始化块,所以System.out.println(Test.num1);输出为3.之后产生Test对象,num1为static,所以System.out.println(test.num1);输出为4.至于后一个输出就不用说了吧。
#6
System.out.println(Test.num1);
//结果:num1 was initailized 3
/**
原因:
Test第一次被装载,运行static初始化
1.num1 为3
2.打印
*/
Test test = new Test();
System.out.println(test.num1);
//结果:4
/**
原因:Test被装载,并且num1 static 的,且为3,又在构造方法里 ++ 所以为4
*/
System.out.println(Test2.num2);
//结果num2 was initailized 0
/**
原因:Test2第一次装载,运行 static 初始,
1.打印
*/
#7
目前只有一位说出原因的
#8
num1 was initailized
3
4
0
加载public类时同时加载其static代码块中的内容
num1置为3
num1 was initailized 被输出
System.out.println(Test3.num1); 自然输出3
然后你new Test,调用Test()构造方法,num1变为4
System.out.println(test.num1); 输出4
System.out.println(Test2.num2);输出0
3
4
0
加载public类时同时加载其static代码块中的内容
num1置为3
num1 was initailized 被输出
System.out.println(Test3.num1); 自然输出3
然后你new Test,调用Test()构造方法,num1变为4
System.out.println(test.num1); 输出4
System.out.println(Test2.num2);输出0
#9
也学习了。
4楼的正解。
这里确实突出了2点:
1.public static void main,执行这个的时候,哪怕里面什么都不写,也会初期化当前对象的静态成员和static程序块。6楼的这一点解释就不对了,并不是在执行"System.out.println(Test.num1); "的时候。
对于这一点,我理解main也是一个static函数吧,那么调用这个static函数,就需要先初始化这个对象的静态成员和static程序块。
2.final的变量调用,不需要初始化static块,如果去掉final,那么就会初始化static块了。
对于这一点,我觉得是主要是java优化了一些东西吧。因为final的是不会再static中变化的,所以不必初始化static中的,而如果非final的,那么static中可能会对其进行再赋值,就省略不得。
4楼的正解。
这里确实突出了2点:
1.public static void main,执行这个的时候,哪怕里面什么都不写,也会初期化当前对象的静态成员和static程序块。6楼的这一点解释就不对了,并不是在执行"System.out.println(Test.num1); "的时候。
对于这一点,我理解main也是一个static函数吧,那么调用这个static函数,就需要先初始化这个对象的静态成员和static程序块。
2.final的变量调用,不需要初始化static块,如果去掉final,那么就会初始化static块了。
对于这一点,我觉得是主要是java优化了一些东西吧。因为final的是不会再static中变化的,所以不必初始化static中的,而如果非final的,那么static中可能会对其进行再赋值,就省略不得。
#10
public static void main() 本来就是静态的了