java $1参数_java中方法参数的一些总结(1)

1.问题说明

在C++中,函数调用时有传值调用和传址调用两种方式,但在Java中只有传值调用一种方式。Java中的方法参数为那几种基本数据类型的情况跟C++中一样,传入的只是变量的拷贝。而当参数类型为类对象时,则有可能会误以为是传址调用。

2.测试用例

现在此举出例子并加以说明

publicclassAClass {intdata;

}

该类为作为测试用的类,里面只有一个域。

2.1第一个用例:

publicclassParameterTest {publicstaticvoidmain(String[] args) {

AClass a=newAClass();

a.data=10;

test1(a);

System.out.println(a.data);

}publicstaticvoidtest1(AClass aClass) {

aClass.data=0;

}

}

执行过程:

先构造一个新的实例,并为其赋值为10。再调用方法test1(),在该方法中将data的值设为0。然后程序又回到方法体外面,输出结果为0。

在此看来,貌似方法调用时传的是地址,因为对data域的改动影响到了方法体外面。那么再来看下一个例子。

2.2第二个用例:

publicclassParameterTest {publicstaticvoidmain(String[] args) {

AClass a=newAClass();

a.data=10;

test2(a);

System.out.println(a.data);

}publicstaticvoidtest2(AClass aClass) {

AClass b=newAClass();

b.data=100;

aClass=b;

}

}

此时同样构造一个新的实例,并将其数据域赋值为10,再调用方法test2()。与方法test1()不同的是,在该方法中又定义了一个新的实例(其值为

100),然后使传入的参数指向该实例。该方法执行完毕后,输出的结果为10。看来在方法体中的操作出了方法后就没有作用了,这样的话又不像是在传址了。

那是为什么呢?

3.运行过程说明

3.1 对于第一个测试用例

构造实例并为其数据赋值后(如下图),产生一个指向实例的引用a:

1.1.bmp

调用方法test1()时(如下图),a'为引用a的一个拷贝,它也指向当前的实例:

1.2.bmp

当在test1()的方法体中修改数据域的值时(如下图):

1.3.bmp

因为在方法体中,传入的引用的拷贝指向没有发生改变,所以它修改了数据域的值后会影响到原来的实例的值。

3.2 对于第二个测试用例:

同样,构造实例并为其赋值后,再调用方法test2()。在方法体中传入的依然是引用的一个拷贝。如下图:

2.1.bmp

在方法test2()中构造一个新的实例并为其赋值100后,如下图:

2.2.bmp

在方法体中为传入的引用的拷贝再次赋值后,它指向了方法体中产生的实例b,如下图:

2.3.bmp

经过上图,可以看出:在方法体中传入的引用的拷贝指向确实改变了,它指向了新构造的实例b。但是在方法体外面,原来的实例指向还是没变,所以这回的输出还是10。

4.小结

在Java的方法调用中,方法中的参数是以传值的形式进行的,不管它是什么数据类型。如果是基本数据类型,则就是传入该值的一个拷贝;如果是类类型,则传入的是引用的一个拷贝。归根结底还是传的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值