您的位置:首页 > 编程语言 > Java开发

Java中引用类型和值类型的不同

2016-08-13 22:06 323 查看
在Java编程过程中,经常有人会因为没有弄清楚引用类型与值类型的区别而导致各种稀奇古怪的Bug出现,而且出现了还不知道问题在哪里。这里将简单阐述一下两者的区别。

引用数据类型:该类型指向一个对象,而不是原始值。

这个如何理解呢?学过C或者C++的同学肯定知道指针这个东西,那么引用类型也可以类型的理解。就是说将该类型传给某个方法的时候,在该方法里面进行操作其实是该引用类型所指向的那片内存所在的数据。就好比同时将c引用类型变量传给了A方法和B方法,先让A方法改变c指向的对象的某个属性d,然后让B方法将c对象的属性d打印出来,会发现,这个d的值是在A方法里面修改的一样。

引用数据类型举例:类以及类创建的对象,数组,接口等等。

值类型:其实就是基本数据类型,如:数值型的有int,byte,long等,字符型有:char, 还有布尔类型:boolean。这种类型的数据变量在声明之后JVM会立刻为其分配内存空间。而不是像引用类型那样,将该变量又指向某个值所在的空间。                                                          

    
                                                                                                                                                                                                                             
                                                                                                                                                                                                                                

在Java编程过程中,经常有人会因为没有弄清楚引用类型与值类型的区别而导致各种稀奇古怪的Bug出现,而且出现了还不知道问题在哪里。这里将简单阐述一下两者的区别。

引用数据类型:该类型指向一个对象,而不是原始值。

这个如何理解呢?学过C或者C++的同学肯定知道指针这个东西,那么引用类型也可以类型的理解。就是说将该类型传给某个方法的时候,在该方法里面进行操作其实是该引用类型所指向的那片内存所在的数据。就好比同时将c引用类型变量传给了A方法和B方法,先让A方法改变c指向的对象的某个属性d,然后让B方法将c对象的属性d打印出来,会发现,这个d的值是在A方法里面修改的一样。

引用数据类型举例:类以及类创建的对象,数组,接口等等。

值类型:其实就是基本数据类型,如:数值型的有int,byte,long等,字符型有:char, 还有布尔类型:boolean。这种类型的数据变量在声明之后JVM会立刻为其分配内存空间。而不是像引用类型那样,将该变量又指向某个值所在的空间。

这个应该比较好理解了,也就是该类型的变量就是实实在在的原始数据了。要注意的是,和上面的例子相反,如果这时c是属于值类型的数据,那么将其传给A方法进行处理,然后在B方法打印c的话,此时会发现,c的值是没有改变的。

学过C或者C++的同学用传值和传址去理解,也是一样的。

这里特别指出,Java里面的集合经常有人会踩到的坑。例如List的add()和addAll()方法,当你进去的数据是引用类型数据的话,那么,无论你将该数据类型传到了多少个add()方法,用add过该引用数据类型的List去get()到的数据,都是同一个。那么这时候要注意了,你一旦将其修改,其实是修改了原始数据了。这个要特别注意,别以为你新建了一个集合,将数据add进去,然后用该新建的集合取出来的就是新的对象了,其实不是的,还是原来那个数据。

好了,关于Java的基本数据类型和引用数据类型的区别分析到这里,有什么不当的地方,望大神不吝指出。PS:这是第一次在CSDN发表博客,感觉写到很low。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java