很诡异的一个java问题
public class MyHandle {
public static int k = 0;
public static int i = print("i");
public static int n = 99;
public MyHandle(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
++i;
System.out.println("MyHandle=======");
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
System.out.println("print=====");
return ++n;
}
public static void main(String[] args) {
System.out.println("=====zz");
}
}
我一直的理解是java代码是从入口函数main函数开始执行的,但是这里运行的结果是
1:i i=0 n=0
print=====
=====zz
难道是我错了吗?求解释。。。。
------解决方案-------------------- 一个类中如果有静态代码块,先执行静态代码块。
------解决方案-------------------- 你那个有点乱套. .看看改良之后的.
public class MyHandle {
public static String str = "静态变量";
public static int i =print("参数");
public MyHandle() {
System.out.println("构造方法");
}
public static int print(String str) {
System.out.println("静态方法"+":"+str);
System.out.println(i);
return 1;
}
public static void main(String[] args) {
System.out.println("Main方法");
}
}
顺序是 静态变量 -> 静态方法 -> main方法
------解决方案-------------------- 引用: Quote: 引用:
你那个有点乱套. .看看改良之后的.
public class MyHandle {
public static String str = "静态变量";
public static int i =print("参数");
public MyHandle() {
System.out.println("构造方法");
}
public static int print(String str) {
System.out.println("静态方法"+":"+str);
System.out.println(i);
return 1;
}
public static void main(String[] args) {
System.out.println("Main方法");
}
}
顺序是 静态变量 -> 静态方法 -> main方法
那么也就是说程序不一定先从main开始执行?
不应该这么理解吧. .
应该是虚拟机先初始化类...初始化的时候 静态的东西都放到内存里了. .所以就先被执行了. .
初始化之后. 发现类中有main方法. .才开始执行main方法
------解决方案-------------------- 顺序没有问题
先 对 static k 进行赋值 0;
然后对 static i 赋值,进入方法print("i");
此时 i还没值,所以初始值为0,n也还没有赋值,初始值为0
所以print("i");
运行之后的结果是
1:i i=0 n=0
print=====
print("i")的返回值是1,所以i = 1;
接着对 static n进行赋值,变成n = 99了。
接着进入main方法,打印
=====zz
public static void main(String[] args) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {