A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任增涛 黑马帝   /  2012-2-3 14:57  /  3085 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是这样,成员变量一般都存储在堆里,局部变量都存储在栈里,我不懂的是:
public static void main(String[] args)
{
int x=5;
}
主函数里,直接定义的变量,到底算成员变量还是局部变量,储存在哪里,什么时候销毁。
还有:常量如1,2,3等储存在哪里!

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

11 个回复

倒序浏览
是局部变量,除非加上static修饰,但static定义后就不能被修改了。任何函数内部的变量都是局部的;存储在栈里

局部变量在局部范围使用时创建,当局部变量在局部方法没有时,由垃圾回收机制自动销毁。

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
x,局部变量,作用域:到“}”为止,(new出来的存放在堆里)存储在栈
参考链接:http://developer.51cto.com/art/201009/225071.htm
回复 使用道具 举报
本帖最后由 张伟~ 于 2012-2-3 15:24 编辑

什么乱七八糟的,变量一般不都存储在栈内存里吗,只有那些引用型变量比如String通过new关键字出来的对象才放在堆内存里。
像int,long这些基本类型的变量,都是可以直接赋值的,这些值其实都是常量,放在常量池里。
回复 使用道具 举报
是局部变量.
int x=5这句话,X在栈内存中开辟空间,
查找内存中有没有5这个值,没有则在栈中创建5,
将X指向5.
既然存在于栈内存中,应该在使用完之后会自动释放掉.

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 易伟 于 2012-2-3 15:36 编辑

    在函数中定义的变量称为临时变量或局部变量,在类中定义的称之为成员变量。
所以,主函数中的变量应该是局部变量。
   从形式上看,局部变量和类的成员变量十分相似,但在使用上它们的区别很大。
1.局部变量没有访问权限修饰符,不能用public、private和protected来修饰。这是因为它只能在定义它的方法内部使用。
2.局部变量不能用static修饰,没有"静态局部变量".
3.系统不会自动为局部变量赋初值,但对于成员变量,系统会自动赋初值。基本类型的值为0,复合类型的值为null。
4.局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。
5.局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同。而静态成员变量的生存期是整个程序运行期。
6.在同一个方法中,不允许有同名的局部变量。在不同的方法中,可以有同名的局部变量,它们互不干涉。
局部变量可以和成员变量同名,且在使用时,局部变量具有更高的优先级。
至于存储在什么地方:
基本数据类型,声明它就在栈中分配了空间,当运行时,还会附上初始值,
引用数据类型:在声明它的时候也会在栈中分配内存空间,用来存储内存地址,如果没有赋值该地址指向一个空值(null),如果赋值,则该地址指向存储在堆中分配的地址,如果是new 则在堆中分配一个新地址,如果是其他对象赋值给它的,这时只是栈中的地址和原地址指向同一个堆。并没有在内存中分配新的堆空间 。
够详细了吧,这样你自己就能判断了。

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
黄秋 黑马帝 2012-2-3 16:56:37
7#
你想深入了解JAVA,就用javap 反编译成微代码,如
  1. public class Test{
  2.         public static void main(String[] args)
  3.         {
  4.                 int x=5;
  5.         }
  6. }
复制代码
javac 编译后,javap -c Test --- 反编译成微代码:

public static void main(java.lang.String[]);
  Code:
   0:   iconst_5   //把 5 放到栈顶
   1:   istore_1   //将栈顶的元素pop出,存入局部变量索引为1的位置
   2:   return

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
许涛 黑马帝 2012-2-3 17:30:33
8#
本帖最后由 许涛 于 2012-2-3 17:31 编辑

我就不长篇大论了,直接回答楼主问题
1.主函数里,直接定义的变量,到底算成员变量还是局部变量
函数中定义的变量都称为局部变量,主函亦是函数,所以主函数里定义的变量是局部变量

2.储存在哪里,什么时候销毁。
上面说了定义的是局部变量,凡是局部变量都储存在栈内存里
被使用完之后,由java垃圾回收机制自动销毁。

3.还有:常量如1,2,3等储存在哪里!
常量存放在常量池中

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
类体由2部分构成:
一部分是变量的定义;
一部分是方法的定义(一个类中可以有多个方法)

在变量定义部分定义的变量叫做类的成员变量,成员变量在整个类中都有效.
(全局变量应该是成员变量的俗称)
在方法体中定义的变量叫做局部变量,局部变量只在定义它的方法中有效.

成员变量又分为 实例变量 和 类变量(static静态变量).
class One
{ float x;      //x为实例变量
  static int y; //只要有关键字static,y为类变量
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
这个变量是局部变量,你试想一下。虽然是主函数,但是也是属于某个类等同于在某个类中的函数中定义了该变量,其作用范围肯定小于类的成员变量。
在主函数里的这个变量存储在栈内存中,其值也应该存在栈内存中。随着函数的使用完成而自动消失。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
成员变量:定义在类中的变量。存储在栈内存中
局部变量:定义在方法或者语句中的变量。存储在栈内存中

存活期:
         成员变量是随着类的加载在加载进内存的,随着所有代码的执行完类在内存中的消失而消失,简单说就是:随着类的存在而存在,随着类的消失而消失。
         局部变量是随着方法或执行到的语句进入栈内存中执行时而存在,随着方法或语句的结束而消失。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
常量和变量存储的位置是不同的,常量存在代码区中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马