2 zyf4005 zyf4005 于 2016.04.27 14:11 提问

java只有一个类,main和static 变量谁先运行?请各位指点。谢谢!
import static net.mindview.util.Print.*;

class Go {
    static String s1 = "run";
    static String s2, s3;
    static {
        s2 = "drive car";
        s3 = "fly plane";
        print("s2 & s3 initialized");
    }
    static void how() {
       print(s1 + " or " + s2 + " or " + s3);
    }
   Go() { print("Go()"); }  
}

public class ExplicitStaticEx {
public static void main(String[] args) //main函数先运行还是static Go g1 = new Go();和static Go g2 = new Go();先运行?
{                                                       
    print("Inside main()");
    Go.how();
    print("Go.s1: " + Go.s1);       
}
static Go g1 = new Go();
static Go g2 = new Go();
 }

7个回答

esetup
esetup   2016.04.27 14:21
已采纳

全局对象的创建优先于入口函数的执行。

zyf4005
zyf4005 一语中的,谢谢
一年多之前 回复
cumtasd
cumtasd   2016.04.27 14:38

s2 & s3 initialized
Go()
Go()
Inside main()
run or drive car or fly plane
Go.s1: run

zyf4005
zyf4005 谢谢
一年多之前 回复
Mo_Fang_
Mo_Fang_   2016.04.27 14:25

static Go g1 = new Go();和static Go g2 = new Go();先运行吧;static是加载类的时候就加载运行的,而main只是类执行的一个入口。

zyf4005
zyf4005 谢谢
一年多之前 回复
cumtasd
cumtasd   2016.04.27 14:48

对于ExplicitStaticEx 类来说,g1和g2是静态成员变量,
使用一个类之前需要先对这个类进行加载,
类加载时会执行静态成员变量的赋值和静态代码块里的内容(执行的先后顺序与代码顺序有关)
所以会先执行static Go g1 = new Go();和static Go g2 = new Go();
而使用Go这个类也是需要先加载的,
因此会先执行Go类里的
static String s1 = "run";
static String s2, s3;
static {
s2 = "drive car";
s3 = "fly plane";
print("s2 & s3 initialized");
}
然后再执行new Go() 两次,即 g1 = new Go()和 g2 = new Go()
最后执行ExplicitStaticEx里的main方法,(在eclipse里run ExplicitStaticEx这个类就是调用它的main方法)

zyf4005
zyf4005 你回到的很详细,谢谢
一年多之前 回复
qq_24334403
qq_24334403   2016.04.27 15:37

静态变量先加载,然后执行main

qq_24334403
qq_24334403   2016.04.27 15:37

静态变量先加载,然后执行main

w172087242
w172087242   Ds   Rxr 2016.04.27 14:21

你这个不是一个类,这个不是两个类吗?

因为在类ExplicitStaticEx 中拥有成员变量g1和g2;
那么当类加载器在装载ExplicitStaticEx类的时候,会装载refer到的Go类;
而类Go具有静态代码块,所以会优先执行静态代码块;
如果没有成员变量g1和g2,那么将在执行到Go.how()时才装载类Go,这时候才会执行静态代码块。

如果有帮助,希望结帖。

zyf4005
zyf4005 谢谢
一年多之前 回复
u013865953
u013865953 你好
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!