最近编程的时候经常遇到编写工具类的情况,有时候是对传入的值进行修改,有的是返回一个变量。那么出现了一个问题当是对传入的值进行修改的时候需要返回吗?如果不返回能否达到修改的目的呢?那么就引申到了Java函数的传值问题了。下面给大家讲一下Java中的函数调用传值问题。
1、问题的起源
问题起源于c语言,先看下面一段代码。
#include
//传值调用
void change(int a,int b){
int flag = a;
b = a;
a = flag;
}
//传址调用
void change2(int *a,int *b){
int flag = *a;
*a = *b;
*b = flag;
}
void main(){
int a = 1;
int b = 2;
//传值调用,因此主函数中的a,b的值不会改变
change(a,b);//->a=1,b=2
//传址调用,因此改变的是地址上的内容,因此主函数中的a,b的值发生改变
change2(&a,&b);//->a=2,a=1
}
这段代码中是c语言中的传址、传值调用。其中传值调用是指的传入函数中的变量只传入相应的值,也就是说变量本身的内容不会发生改变(也就是说change中的a,b与main中的a,b不是相同的变量);传址调用是指,传入子函数的是变量的地址,也就是说子函数改变的就是地址上的内容(也就是change2中的*a,*b就是main中的a,b)。
2、Java中的函数(方法)调用是哪种方式?
Java中的函数调用大体分三类:
(1)8大基本类型(byte,short,int,long,float,double,char,boolean)
8大基本类型是运用的传值调用,看一下例子:
public void change(int a,int b){
int flag = a;
a = b;
b = flag;
}
public static void main(String args[]){
int a = 1;
int b = 2;
change(a,b);//->a=1,b=2
}
(2)引用类型
引用类型往函数中传入的是引用,而引用中存储的其实就是存储地址,也就是变形后的传址调用。
public void change(StringBuffer a,StringBuffer b){
StringBuffer flag = new StringBuffer(a);
b = a;
a = flag;
}
pubic static void main(String args[]){
StringBuffer a = new StringBuffer("1");
StringBuffer b = new StringBuffer("2");
change(a,b);//->a="2",b="1"
}
(3)特殊的String类型
大家都知道,其实String类型也是引用类型,但是它并不适用(2)中所说的传址调用,大家看一下代码
public void change(String a,String b){
String flag = a;
b = a;
a = flag;
}
pubic static void main(String args[]){
String a = "1";
String b = "2";
change(a,b);//->a="1",b="2"
}
打断点我们可以看出,子函数中的a,b与main函数中的a,b并不一样,可以看出String类型实际上是传值调用。
3、结论
Java中基本类型加String类型都是传值调用,其余的引用类型都是传址调用。大家在用Java函数时要注意一下变量是否改变哟!