Java参数传递中的传值和传址的区别——SCJP真题解析Q31

声明:本套SCJP(310-55)试题是08年版本,请报考SCJP的朋友绕道去找最新试题,我没有考过也不去考SCJP,只是拿来复习巩固Java基础的,解析部分仅仅是本人的拙见,如有错误欢迎指正。

QUESTION 31:
Given the exhibit:
01. class Foo {
02.     private int x;
03.     public Foo(int x) {
04.         this.x = x;
05.     }
06.     public void setX(int x) {
07.         this.x = x;
08.     }
09.     public int getX() {
10.         return x;
11.     }
12. }
13.  
14. public class Submit {
15.     static Foo fooBar(Foo foo) {
16.         foo = new Foo(100);
17.         return foo;
18.     }
19.  
20.     public static void main(String[] args) {
21.         Foo foo = new Foo(300);
22.         System.out.print(foo.getX() + "-");
23.  
24.         Foo fooFoo = fooBar(foo);
25.         System.out.print(foo.getX() + "-");
26.         System.out.print(fooFoo.getX() + "-");
27.  
28.         foo = fooBar(fooFoo);
29.         System.out.print(foo.getX() + "-");
30.         System.out.print(fooFoo.getX());
31.     }
32. }

What is the output of the program shown in the exhibit?
A. 300-100-100-100-100
B. 300-300-100-100-100
C. 300-300-300-100-100
D. 300-300-300-300-100

Answer: B

涉及知识点:
1.Java中的参数传递有传值和传址两种;
2.基本类型和String型作为参数时,为传值方式,只把值传入方法,不管在方法中怎么处理这个参数,原值不变;
3.其他引用类型作为参数时,为传址方式,将指向内存中的地址传入方法,方法中此内存地址中的值发生变化时,原值也会改变;
4.例外:
    (1)如果引用类型的对象通过传址方式将其指向内存中的地址传入方法后,方法中使用new关键字重新给参数赋值时,会在内存中重新开辟空间,参数指向新的内存空间,此时参数和原对象指向的就不是同一个地址了,参数值的变化不会改变原值;
    (2)String型是引用类型,但是String型作为参数,是传值方式,可以通过以下两种方式来理解:
        <1>String本质上是基本类型的char[],基本类型作为参数时,为传值方式;
        <2> 字符串在内存中是存储在堆中的一个常量,String对象指向内存中这个常量的地址,通过传址方式将地址传入方法后,方法中如果通过字符串给参数赋值,则 会重新在堆中创建一个字符串常量,并指向这个地址,原值依然指向原来的字符串常量地址,参数值的变化不会改变原值,如果通过new关键字给参数赋值,参见 (1)中的解释。


解析:
1.“Foo foo = new Foo(300);”,此时foo.getX()的值为300;
2.“Foo fooFoo = fooBar(foo);”, 因为Foo是引用类型,main方法中的foo通过传址的方式将其指向的地址传给fooBar方法中的foo,此时两个foo指向同一个地 址,foo.getX()的值都为300;通过“new Foo(100)”给fooBar方法中的foo赋值后,该foo重新指向了一个新的地 址,foo.getX()的值为新地址中的值100,而main方法中的foo仍然指向原来的地址,foo.getX()的值没有改变,仍为 300;fooBar将foo的值返回给fooFoo,因此fooFoo.getX()的值为100;
3.“foo = fooBar(fooFoo);”,同2中的解释,foo.getX()的值变为100,fooFoo.getX()的值没有变化,仍为100;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16856446/viewspace-678516/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16856446/viewspace-678516/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值