精华内容
下载资源
问答
  • 形式参数是局部变量局部变量中基础数据类型的引用和值都存储在栈中,对象引用存在栈中,对象存在堆中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 ...

    首先说明,"Java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。

    对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。 形式参数是局部变量,局部变量中基础数据类型的引用和值都存储在栈中,对象引用存在栈中,对象存在堆中。栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 如以下代码:

    classBirthDate {private intday;private intmonth;private intyear;public BirthDate(int d, int m, inty) {

    day=d;

    month=m;

    year=y;

    }//省略get,set方法………

    }public classTest {public static voidmain(String args[]) {int date = 9;

    Test test= newTest();

    test.change(date);

    BirthDate d1= new BirthDate(7, 7, 1970);

    }public void change(inti) {

    i= 1234;

    }

    }

    对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:

    1.main方法开始执行:int date = 9; date局部变量,基础类型,引用和值都存在栈中。

    2.Test test = new Test();test为对象引用,存在栈中,对象(new Test())存在堆中。

    3.test.change(date); i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。

    4.BirthDate d1= new BirthDate(7,7,1970); d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。

    5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(), new BirthDate()将等待垃圾回收。

    efead3f489456f6f610bab6e16a6ec99.png

    展开全文
  • 首先说明,"Java中的基本数据类型一定存储在栈中的...局部变量中 基础数据类型的引用 和值都存储在栈中 局部变量中 对象引用存在栈中,对象实例存在堆中 栈内存中的局部变量随着方法的消失而消失。 成员变量存储在...

    首先说明,"Java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。

    对于成员变量和局部变量:

    • 成员变量就是方法外部,类的内部定义的变量
    • 局部变量就是方法或语句块内部定义的变量

    局部变量必须初始化。 形式参数也是局部变量

    • 局部变量中 基础数据类型的引用 和 值 都存储在栈中
    • 局部变量中 对象引用存在栈中对象实例存在堆中

    栈内存中的局部变量随着方法的消失而消失。 成员变量存储在堆中的对象里面,由垃圾回收器负责回收。

     

    如以下代码:

    class BirthDate {
        private int day;
        private int month;
        private int year;
    
        public BirthDate(int d, int m, int y) {
            day = d;
            month = m;
            year = y;
        }
        // 省略get,set方法………
    }
    
    public class Test {
        public static void main(String args[]) {
            int date = 9;
            Test test = new Test();
            test.change(date);
            BirthDate d1 = new BirthDate(7, 7, 1970);
        }
    
        public void change(int i) {
            i = 1234;
        }
    }

    对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化:

    1.main方法开始执行:int date = 9; date局部变量,基础类型,引用和值都存在栈中。

    2.Test test = new Test();test为对象引用,存在栈中,对象(new Test())存在堆中。

    3.test.change(date); i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。

    4.BirthDate d1= new BirthDate(7,7,1970); d1为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。

    5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(), new BirthDate()将等待垃圾回收。

     

     

    成员变量: 

        定义位置:在方法外,类体中。

        成员变量存储在堆中。

        默认值:有默认值,在构造器中可以不对成员变量进行初始化。

        生命周期:从对象实例化开始,到对象被GC垃圾回收为止。

    局部变量:   

         定义位置:在方法内(包括小括号里边的形参)

         局部变量存储在栈中。

         默认值:没有默认值,使用前需要初始化。

         生命周期:从声明开始到方法结束弹栈为止。

    展开全文
  • 基本类型的变量如果临时变量,只要定义了,就会分配内存空间,不管是否被赋值;...2、 :保存局部变量的值,包括: 1)用来保存基本数据类型的值; 2)保存类的实例,即堆区对象的引用(指针) 3)也可以用来
    基本类型的变量如果是临时变量,只要定义了,就会分配内存空间,不管是否被赋值;如果是作为对象的属性出现,只要该对象不实例化,就不会分配内存空间。

    一个完整的Java程序运行过程会涉及以下内存区域:
    1、寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
    2、 栈:保存局部变量的值,包括:
    1)用来保存基本数据类型的值;
    2)保存类的实例,即堆区对象的引用(指针)
    3)也可以用来保存加载方法时的帧
    3、堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

    4、常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。

    5、代码段:用来存放从硬盘上读取的源程序代码。
    6、数据段:用来存放static定义的静态成员

    注意:
    1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。
    2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。
    展开全文
  • 在 C 语言内存分配...2、在栈分配同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。需要注意的,栈内存分配运算内置于处理...
    1e532320298e651c37c88a9d642e203f.png

    在 C 语言中,内存分配方式有以下三种形式:

    1、从静态存储区域分配

    由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与 static 变量。

    a265e7b3949d78f5eb2ce1f3274982ee.png

    2、在栈上分配

    同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。

    需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。

    b2647238e78237a319e0dde5dd830c5e.png

    3、从堆上分配

    也称为动态内存分配,由程序员手动完成申请和释放。程序在运行的时,由程序员使用内存分配函数(如 malloc 函数)来申请内存,使用完之后再由程序员自己负责使用内存释放函数(如 free 函数)来释放内存。

    需要注意的是,如果在堆上分配了内存空间,就必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误。

    在 C 语言中,不同类型变量的存储位置和作用域也有所不同。

    全局变量

    从静态存储区域分配,其作用域是全局作用域,也就是整个程序的生命周期内都可以使用。如果程序是由多个源文件构成的,那么全局变量只要在一个文件中定义,就可以在其他所有的文件中使用,但必须在其他文件中通过使用extern关键字来声明该全局变量。

    全局静态变量

    从静态存储区域分配,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用。与全局变量不同的是,全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用。

    局部变量

    从栈上分配,其作用域只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,也即该变量的生命周期和该函数同在。

    局部静态变量

    从静态存储区域分配,其在第一次初始化后就一直存在直到程序结束。该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。

    b6487834b33797c9f354f05b8147deb3.png
    展开全文
  • 到底为什么要知道和堆的机制呢?这真的跟我们有关系吗?... java是把局部变量放在里面的,方法调用和局部变量是属于java的行为也就是方法的的属性。这有什么特点?我们知道java调用方法执行完毕...
  • JVM内存分配策略 关于JVM的内存结构及内存分配方式,不是本文的重点,这里只做简单回顾。...这里所提到的栈其实指的虚拟机栈,或者说虚拟栈中局部变量表。 3、栈中存放一些基本类型的变量数据(int/sho...
  • 首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定错误的。 栈:虚拟机栈:执行java方法是分配内存模型。方法运行分配一个栈帧用于存放局部变量表,操作数栈、动态链接、方法出口等信息。。...
  • c语言动态分配内存的函数,可能有些初学c语言的...在计算机的系统有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要储存一些字符常量,比如:char *p_str=”
  • 动态分配内存专题

    2014-05-11 16:53:00
    我讲解一下c语言动态分配内存的函数,可能有些...在计算机的系统有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要储存一些字符常量,比如:char *p_str=...
  • 在 C 语言内存分配...2、在栈分配同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。需要注意的,栈内存分配运算内置于处理...
  • c语言 什么时候需要动态分配内存

    千次阅读 2017-07-04 20:47:44
    我讲解一下c语言动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过...1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数); 2)字符常量区:主要储存一些字符常量,比如:char
  • c:动态分配内存空间

    千次阅读 2013-10-05 20:25:28
    我讲解一下c语言动态分配内存的函数,可能有些...在计算机的系统有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要储存一些字符常量,比如:char *p_str=
  • 什么时候需要动态分配内存

    千次阅读 2014-10-31 10:31:08
    我讲解一下c语言动态分配内存的函数,可能有些...在计算机的系统有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要储存一些字符常量,比如:char *p_str=
  • 很多人都知道 存储的方法里面的局部变量。而堆存储的数组或者对象。那对象一定就分配在么?答案不一定的。 问题就出现“逃逸分析”上面?那么什么逃逸分析呢? 逃逸分析(Escape Analysis) :一种...
  • c++ 内存分配管理

    2014-11-25 17:41:49
    1、区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构。想知道为什么效率高吗?因为关于的操作如push集成处理器的指令集中,效率很高,但是分配内存...
  • 【九】与递归--程序空间

    千次阅读 2015-05-27 20:54:26
    1、C语言的疑惑C语言中常说“局部变量在栈分配空间”,那么这个地方的“栈”和我们之前学习的栈数据结构有关系吗?解答: 保存局部变量的栈函数调用时的栈; 程序的“函数调用栈”栈数据结构的一种应用; ...
  • 关于c语言动态分配内存的函数,可能有些初学...在计算机的系统有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要储存一些字符常量,比如:char *p_str=”
  • 值类型的都存储在栈当中,其中的引用类型的指针存储在内存中的堆,指针指的具体对象在堆。一、其实C和C++的内存分区还是有一定区别的,但此处不作区分:1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的...
  • 专题四-与递归

    2017-02-06 09:50:52
    小A:C语言常说局部变量在栈分配空间,那么这个地方的栈和我们之前学习的栈数据结构有关系吗? 小B:我觉得应该没有关系吧,只是名称碰巧一致而已吧。 函数调用栈 (1)程序的“函数调用栈”栈数据结构的一...
  • 目录Java虚拟机栈相关知识总结Java虚拟机栈什么?虚拟机栈大小的调整局部变量表操作数...每个方法被调用的时候,都会相应的Java虚拟机栈中创建栈帧,虚拟机栈描述的Java方法执行的内存模型: Java虚拟机栈线
  • 是问a这个字母吗?成员变量的a=1:编译为class后a,1这两个字符都在常量池里(class...结论:a和1存在于他们所在的实例对象所分配的堆内存局部变量的a=1:方法调用是在jvm栈中,默认的javac编译,不包含局部变量名,那...
  • 在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。但是由于返回时被外部引用,因此其生命周期大于栈,则溢出。 发送指针或带有指针的值到 channel 中。 在编译时,没有办法知道哪个 goroutine...
  • C++内存分成5个区,他们分别堆、、自由存储区、全局/静态存储区和常量存储区。 ,就是那些由编译器需要的时候分配不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 ...
  • 不过,即使是在这样一个简单的计算机,您也会有问题,尤其是当您不知道程序的每个部分将需要多少内存时。如果您的空间有限,而内存需求是变化的,那么您需要一些方法来满足这些需求: 确定您是否有足够的内存...
  • 我讲解一下c语言动态分配内存的函数,可能有些初学...在计算机的系统有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要储存一些字符常量,比如:char *p_
  • •假设你不知道局部变量实际上属于线程栈中的而非堆里面的,那么你就可能会担心是不是我这样写会有并发问题;•假设你不知道对象实例是分配在堆中,属于JVM共用的,那么你根本也就不会考虑进行某些访问时进行加锁...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

局部变量是在栈中分配内存吗