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();
}
全局对象的创建优先于入口函数的执行。
你这个不是一个类,这个不是两个类吗?
因为在类ExplicitStaticEx 中拥有成员变量g1和g2;
那么当类加载器在装载ExplicitStaticEx类的时候,会装载refer到的Go类;
而类Go具有静态代码块,所以会优先执行静态代码块;
如果没有成员变量g1和g2,那么将在执行到Go.how()时才装载类Go,这时候才会执行静态代码块。
如果有帮助,希望结帖。
static Go g1 = new Go();和static Go g2 = new Go();先运行吧;static是加载类的时候就加载运行的,而main只是类执行的一个入口。
s2 & s3 initialized
Go()
Go()
Inside main()
run or drive car or fly plane
Go.s1: run
对于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方法)
静态变量先加载,然后执行main
静态变量先加载,然后执行main
你这个问题是错误的,执行和加载是两个概念,加载进来的意思是把方法或变量已经放到内存里了,处于可以调用的状态,但如果没有对象或类名去调用的话,这些加载进来的静态方法是不会自己执行的,执行的意思是系统从上到下开始一行一行的把代码跑起来,加载仅仅是把他们放入内存中,只有加载并调用才能让程序跑起来