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

java数据类型、存储以及作为方法参数传递

2017-09-14 13:02 603 查看
首先JAVA分两种数据类型:基本数据类型、引用数据类型。基本数据类型:char、boolean、byte、short、int、long、float、double;引用类型则有:类、接口、数组等。

而java关于数据存放的地方有:寄存器(程序不可控)、栈(stack)、堆(heap)、常量区等,这篇文章主要是说栈和堆的存储。大家都知道基本类型对象存储在栈、引用类型对象存储在堆,你还可能知道 引用型对象的引用也在栈中,即Test s = new Test(),中s也是在栈中存储的。那么你有想过 int a=3中这个a存储在哪吗?其实它也是存储在栈中的,你可以把a=3这个当做一起储存在栈中。而引用类型则是由栈中的引用s保存着new
Test()的对象地址,真正对象是存储在堆中的。栈和堆的值都是可以被多个对象引用所指向的这,只需赋值=即可。但是如果修改a和s的值会有不一样的效果,即a=4 则将a引用对象变成4,源对象3是不变的,而如果改变s对象的某个属性或者调用set方法,则其他引用这个对象也会因此改变,除非在设置属性值之前修改s引用所指的对象,即调用new 或者赋值其他对象,那么再对s进行修改就不会影响其他引用该对象。

如果理解了上面,那么对象基本类型和引用类型作为参数进行方法调用也就不在话下。而对于java到底是使用值传递和引用传递。你只需记住,当基本类型作为参数是如func(int a){a=2};int a= 3; func(a),传递的值拷贝,进入func之后等于复制一份对象,里面如果修改都不关外面对象的事,而对于引用类型来说,传递的是引用的拷贝,即新建一个对象引用引用了之前的对象,那么方法内进行属性设置的话,外面的对象也会影响,除非方法内部修改引用拷贝的引用地址(new或者赋值等)。

关于引用传递有一些特例,像String等,其实不光String,还有一些Interger包装类,它们作为参数时,不会被修改。它们是不可变对象,并不是它们是用final修饰所以它们是不可变对象,不可变对象是指对于任何赋值操作都将重新生成一个对象,那不就是等于上面说的除非方法内部修改引用拷贝的引用地址吗。

引用一句话:方法调用的参数传递的实质都是传递栈中变量的一个副本,区别在于两种类型在栈中存放的形式不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java heap
相关文章推荐