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是在深层次{}里面的,在函数这个局部中更为局部
}
◎ 所谓的“面向对象技术”无非也就是“组织代码的一种方式”而已吧
——其实代码不关键,面向对象是一种设计思想。至于怎么去更好的实现面向对象或者支持面向对象,各有各的做法和发展。
——此外,并不是所有的东西都必须面向对象。我们常说:大处面向对象,小处面向过程。
◎ 与面向对象相关的一系列概念结构(类、对象、封装等)不过是我们为了更好地理解这种“代码组织方式”而在头脑中人为地构建起来的系统性的逻辑关系
——没错。很多思想,其实都是在研究如何更好的让计算机语言能更容易与现实业务映射。
[解决办法]
成员变量相对局部变量,除了LS说的全国性与地方性的区别,确实具有一定的特殊地位,成员变量的生命周期和对象的生命周期一致,只要对象存在,成员变量就存在,而对象可以脱离{}而存在(一定程度上超越3界,注意对象和变量的区别),只要有变量引用它,它就不会被系统回收没,而局部变量,只有方法被调用的时候才会产生,方法结束就会消亡。另外,成员变量是可以通过反射的方式访问的,而局部变量不行。
[解决办法]
如阿宝所说。
其实,有些事情是可以自己推论的,作为面向对象思想体系来说,脱离类去定义变量(属性),本身就是没有意义的。属性必然是某个对象的属性,如果你认为某个属性可以脱离于对象而独立存在,说明这个属性本身其实就是个对象(抽象后成为类)。
这里延伸开来就会涉及:大处面向对象,小处面向过程。
因为你会觉得,那么函数内或者块内({})所定义的变量又是啥?还是能算是对象的属性么?
可以认为是为了完成某个任务而临时具有的属性、隐含属性或组合属性(你挥动球棒时,可能多出来一个属性叫做击球速度,这个属性单独在人或球棒上都不存在);也可以认为是面向过程的思想体系中本来就不关心什么属性。