日期:2014-05-20  浏览次数:20745 次

java变量作用域和生命周期
1.变量的作用域和生命周期什么关系?

2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢?

3.java源文件中代码的组织方式一定是:

class ClassName1{//类定义
    //成员变量定义
    //成员方法定义
}
class ClassName2{//类定义
    //成员变量定义
    //成员方法定义
}

//.......


一定是以上这种结构吗?比如在两个类定义之间一定不可能有其他代码吗(注释除外)?类体中除了成员变量和成员方法的定义外一定不可能有其他内容吗?成员变量和成员方法的定义可不可以打乱顺序?

4.JVM到底把内存分成几个部分啊?不同资料里说的不一样啊。。


现在学Java,感觉这些最基础的观念还需要强化,希望高手指点。

------解决方案--------------------
1.变量的作用域和生命周期什么关系?
——可以理解为基本一致,或者说生命周期决定作用域。

2.java除了在类体和方法体(包括参数)中可以声明变量外,其他位置一定不可以声明变量吗?比如高级别的应用里是不是有例外呢?
——你还想在哪声明变量呢?Java不支持超出三界外不在五行中的所谓“全局变量”

3.java源文件中代码的组织方式一定是一定是以上这种结构吗?
——Java毕竟鼓吹其面向对象,那么类以外的是啥?有意义么?(宇宙外面是啥?)
——除了成员变量和成员方法的定义外,没有其它了。
——定义的顺序可以打乱,但毕竟你要照顾阅读者的感受吧。

4.JVM到底把内存分成几个部分啊?
——这是有JVM厂商决定的,即便是一个厂商可能不同版本的JVM也会不一样。千万别误会:JVM可不仅仅是Sun才有。
------解决方案--------------------
引用:
谢谢哈,还有一点,既然顺序可以打乱,如果我将某个成员变量的声明放到方法定义的后面,那么这个方法中能不能访问这个变量呢?


可以访问。实际上有不少人的书写习惯是将所有变量的声明放在类定义的最后面。

虽然函数和变量的顺序可以无所谓,但是也要注意另外的问题。

变量定义自身如果有依赖关系的,顺序不能随意打乱,比如:
private int a = 8;
private int b = a;

静态块如果跟变量存在依赖关系的,顺序不能随意打乱,比如:
private static int a = 1;
static {
  a = a * 2;
}
------解决方案--------------------
◎ “但是如果单从代码的组织形式来看,他们的地位应该是平等的吧?”
——作用域范畴都不同,咋能说他们是平等的?
——就好比:一个是全国有效的法规,一个是地方性法规,作用域其实就是地位的象征啊。
——仅就从代码组织形式而言,一个是在函数{}外,一个在函数{}内。
——再比如:
public void run() {
  int a = 0;
  while (true) {
    int b = 1;
  }
  System.out.println(b); // 能行么?因为int b是在深层次{}里面的,在函数这个局部中更为局部
}


◎ 所谓的“面向对象技术”无非也就是“组织代码的一种方式”而已吧
——其实代码不关键,面向对象是一种设计思想。至于怎么去更好的实现面向对象或者支持面向对象,各有各的做法和发展。
——此外,并不是所有的东西都必须面向对象。我们常说:大处面向对象,小处面向过程。


◎ 与面向对象相关的一系列概念结构(类、对象、封装等)不过是我们为了更好地理解这种“代码组织方式”而在头脑中人为地构建起来的系统性的逻辑关系