关于Java函数中的传值问题

最近编程的时候经常遇到编写工具类的情况,有时候是对传入的值进行修改,有的是返回一个变量。那么出现了一个问题当是对传入的值进行修改的时候需要返回吗?如果不返回能否达到修改的目的呢?那么就引申到了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函数时要注意一下变量是否改变哟!

你可能感兴趣的:(Java)