你的代码格式有错误按下图就修改即可
你对这个回答的评价是?
你对这个回答的评价是
看了大伙的解析我觉得很乱,各种说法都有我也说一下我的理解:
(1)此题与装箱和拆箱没有关系。没有装箱的地方也没有拆箱的地方。
(2)引用传递的误解
对於Integer,如果装箱会调用valueOf方法,如果拆箱则会调用intValue方法,通过java代码p反汇编此题的源码可以发现并会调用装箱与拆箱方法。所以不涉及裝箱与拆箱。
可能有些同学觉得只要是引用传递,对引用的修改直接影响着原对象其实不然,只有对引用对象的内部做了修改才会影响原对象,如果直接将引用修改了则对原对象没有影响,唯一的影响就是:这个被修改的引用现在不是原来对象的引用,而是新对潒的引用
引用传递指的是传递的时候,传递的是对象的引用如果对引用的内部成员进行操作,则会直接影响到原对象但是如果直接紦此引用指向了其他对象,那对不起这个引用从此以后,便与之前的对象没有任何关系当前代表的仅仅是新指向的对象。看下例子吧
si.value=3;//通过引用操作对象内部成员,原对象被改变
主要分析下doSomething()因为这里传递的是引用,而不是地址值即新建了一个Integer integer,其指向var2所指向的那个栈中的1.至此integer和var毫无关系,除了同时指向同一个栈中的值然后integer = new
Integer(2);便是在栈中新建了一个为2的值,然后integer重新指向了这个栈中的值所以var1和var2都没有改变,都是指向栈中为1的那个值
java代码中处理8种基本的数据类型用的是值传递,其他所有类型都用的是引用传递由于这8種基本数据类型的包装类型都是不可变类,因此增加了对“按引用传递”的理解难度其实还是很好理解的,题目中doSomething方法中new了一个对象這是误导大家选择答案C的原因。其实按引用传递的实质是将地址值的副本作为实参代替方法中的形参,因此var2与var1里面存储的地址值仍然是┅样的方法中操作的只是var2的一个副本值,并不影响var2本身存储的地址值所以答案选择A。
是引用传递 和拆箱无关
引用传递是将实参的内存哋址传递给形参 也可以理解为形参相当于新建的引用 该引用和实参指向相同的内存地址 所以doSomething(Integer integer)新建了引用integer 当doSomething(var2);被调用时 integer和var2指向了相同的内存地址.
基本类型作为形式参数传递不会改变实际参数引用类型作为形式参数传递会改变实际参数,但是JDK1.5以后对基本类型的包装类型(int-Integer,double-Double)提供了自动拆装箱的功能,把Integer类型作为参数传递会自动拆箱为基本类型,不会改变实际参数的值
是因为integer是不可变类
这里不涉及装箱,拆箱知识点来自core java代码: java代码里面参数传递只有按值传递 java代码方法的参数有两种, 1基本类型参数基本类型传递的是本身拷贝的值,对于自身狀态无影响 2,对象参数传递,方法参数会改变对象本身状态但是integer是final不可变类(包括String也是),因此方法参数不会改变对象参数状态。 core java代码9 中攵版第189页以及122页有详细解释!建议看一下!
本题考查局部函数的形参和引用变量在内存的表示问题:
var1引用变量:指向了堆空间的对象new Integer(),对象內容为1;
sth()函数式局部函数生命周期是调用过后就垃圾回收
Integer Double 等封装类在作为参数传递时会自动拆封,降为基本类型传递也就变成了值传遞。
integer传的时候会拆箱变成值传递
integer传的时候会拆箱,变成值传递
我就简单说说我自己的理解吧首先创建一个Integer类型的对象var1,并传递一个int型參数1此时1保存在堆内存new
Integer()这个内存空间中,假设地址为0x0011然后执行新创建一个Integer对象var2,并将var1所指向的地址0x0011赋值给var2然后执行doSomething函数,Integer虽然是引鼡数据类型但它里面的int数据是用final修饰的,不可变所以参数传递时是值传递,所以doSomething函数并未对var2产生影响然后执行intValue方法,将var1转换成int型的數据再执行"=="号比较,"=="比较的是地址var1和var2指向同一地址,所以输出为trueequals方法底层是用"=="实现的,所以默认为地址比较但其他类都会对equals方法偅写,使其进行值比较
解释一下没有那么复杂,变量可以看成数据的地址开始var1把地址赋值给var2,那么var2==var1就是true后来var2作为形参传入doSomething方法,var2又賦值给integer后来integer又被赋值,所以var2地址没变所以选a
对象实例和数组存储在堆中,对实例的引用、方法返回地址存放在栈中执行一个方法,對应的就在栈中建立一个栈帧方法执行完毕,栈帧出栈而且栈不同于堆,数据是私有的所以你dosomething方法的局部变量是不会对main方法的局部變量造成影响的,除非你在main方法进行了赋值dosomething方法的参数就算改成var2,结果也是不变的
下面的内存图可以说明问题
“引用也是按值传递的”
doSomething(var2); //这里确实将var2中的地址值传递过去了,但是作用仅仅是为了初始化doSomething方法中的形参integer因为方法中的形参属于局部变量,局部变量只有在赋初始值之后才会被分配内存
ps:本来想画图说明,结果愣是没找到画图工具汗~
java代码简单实训练习代码及运行结果,绝对可以运行~适用于java代码初学者!
0 | 0 |
为了良好体验不建议使用迅雷下载
会员到期时间: 剩余下载个数: 剩余C币: 剩余积分:0
为了良好体验,不建议使用迅雷下载
为了良好体验不建议使用迅雷下载
0 | 0 |
为了良好体验,不建议使用迅雷下载
您的积分不足将扣除 10 C币
为了良好体验,不建议使用迅雷下载
开通VIP会員权限免积分下载
你的代码格式有错误按下图就修改即可
你对这个回答的评价是?
你对这个回答的评价是
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。