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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陶圣虎 于 2014-8-7 20:58 编辑

我想问下成员变量,局部变量的定义,以及他们和栈堆内存之前的关系。视频里彻底听晕了。

11 个回复

倒序浏览
变量主要有类变量、成员变量、局部变量三种。
回复 使用道具 举报
变量主要有类变量、成员变量、局部变量三种。
类变量的的格式如下
  1. class ClassA
  2. {
  3.   public static int age;
  4. }
复制代码

也就是说,类变量是定义在类中(而不是方法中)并且有static 修饰的变量。

成员变量的格式如下:
  1. class ClassB
  2. {
  3.   public int age;
  4. }
复制代码

也就是说,成员变量是定义在类中,但是没有static 修饰的变量。

局部变量呢,则是定义在方法中的(注意:JAVA中不怎么用函数这种说法的)。比如最常见的。
  1. class ClassC
  2. {
  3.     public static void main(String[] args)
  4.       {
  5.          int age;
  6.       }
复制代码


回复 使用道具 举报
关于内存的存放位置。
类变量,因为是静态的,所以是在方法区中的。你后面会学到。
成员变量,实际的值是存放在堆内存中的。
局部变量,一般是存放在栈内存中的。

注意:这只是针对基础数据类型的数据而言。
如果是引用数据类型的话,他们都是存在于栈内存中而指向他们各自所在的内存区域。

简单理解,就是无论他们在哪个内存区域中(堆、栈、方法区),都会在栈内存中留下一个入口。
回复 使用道具 举报
内存:栈 1.存放局部变量 2.不可以被多个线程共享 3.空间连续,速度快
堆 1.存放对象 2.可以被多个线程共享 3.空间不连续,速度慢,但是灵活
方法区 1.存放类的信息:代码、静态变量、字符串常量等等 2.可以被多个线程共享 3.空间不连续,速度慢,但是灵活
回复 使用道具 举报
成员变量是定义在类体中的变量, 作用范围在整个 类体中有效,  使用前可以不赋值,会有默认初始化动作, 而局部变量定义在方法中,使用前必须初始化,否则编译失败,作用范围只在该方法中有效,出了这个方法就没人认识他了,  
回复 使用道具 举报
楼上解释很详细,简单点来说,成员变量在类中定义,非静态,存放在堆空间中,局部变量在方法或代码块中定义,存放在栈内存中。
栈和堆的区别:
Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程。它主要用来存储线程执行过程中的局部变量,方法的返回值,以及方法调用上下文。栈空间随着线程的终止而释放
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等
回复 使用道具 举报
学习了。。。
回复 使用道具 举报
请看图解

成员函数,变量.png (129.93 KB, 下载次数: 208)

成员函数,变量.png
回复 使用道具 举报
实例变量是这样的
A  a = new A();
A b = new A();
A c = new A();
A fuck = new A();

a b c fuck 就是实例变量
类变量就是 静态的
A{
static int a = 1;
static  int b = 1;
static int c = 1; //类变量
}
回复 使用道具 举报
实例变量存放在堆内存 类变量存放在方法区
回复 使用道具 举报
整理的很清晰,看过很有收获……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马