日期:2014-05-20  浏览次数:20641 次

很诡异的一个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
难道是我错了吗?求解释。。。。
java

------解决方案--------------------
一个类中如果有静态代码块,先执行静态代码块。
------解决方案--------------------
你那个有点乱套. .看看改良之后的.


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) {