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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 翟盼盼 高级黑马   /  2013-3-7 12:51  /  2365 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

值类型与引用类型最基本的区别是什么?

评分

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

查看全部评分

9 个回复

倒序浏览
一、定义

引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,

那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法,

当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现

二、值类型

也就是基本数据类型 基本数据类型常被称为四类八种

四类:  

1,整型 2,浮点型 3,字符型4,逻辑型

八种:   

      1,整型3种 byte,short,int,long

         2,浮点型2种 float,double

         3,字符型1种 char

         4,逻辑型1种 boolean

三、引用类型

除了四类八种基本类型外,所有的类型都称为引用类型(数组,类,接口,字符串)

在弄清楚值类型与引用类型之后,最后一点就是值传递与引用传递,这才是关键

四、值传递   

基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。

五、引用传递

引用类型之间赋值属于引用传递。引用传递传递的是对象的引用地址,也就是它的本身(自己最通俗的理解)。

引用传递:传的是地址,就是将实参的地址传递给形参,形参改变了,实参当然被改变了,因为他们指向相同的地址。

引用和我们的指针差不多,但是它不又不需要我们去具体的操作

六、内存分配

一个具有值类型(value type)的数据存放在栈内的一个变量中。即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。

值类型的数据具有较快的存取速度。

一个具有引用类型(reference type)的数据并不驻留在栈中,而是存储于堆中。即是在堆中分配内存空间,不直接存储所包含的值,而是指向所要存储的值,其值代表的是所指向的地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度。

Java中有垃圾回收机制,栈内存中的变量随着方法的结束内存自然销毁了,而用引用类型的时候,当方法结束的时候,这个对象可能被另一个引用类型所应用,不会销毁,只有当一个对象没有任何引用变量引用的时候,垃圾回收机制才会回收

评分

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

查看全部评分

回复 使用道具 举报
C#将类型分为两类,一类是值类型,另一类是引用类型。大部分固有的基本类型(如int, char)是值类型,structs 也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单,那就是一个值类型的实例代表了实际的数据(存在栈中),而一个引用类型的实例代表指向数据的指针或者引用(存在堆中)。
C++开发者最容易混淆的地方是:C#已经自己预定义了一些类型作为值类型,一些作为引用类型,而一个C++的开发者希望能够自己控制。

例如,在C++中,我们可以这样做:
int x1 = 3; // x1 是堆栈上的值

int *x2 = new int(3) // x2 是堆的一个值的引用

但是在C#中没有这样的控制:

int x1 = 3; // x1是堆栈上的值

int x2 = new int();

x2 = 3; // x2还是堆栈上的值!

评分

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

查看全部评分

回复 使用道具 举报
如果数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。“引用类型”包含指向存储数据的其他内存位置的指针。
值类型包括:所有数字数据类型
Boolean、Char 和 Date所有结构,即使其成员是引用类型
枚举,因为其基础类型总是 SByte、Short、Integer、Long、Byte、UShort、UInteger 或 ULong

引用类型包括:String所有数组,即使其元素是值类型
回复 使用道具 举报
值类型存在内存中的栈中,引用类型存在内存的堆中
回复 使用道具 举报
引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。简称引用类型部署在托管推上。值类型总是分配在它声明的地方:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。值类型在内存管理方面具有更好的效率,并且不支持多态,适合用做存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。

评分

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

查看全部评分

回复 使用道具 举报
分配的地址不一样;引用类型在栈中存储的是对象的引用,当引用类型的变量或对象改变时,其结果跟着改变;值类型,存储在堆中;,值传递传递的是实实在在的变量值,是传递原参数的拷贝,值传递后,实参传递给形参的值,形参发生改变而不影响实参。
回复 使用道具 举报
天行 中级黑马 2013-3-11 10:41:01
8#
1、在C#中,有且仅有两种数据类型:值类型和引用类型。换言

之,一个变量要么是值类型,要么是引用类型。像我们常见的数

据类型(int,float,double)、结构、枚举等等都属于值类型,而

像类、接口、委托等都属于引用类型。所以,要想深入的了

解.net framework的一些原理性的知识,值类型与引用类型是跨

不过去的一道门槛。
2、C#中变量的类型取决于什么?
在C#中,变量是值类型还是引用类型,取决于其基本数据类型。

在C#中,其基本数据类型并没有内置于语言中,而是存在与.Net

Framewok中。.Net使用CTS(通用语言系统)定义在IL(中间语言)

中使用的预定义数据类型。C#中所有数据类型都是对象,它们有

属性、方法等。eg:在C#中声明一个int变量时,实际上是声明

了CTS中System.Int32的一个实例。
3、引用类型是直接继承自System.Object的,而值类型是隐式直

接派生于System.ValueType的,这个System.ValueType则是直接

派生于System.Object的。
4、他们绝大部分都是相同的,而唯一不同的一块是

System.ValueType类重写了Equals()方法
5、c#中值类型:
整型。包括我们常见的short、int、long、byte、sbyte、

bigint等这。
浮点型。包括float、double。
用于财务计算的高精度decimal类型。
结构体。struct,已经预定好的和用户自定义的。
枚举。
bool类型。
可空类型。

6、c#中引用类型:
数组。
类。
接口。
委托。
object。其实就是System.Object,老大哥。
字符串。
回复 使用道具 举报
宋健 中级黑马 2013-3-11 20:22:20
9#
值类型存储在栈上,包括int型,double型,bool型,char型,枚举,结构
引用类型在栈上存地址,在堆上存储值,包括数组,字符串,类。
回复 使用道具 举报
值类型放在栈中  替换的同时马上销毁
引用类型放在堆中  在值类型中存的地址 指向堆中位置,替换的话不会马上销毁而是重新开辟一块空间
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马