ZKX's LAB

引用类型放在堆还是栈里面 java里String类型可以直接赋值,保存的是值还是引用的地址?

2020-08-11知识12

.NET的方法以什么形式进行存储,如值类型存栈,引用类型存堆,那么方法存在哪里呢? 进程的内存空间分好几个段的,.net方法都是放在 代码段 的,这个段里的内存值是不能改变的。“值类型存栈,引用类型存堆”这些都在数据段C#中值类型和引用类型分别放在堆栈里面的什么地方? 值类型的值就是存储在栈中啊引用类型是将存放本身的值存放在堆中引用类型是将存放本身的值的地址存放在栈中,根据这个地址可以去找到自己java new基本类型对象,是放在堆中还是栈中 java中new 出来的对象都存在堆内存中,指向对象的变量存在于栈中,new对象的常量在方法区,如下面例子:Integer inte=new Integer(10);为什么引用类型文件不能放在栈中 (1)成员函数定义放在类里面的是被自动当做inline(2)如果类函数定义在类的外面但在.h文件里就必须要显式声明inline,否则当这个头文件被多个文件包含时就会被认为重复定义(3)如果类成员函数在.cpp文件里面定义就不用加了,你想加也可以,但不是必须的。java里String类型可以直接赋值,保存的是值还是引用的地址? 首先告诉你,java里的String类型保存的就是引用地址,就像你下面说的,如果用String a=\"你好\"这种方式赋值的话,a里会保存一个地址,双引号字符串是常量字符串,在java文件编译的时候就放在虚拟机的常量池中,“你好”的真正位置也是在常量池中,另外还有一种方式:String a=new String(\"你好\"),如果这样写就和第一种不一样了,这个对象是在程序运行时创建,不是创建在常量池而是和其他java对象一样在java堆上创建,因此它的地址和第一种的不用。第二个问题,String和int直接赋值的区别。首先,最大的区别,一个是对象,一个是数值,对象可以为null,数值却必须有值,哪怕你没赋值,系统也会自动赋值为0。int b=3是直接在内存空间分配了一块空间b内容是3,b的内容是可变的,可以变为5,6…而String对象是不可变的,“你好”实际是在堆中存在的,把引用给了a,如果String a=\"bbb\"则是把另一个新的对象\"bbb\"的地址引用给了a,之前的对象“你好”是没有改变的。第三个问题,为什么引用类型赋值不能像基本数据类型呢?因为引用类型远比基本数据类型复杂啊,基本数据类型只有数值、字符、布尔三种数据类型,可以很简单得表示出来,像2、'a'、true这样,赋值也自然容易,。java中的基本数据类型一定存储在栈中吗 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在JAVA虚拟机栈中(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在JAVA虚拟机的栈中,该变量所指向的对象是放在堆类存中的。二:在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中此外,为了反驳观点\"Java的基本数据类型都是存储在栈的\",我们也可以随便举出一个反例,例如:int[]array。C#值类型和引用类型,堆和堆栈的区别 C#中值类型和引用类型概念:1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类、接口、数组和字符串)。C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct)引用类型包括:类、数组、接口、委托、字符串等。区别:基本区别在于它们在内存中的存储方式。值类型只将值存放在内存中,这些值类型都存储在堆栈中。原始数据类型(如bool和int)都属于此类型。而引用类型的内存单元中只存放内存堆中对象的地址,而对象本身放在内存堆中。如果引用的值类型的值是null,则表示未引用任何对象。堆和堆栈区别:堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同。在java中可以这么理解“堆是来装引用数据类型,栈是用来装基本数据类 理解不对。栈是用来存放局部变量的,存放引用,而对是用来存放对象的。对于引用数据类型,比如Student stu=new Student();stu这个引用是存在栈中的,new Student()这个对象是存在堆中,stu指向堆中的这个对象java中基本数据类型和引用数据类型在内存分配上有什么不同 Java的内存分配上,主要分4个块!一块是zhidao用来装代码的,就是编译的东西。一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!所以综上所述,版基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!这样说希望能帮你了解到java的内权存分配问题。

#堆栈#变量#string#赋值#内存类型

随机阅读

qrcode
访问手机版