【前言】
“气死我了,气死我了。这个破软考,不考了。”
“怎么了呀,洋妹妹!”
“你瞎呀!没看做题不会嘛。”
“…………”
“什么题呀?让我看看,我没准能帮帮你呢!”
“哎,刚刚有点生气,都是这个破传值传址闹的。我从VB就开始折腾这个,能用的方法都用了,两年了还是搞不懂。不想考了。”
“不想考就别考了。”
“……,你是要上天不?”
“开玩笑,开玩笑。我保证你没有把能用的方法都用了。至少你从来没问过我呀!/贱笑”
“那你还不快点说!等我求你呢?/白眼”
“/冷汗,我哪儿敢啊。这不等你给我看题呢嘛 。”
【正文】
“那,就是这个!”
“哦哦,那咱先说这个传值和传地址的问题。先不看题。”
“我们来两个小例子”
<span style="font-size:18px;"><pre name="code" class="java"><span style="font-size:24px;">main()
{
//按值传递
int val = 20 ;
print(val) ; //打印的是20
setVal(val);
print(val) ; //打印的还是20
//按引用传递
StringBuffer val = new StringBuffer("234");
print(val.toString()) ;//打印的是234
setStringVal(val) ;
print(val.toString()) ;//打印的是234
changeStringVal(val);
print(val.toString()) ;//打印的是234123
}
void setVal(int val)
{
val = 10 ;
}
void setStringVal(StringBuffer val)
{
val = new StringBuffer("345");
}
void changeStringVal(StringBuffer val)
{
val = val.append("123") ;
} </span></span>
“看,传值的set完有什么变化?”
“没看出来 /冷汗”
“恩,其实没啥变化。”
“我打死你……”
“那你觉得它为啥没有变化呢?”
“是因为按值传递的时候,print(val)这里的val(课本里管它叫形参)其实是把原来的int val =20 这里的val 值复制了一个,成为了一个新的val(课本里叫它实参),而函数内对val进行操作其实是对新复制的val进行操作,那么自然原来的value不会有任何改变了。“
“哦,这样呀!那传地址呢?”
"传地址的话,形参( setStringVal(val)这里的val)就是指向原来value的
地址。我们变成图一步一步代码来看。”
PS:图里的话最重要哦,别漏掉了
StringBuffer val = new StringBuffer("234")
现在出现了函数调用(忘了说,传值和传地址是两种函数调用方式,就是说
它是在调用函数的时候才会出现的区别
)
然后函数内部代码执行
void setStringVal(StringBuffer val)
{
val = new StringBuffer("345");
}
最后我们打印实参val
最后changestringval 会改变实参是因为形参还是指向了实参的盒子(地 址), void changeStringVal(StringBuffer val)
{
val = val.append("123") ;
}
【总结】
“这就是实参和形参的区别了。”
“因为指向同一个盒子所以,改了实参,形参会变化,反之亦然。
而关于两种方式的参数类型限制。你先自己想想,下次再告诉你。”
“好吧,我先想想这个问题,这个我还有点晕呢。”
“哈哈,慢慢想别着急,自己想通了的才是自己的。”