黑马程序员技术交流社区
标题:
一个有关成员变量和局部变量的
[打印本页]
作者:
任增涛
时间:
2012-2-3 14:57
标题:
一个有关成员变量和局部变量的
是这样,成员变量一般都存储在堆里,局部变量都存储在栈里,我不懂的是:
public static void main(String[] args)
{
int x=5;
}
主函数里,直接定义的变量,到底算成员变量还是局部变量,储存在哪里,什么时候销毁。
还有:常量如1,2,3等储存在哪里!
作者:
曾辉
时间:
2012-2-3 15:11
是局部变量,除非加上static修饰,但static定义后就不能被修改了。任何函数内部的变量都是局部的;存储在栈里
局部变量在局部范围使用时创建,当局部变量在局部方法没有时,由垃圾回收机制自动销毁。
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
作者:
刘基军
时间:
2012-2-3 15:12
x,局部变量,作用域:到“}”为止,(new出来的存放在堆里)存储在栈
参考链接:http://developer.51cto.com/art/201009/225071.htm
作者:
张伟~
时间:
2012-2-3 15:20
本帖最后由 张伟~ 于 2012-2-3 15:24 编辑
什么乱七八糟的,变量一般不都存储在栈内存里吗,只有那些引用型变量比如String通过new关键字出来的对象才放在堆内存里。
像int,long这些基本类型的变量,都是可以直接赋值的,这些值其实都是常量,放在常量池里。
作者:
王文龙
时间:
2012-2-3 15:30
是局部变量.
int x=5这句话,X在栈内存中开辟空间,
查找内存中有没有5这个值,没有则在栈中创建5,
将X指向5.
既然存在于栈内存中,应该在使用完之后会自动释放掉.
作者:
易伟
时间:
2012-2-3 15:34
本帖最后由 易伟 于 2012-2-3 15:36 编辑
在函数中定义的变量称为临时变量或局部变量,在类中定义的称之为成员变量。
所以,主函数中的变量应该是局部变量。
从形式上看,局部变量和类的成员变量十分相似,但在使用上它们的区别很大。
1.局部变量没有访问权限修饰符,不能用public、private和protected来修饰。这是因为它只能在定义它的方法内部使用。
2.局部变量不能用static修饰,没有"静态局部变量".
3.系统不会自动为局部变量赋初值,但对于成员变量,系统会自动赋初值。基本类型的值为0,复合类型的值为null。
4.局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。
5.局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同。而静态成员变量的生存期是整个程序运行期。
6.在同一个方法中,不允许有同名的局部变量。在不同的方法中,可以有同名的局部变量,它们互不干涉。
局部变量可以和成员变量同名,且在使用时,局部变量具有更高的优先级。
至于存储在什么地方:
基本数据类型,声明它就在栈中分配了空间,当运行时,还会附上初始值,
引用数据类型:在声明它的时候也会在栈中分配内存空间,用来存储内存地址,如果没有赋值该地址指向一个空值(null),如果赋值,则该地址指向存储在堆中分配的地址,如果是new 则在堆中分配一个新地址,如果是其他对象赋值给它的,这时只是栈中的地址和原地址指向同一个堆。并没有在内存中分配新的堆空间 。
够详细了吧,这样你自己就能判断了。
作者:
黄秋
时间:
2012-2-3 16:56
你想深入了解JAVA,就用javap 反编译成微代码,如
public class Test{
public static void main(String[] args)
{
int x=5;
}
}
复制代码
javac 编译后,javap -c Test --- 反编译成微代码:
public static void main(java.lang.String[]);
Code:
0: iconst_5 //把 5 放到栈顶
1: istore_1 //将栈顶的元素pop出,存入局部变量索引为1的位置
2: return
作者:
许涛
时间:
2012-2-3 17:30
本帖最后由 许涛 于 2012-2-3 17:31 编辑
我就不长篇大论了,直接回答楼主问题
1.主函数里,直接定义的变量,到底算成员变量还是局部变量
函数中定义的变量都称为局部变量,主函亦是函数,所以主函数里定义的变量是局部变量
2.储存在哪里,什么时候销毁。
上面说了定义的是局部变量,凡是局部变量都储存在栈内存里
被使用完之后,由java垃圾回收机制自动销毁。
3.还有:常量如1,2,3等储存在哪里!
常量存放在常量池中
作者:
张青峰
时间:
2012-2-3 23:53
类体由2部分构成:
一部分是变量的定义;
一部分是方法的定义(一个类中可以有多个方法)
在变量定义部分定义的变量叫做类的成员变量,成员变量在整个类中都有效.
(全局变量应该是成员变量的俗称)
在方法体中定义的变量叫做局部变量,局部变量只在定义它的方法中有效.
成员变量又分为 实例变量 和 类变量(static静态变量).
class One
{ float x; //x为实例变量
static int y; //只要有关键字static,y为类变量
}
作者:
魏腾飞
时间:
2012-2-6 09:18
这个变量是局部变量,你试想一下。虽然是主函数,但是也是属于某个类等同于在某个类中的函数中定义了该变量,其作用范围肯定小于类的成员变量。
在主函数里的这个变量存储在栈内存中,其值也应该存在栈内存中。随着函数的使用完成而自动消失。
作者:
余海龙
时间:
2012-2-6 15:19
成员变量:定义在类中的变量。存储在栈内存中
局部变量:定义在方法或者语句中的变量。存储在栈内存中
存活期:
成员变量是随着类的加载在加载进内存的,随着所有代码的执行完类在内存中的消失而消失,简单说就是:随着类的存在而存在,随着类的消失而消失。
局部变量是随着方法或执行到的语句进入栈内存中执行时而存在,随着方法或语句的结束而消失。
作者:
【专】【属】
时间:
2012-2-7 19:59
常量和变量存储的位置是不同的,常量存在代码区中。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2