前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于java传参

关于java传参

作者头像
java达人
发布2018-01-31 17:43:36
1.8K0
发布2018-01-31 17:43:36
举报
文章被收录于专栏:java达人java达人java达人

有一个比较经典的例子,如果你能说出此题的结果,说明你是java内存解析能手:

public class Test1 {
  public static class ParamTest {
   // 初始值为0
   protected int num = 0;
   // 为方法参数重新赋值
   public void change(int i) {
   i = 5;
   }
   // 为方法参数重新赋值
   public void change(ParamTest t) {
   ParamTest tmp = new ParamTest();
   tmp.num = 9;
   t = tmp;
   }
   // 改变方法参数的值
   public void add(int i) {
   i += 10;
   }
   // 改变方法参数属性的值
   public void add(ParamTest pt) {
   pt.num += 20;
   }
   public static void main(String[] args) {
   ParamTest t = new ParamTest();
   System.out.println("参数--基本类型");
   System.out.println("原有的值:" + t.num);
   // 为基本类型参数重新赋值
   t.change(t.num);
   System.out.println("赋值之后:" + t.num);
   // 为引用型参数重新赋值
   t.change(t);
   System.out.println("运算之后:" + t.num);
   System.out.println();
   t = new ParamTest();
   System.out.println("参数--引用类型");
   System.out.println("原有的值:" + t.num);
   // 改变基本类型参数的值
   t.add(t.num);
   System.out.println("赋引用后:" + t.num);
   // 改变引用类型参数所指向对象的属性值
   t.add(t);
   System.out.println("改属性后:" + t.num);
   }
   }
 }

输出结果:

参数--基本类型 原有的值:0 赋值之后:0 运算之后:0

参数--引用类型 原有的值:0 赋引用后:0 改属性后:20

这次听取高手建议,画一个内存图试试:

通过内存图,我们可以很清楚地看到,t.num的值始终都是0,到最后执行add(ParamTest pt)之后其值才变成20,至于前面的三个方法执行的结果都是针对简单变量,或其他对象的num属性,要理解这个例子,我觉得理解参数变量的传值机制很重要,参数是简单变量,则采用值传递,是引用类型变量,则采用引用地址传递。因此,我们可以看到,在执行change(t.num)与add(t.num)之后,t所指向对象的num属性并未发生变化,因为这是值传递,t.num值赋给i,方法对i进行操作,这并不改变num属性。而add(ParamTest pt)与change(ParamTest pt)采用引用传递,方法对传入的引用所指向的对象进行操作。

内存图画得似乎不是很详细,希望和有兴趣的人多多交流。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档