Java代码执行顺序-简单版
2008-03-11 18:08
417 查看
class Yao...{
public static void main(String[] args)...{
System.out.println("Yao想参加奥运会");
}
static American american = new American();
}
class American...{
American()...{
System.out.println("American不希望Yao参加奥运会");
}
}
执行结果:
American不希望Yao参加奥运会
Yao想参加奥运会
按照顺序执行的规则,结果应该是:
Yao想参加奥运会
American不希望Yao参加奥运会
才对啊?这个怎么回事??
ps:如果American american = new American();放在main里边,就是顺序执行了
解释:
程序在编译的时候对代码中所有的类,都会生成对应的.class文件.
程序在执行的时候会加载所有的.class文件(包括import导入的.class文件和extends继承来的父类.class文件)。
然后是进行优化,这个就是为什么有的时候第一次运行的时候会比较慢,以后的时候会很快.
当这一切都完成后,程序进行初始化工作,先初始化static成员(变量,对象or对象的引用),因为要保证所有的变量和引用在使用的时候都要初始化,当然先初始化static成员.
先初始化static成员是java实现这种保证的具体方法。
当然不是所有class中的static变量都在第一次被初始化,对于单独的class中的static变量或者是对象引用等到比如new 一个的时候才进行初始化
static初始化完成以后才进行构造器的初始化,用默认的或者是你自己覆盖的构造器.
在这个例子中因为Yao类中有一个static引用变量,所以先初始化static引用.
然而这是new一个American的class,而且这个class里面没有static成员,所以就调用构造器American(){}进行对american初始化
当这一切都进行结束后才进行main方法里面的输出,所以结果是...
ps:对于代码static American american = new American();
new American()错误:不能在方法体外直接定义堆内存,一定要有栈内存引用才可以(Syntax error on token "new", delete this token).
American american = new American()不错但有bug:american的引用是非静态的,所以在没有创建对象时是无法调用American类的构造方法的.
所以改为:static American american = new American();才可以println出"American不希望Yao参加奥运会".
再给个例子:
class shunxu...{
public static void main(String[] args)...{
int a = 1;
System.out.println("a = " + a + ";b = " + b);//报错:b cannot be resolved
int b = 2;
}
}
class shunxu2...{
static int a = 1;
public static void main(String[] args)...{
System.out.println("a = " + a + ";b = " + b);
}
static int b = 2;
}
相关文章推荐
- Java代码执行顺序-样例
- jsp中java代码、jsp代码、js代码执行的顺序
- java代码的执行顺序3
- java中代码执行顺序小结
- Java代码中代码块的执行顺序
- Java:类中代码的执行顺序
- Java代码执行顺序(初始化块-成员变量(static、fianl)-构造)
- java代码执行的顺序
- Java类代码执行顺序
- java中代码执行顺序(静态代码块、构造函数)
- java代码执行顺序
- JAVA代码执行顺序
- Java中创建对象时,初始化成员变量的代码的执行顺序
- java 中try catch finally 的具体执行顺序返回结果+代码测试
- 【自动化测试】java测试代码里面的执行顺序
- java创建对象时代码执行顺序探讨
- 在后台JAVA代码中执行打乱集合顺序的方法
- Java 普通代码块静态代码块执行顺序(实例讲解)
- 包含继承关系的Java程序执行顺序(代码实例)
- Java 初始化顺序,代码执行顺序