摘要:在面向对象的Java语言中,方法是处理数据的基本模块,方法之间的数据传递是掌握编程方法的关键。本文将其方法间的数据传递归纳为:方法的实参和形参间的值传递和引用传递;方法的返回值可以分为基本数据或对象的引用;并通过实例进行了说明。
关键词:对象;引用;值传递;引用传递
中图分类号:TP312 文献标识码:A
1问题的提出
在面向对象的Java语言中,类是问题空间的高度抽象和概括,是一个模板,而对象是类的特例,解空间的具体实现则是由若干个类的对象集合而成。方法是类的动态属性,代表了类所具有的功能和操作。Java语言中的方法既可以在类中,也可以在接口中声明,但是,它们只能在类中实现。Java语言中的所有操作都是用方法来实现的。
一个方法通过另一个方法的调用被激活,一个被调用的方法被激活,既需要指定被调用方法的方法名,也需要为被调用的方法提供相应的数据,以便于被调用方法对数据的加工处理,乃至于将加工处理的结果返回给方法的调用者。
2Java语言中方法间的数据传递方法
方法是数据加工处理或相应操作的基本模块,为了实现某种需求而调用一个方法,需要为被调用的方法传递数据,以便于被调用的方法依据所提供的数据进行相应的操作。
C++语言的函数间的数据传递可以分为:数值传递、地址传递和引用传递。地址传递的形参是同类型的指针,由于指针操作的不安全等问题,Java语言屏弃了指针,故Java语言方法之间的数据传递只有数值传递和引用传递。
2.1方法间的数值传递
所谓的数值传递又称为值传递,数值传递的特征是:调用方法的实参可以是常量、变量或者是表达式,形参则是对应数据类型的变量。如果实参是变量,则实参和形参是相互独立的两个单元。在方法调用的过程中,实参的值将拷贝到形参中,此后形参的任何修改都不会影响实参。数值传递方法见例1。
[例1]数值传递调用方法举例:
importjava.io.*;
public class ValueTransmit
{publicstatic void main(Stringargs[])
{intx=5,y=66;
System.out.println(“在主方法,交换前的:x=”+x+“,y=”+y);
swap(x,y);
System.out.println(“在主方法,交换后的:x=”+x+“,y=”+y);
}
static voidswap(int x,int y)
{int temp;
System.out.println(“在swap方法未交换时:x=”+x+“,y=”+y);
temp=x;x=y;y=temp;
System.out.println(“在swap方法交换之后:x=”+x+“,y=”+y);
}
}
例1程序的输出结果如下所示:
在主方法, 交换前的:x=5,y=66
在swap方法未交换时:x=5,y=66
在swap方法交换之后:x=66,y=5
在主方法, 交换前的:x=5,y=66
在例1程序中,方法调用的“swap(x,y);”中的实在参数x,y是两个单元,而形式参数中的x,y又是两个单元,它们是互相独立的。所以,对形式参数的改变并不影响实在参数的内容;程序的运行结果也验证上述观点。具体参数传递请见图1所示。
2.2方法间的引用传递
方法之间的数据传递还有一种方法,就是引用传递。引用传递的实质就是将实在参数的地址传递给形式参数引用,也就是形式参数是实在参数的别名。引用传递方法请见例2。
[例2]引用传递方法举例:
// ReferenceTransmit.java 参考源代码如下:
importjava.io.*;
public class ReferenceTransmit
{publicstatic void main(Stringargs[])
{int a[]= {9,-3,6,22,-77,999},n=6;
System.out.print(“数组排序前的情况:”);
for(int i=0;iarr[j])p=j;
if(p!=i){temp=arr[p]; arr[p]=arr[i];arr[i]=temp;}
}
}
}
例2程序的执行结果如下所示:
数组排序前的情况:9-3622-77999
选择排序后的情况:-77-36922999
在例2程序的方法调用语句“SelectSort(a,n);”中,a是数组名,是地址常量,是数据区域的首地址;SelectSort(int arr[],int n)的形式参数arr[ ]是数组的引用,而不是数组声明或定义。在形式参数和实在参数的结合中,形式参数arr是实在参数a的别名。在方法SelectSort()中,对arr[i]的任何修改,实际上就是对实在参数a[i]的修改。程序的运行结果也证明了这一点。
3Java语言方法返值的分类
方法调用有时需要将方法的处理结果返回给方法的调用者,这样的方法将有返值。依据方法返值与否可以将方法分为无返值方法和有返值方法,本文的例1和例2中的方法都是无返值的方法。依据返值的具体数据类型又可以将方法分为返值为基本数据类型和返值为对象的引用的方法。
3.1方法的返值为基本数据
返值为基本数据的方法在定义方法时要给出基本数据类型说明符。Java语言中,方法的返值为基本数据类型的方法,定义格式为:
访问控制修饰返值数据类型 方法名(形参表)
{方法体主体部分
return表达式;
}
其中:访问控制修饰符可以是public、final、static等,用于标识该方法的访问控制属性以及作用域选择等;而返值数据类型就是Java语言的基本数据类型的标识符,用于表明该方法的返值为何种数据类型。返值为基本数据类型的方法请看例3。
[例3]返值为基本数据类型的方法:
// ReturnBasicDataType.java参考源代码如下:
import java.io.*;
publicclassReturnBasicDataType
{public static void main(String args[])
{doublearr[]={1.2,290.5,5.7,64.0,879.5},av;
av=aver(arr,5);
System.out.println(“ aver=”+av);
}
static double aver(double a[],int n)
{double sum=0.0;
for(int i=0;i