MECURY6688 2014-04-22 13:46 采纳率: 0%
浏览 2190

java初学者提问 在类中 用static成员变量实例化自身类 程序的执行顺序过程是怎样的?

class Demo03 {
public static void main(String[] args) {
A.show();
}
}
class A {
//构造方法
A(){
System.out.println("构造方法执行");
System.out.println(b);
System.out.println(c);
}

static A a=new A();                 
static int b=10;
int c=20;

//静态方法
public static void show(){
    System.out.println("静态方法执行");
    System.out.println(b);
} 

//静态代码块
static {
    System.out.println("静态代码块执行");
    System.out.println(b);      
}

//非静态代码块
{
System.out.println("非静态代码块执行");
System.out.println(b);
System.out.println(c);
}

//非静态方法
public void show2(){
    System.out.println("非静态方法执行");
    System.out.println(b);
    System.out.println(c);
}

}

程序执行结果是:
非静态代码块执行
0
20
构造方法执行
0
20
静态代码块执行
10
静态方法执行
10

不太理解为什么非静态代码块会先执行。
希望有前辈能告知一下这个程序的执行顺序过程 谢谢。

  • 写回答

1条回答

  • 晴天_SH 2014-04-23 04:50
    关注

    第一次运行时运行类时,类首先加载到内存,先完成类的初始化,在方法区为为静态的成员分配内存空间,包括静态Field和静态的初始化块,接下来在堆内存中为实例的Field分配内存空间,对实例的Field进行隐式初始化,之后显式初始化,在接下来运行非静态的初始化块,最后调用构造器进行初始化创建相应的对象,注意这里的所有的初始化都是从根类父类再到当前类的,之后再次运行该类时,由于该类是停驻内存的,所以不用在初始化了直接调用构造器创建对象。还有不足之处,欢迎交流啊

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧