例子程序如下:1  public class Cat{
2    static private int sid = 0;
3    private string name;
4    int id;
5  
6    Cat(string name) {
7      this.name = name;
8      id = sid++;
9    }
10 
11   public void info(){
12     System.out.println("name is" + name +"," + "id is" + id );
13   }
14 
15   public static void main(String[] args ){
16     Cat.sid = 100;
17     Cat a = new Cat("mimi");
18     Cat b = new Cat("miaomiao");
19     a.info();
20     b.info();
21   }
22 }问题:
1.这个程序运行的第一句话是否是第2行?(不明白的地方:JAVA程序是先找到MAIN函数开始运行的.那么静态变量是在没找到MAIN()之前初始化的.还是在找到MIAN()方法之后,在方法体第一句语句运行之前初始化的?)2.new的过程序是怎么样的?如上题,当运行到第17行时,会自动跳转到第6行.那么第3和第4行是在什么时候运行的?在第7行执行之前么?3.第3行,第4行的成员变量初始化的时候,它们在内存中分配的空间是在哪?heap中么?还是stack中?构造函数中的形参在内存中分配的空间呢?是否是当成局部变量分别放在stack和data segment中?还是当成成员变量放在heap和data segment中?

解决方案 »

  1.   

     static private int sid = 0; 这个是类一级的,当然会在实例之前运行的。实际上,你的程序没有main,照样可以运行,那就是使用static 的代码块
      

  2.   

    1.0 执行的时候由于static private int sid = 0; 执行了初始化,所以会在main之前运行。
    2.0 在new一个对象的时候,它会首先找到对应的构造函数,在执行第一个构造函数之前,会检查是否有变量需要初始化,如果有,按照顺序进行初始化,之后再执行构造函数。
    3.0 至于空间分配问题,记住 成员变量在堆中分配,局部变量在栈中分配,就OK,这里的成员变量都是在堆中分配