黑马程序员技术交流社区

标题: 成员变量和局部变量 [打印本页]

作者: 一路走来    时间: 2012-6-27 12:40
标题: 成员变量和局部变量
package com.here;
public class Main {
   public static void main(String[] args){
    Car car=new Car();
    car.color="red";
   
    car.run();
   
    Car car1=new Car();
    car1.run();
   }
}
class Car {
  //描述车的颜色
String color="yellow";
//描述轮胎数
int num=4;

//运行行为
void run() {
  System.out.println(color+"...."+num);
}
}
还记得毕老师将的这段么,老师说成员变量存储在堆内存中,而局部变量存储在栈内存中。如果是类中方法里面的局部变量也存在栈内存中么?

作者: 党传才    时间: 2012-6-27 12:47
在方法中定义的一些基本类型的变量和对象的引用变量都是在方法的栈内存中分配的;而堆内存用来存放由new创建的对象,在堆中分配的内存。
局部变量,无论是静态方法还是动态方法,都是局部变量,都是在栈中创建
作者: 吴扬    时间: 2012-6-27 13:09
本帖最后由 吴扬 于 2012-6-27 13:10 编辑

毕老师在视频中有提到过,只要是用new关键字创建出来的对象,都存在于对内存中
而当某个方法被调用的时候,这个方法就要被加载进内存,即在栈内存中给它开辟空间,当然这个方法中的基本类型数据和一些引用型变量都是存在于栈内存的,就比如主函数,当主函数被虚拟机运行的时候,它里面的一些基本类型的数据不都是存在于占内存中的么?其实主函数和其他函数的主要区别就是它是程序的入口,能被虚拟机所识别而已。
作者: 余清兰    时间: 2012-6-27 13:52
栈内存(栈区):
用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存(堆区):
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值(本节即指数组地址)。
实体中的变量在没有赋值的情况下都有默认初始化值。默认值是根据数组中元素的类型而定,若是int型数组 ,默认值是0。若是double型数组,默认值是0.0,若是float型数组,默认值是0.0f,若是boolean型数组,默认值是false,若是char型数组,默认值是\u0000即是一个空位,相当于空格,若是String类型,默认值是null。如果想给堆内存中的一个实体0角标赋值,格式为x[0]=10;
实体不再被使用,会在不确定的时间内被垃圾回收器回收(java虚拟机的回收机制)。

作者: 黑马-王言龙    时间: 2012-6-27 14:03
本帖最后由 wyl530274554 于 2012-6-27 14:05 编辑

类中方法里的变量就是局部变量,在栈内存中出现(方法调用时)

作者: 周刚    时间: 2012-6-27 14:12
普通变量使用完就回收,放在栈内存中;
凡是用new 创建出来的对象都要放在堆内存中,由虚拟机不定时回收...
像for(int i=0;i<10;i++){...}这里面的 i 是局部变量,for循环执行完它就over了。
new 出来的引用对象则不一样了
作者: 孙飞    时间: 2012-6-27 14:24
java中内存主要包含4块,即heap(堆内存)、stack(栈内存)、data segment(静态变量或是常量存放区)、codesegment(方法区).
堆内存中存放的是new出的对象,new出的对象只包含成员变量。
栈内存中存放的是局部成员变量。对于基本的数据类型存放的是基本变量的值,而对于对象变量,存放的是堆内存的地址。
静态、常量区:存放的是静态变量(类变量)或是常量。
方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。
例如
A a = new A(); A中含有一个work方法,2个成员变量a,b。那么对应的内存分配为a是分配在栈内存中。里面存放了一个指向堆内存中存放的new A()的地址。new A()会在堆内存中分配一块空间,该内存中的A对象同时会含有a和b。work()方法会在codesegment区中分配内存。如果此时 A b = a;则表示把a的值复制给b,即b的值为a中保存的地址

作者: dev    时间: 2012-6-27 14:45
堆和栈都是内存上的一块空间。
1、栈内存:在方法中定义的一些基本类型的变量和对象的引用都是在函数的栈内存中
分配的。栈内存的特点是“先进后出”。
2、堆内存:用来存放由new创建出来的对象和数组。堆内存由JVM垃圾回收器来管理。

所以你所说的方法里的局部变量是存在栈内存中的。
作者: 刘笑    时间: 2012-6-27 18:08
只要是new出来的对象都放进堆里,包括全局变量 静态局部变量 静态全局变量等;局部变量(除静态局部变量外)都存放在栈里,此外函数的形参等也存放在栈里,栈里的变量使用完毕之后立即释放所占空间




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2