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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杨兴庭 于 2013-7-25 23:19 编辑

本数据类型在声明时就分配内存空间,引用数据类型在定义时除了声明之外还需要用new来创建才能分配内存空间,这句话正确么?除了这点外,二者的本质在哪儿?

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

9 个回复

倒序浏览
基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的。
回复 使用道具 举报
区别主要体现在使用函数 传入参数的时候。
基本数据类型由于在内存中的一个地址存放的是这些变量的值,所以调用函数,函数里的形参就是复制这些变量的值以后对形参值的变化不会影响到原来变量的值。
而引用数据类型由于在内存中是引用他的一个内存地址而不是具体的值 。所以调用函数,函数里的形参 就是复制这些变量的值的地址,当对形参的值进行修改的时候,就等于是对这些变量的值进行修改。所以会影响到原来变量的值。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
一般本质区别,都在类似的定义就有。
基本数据类型,它的值就是一个数字,一个字符或一个布尔值。  
引用数据类型,也就是说引用指向的不是数据本身,而是它所在的内存地址.
eg:
(1)int  a;  
        a=250; //声明变量a的同时,系统给a分配了空间。
(2)Date a,b;                    //在内存开辟两个引用空间
       a  =  new Date();     //开辟MyDate对象的数据空间,并把该空间的首地址赋给a
       b  =  a;                          //将a存储空间中的地址写到b的存储空间中

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
要理解这个问题必须要把内存中的几个区域分清楚。内存分为:堆,栈,方法区,静态区,寄存器(毕老师上课有提到)。其中堆、栈最重要。基本数据类型存在栈区,当你声明一个基本数据类型时,就会在栈区中分配地址,这时内存中的值是乱七八糟的。当我们在内存中用new对象时,引用在栈区,new的对象在堆区,引用存的是堆对象的地址(指向),例如: String s1 = new String(“abc”);"abc"存在堆区,引用s1存在栈区,s1中存的是“abc”的堆地址。
回复 使用道具 举报
举个简单例子说明
class A{
   private int age;
   private String name;
}
int是基本数据类型,当你new A()得时候,age自动赋值为0;
但是对于引用类型name来说,此时只会分配一个引用,指向null, 当你想使用name得时候不能直接引用,必须实例化之后才能使用。
否则,会引起空指针exception
回复 使用道具 举报
所有的基本数据类型不存在“引用”的概念,基本数据类型都是直接存储在栈内存的,数据本身的值就是存储在栈空间里面
而Java语言里面只有这八种数据类型是这种存储方式  引用是存储在栈内存,而对象本身的值存储在堆内存 引用指向了堆内存中的地址
也就是说引用数据类型保存的是对象在内存中的地址 而不是数据本身
回复 使用道具 举报
本帖最后由 toShareBeauty 于 2013-7-26 05:25 编辑

楼上面说的都是错的,基本数据类型和引用数据类型本质区别不是什么时候分配内存,本质区别也不是一个在堆中分配一个在栈中分配(大部分情况下这句话对),本质区别是我们是不是通过引用来使用它们。

下面我具体反驳上面说法:
int a 如果是在定义在类的成员位置,那么a是在创建该对象的时候在堆中分配内存
static int a 如果是定义在类的成员位置,那么a是在加载该类的时候在方法区分配内存
int a 如果是在局部变量位置,是在 jvm 执行到这条语句所在函数的时候,在 jvm 的栈区中->该函数的栈帧中的-> local 变量区分配内存,local 变量就是局部变量啦
-------------------------------------------------------------------
Class 类型的对象在方法区
String 类型的对象也可以在方法区的类的常量池
所以上面的说法都有漏洞

基本数据类型和引用数据类型最本质的区别是我们使用它们的时候是直接使用还是通过引用来使用,引用和指针、句柄 概念差不多。内存模型视频里面有说过,直接使用和通过引用使用这个说法你能理解吧。



点评

需要好好消化下,确实够味儿  发表于 2014-4-17 17:28
回复 使用道具 举报 1 0
java的8种基本类型:byte,short, char, int, long,float,double,boolean.与此对应的,java提供了8种包装类型:Byte,Short,Character,Integer,Long,Float,Double,Boolean.它们之间的相互转换:例如:double a=1;//把double基本类型转换为Double包装类型Double b=new Double(a);//把Double包装类型转换为double基本类型a=b.doubleValue();所谓引用,就是指针了,就是说对象指向的不是数据本身,而是它所在的内存地址.数组就是引用类型!一般在传参的时候用的最多。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马