关于Java函数中的传值问题

来源:互联网 发布:微信加友软件人脉神器 编辑:程序博客网 时间:2024/05/30 22:52

最近编程的时候经常遇到编写工具类的情况,有时候是对传入的值进行修改,有的是返回一个变量。那么出现了一个问题当是对传入的值进行修改的时候需要返回吗?如果不返回能否达到修改的目的呢?那么就引申到了Java函数的传值问题了。下面给大家讲一下Java中的函数调用传值问题。
1、问题的起源
问题起源于c语言,先看下面一段代码。

#include <stdiu.h>//传值调用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函数时要注意一下变量是否改变哟!

原创粉丝点击