论文部分内容阅读
摘要方法的参数有形式参数和实际参数两种形式。根据参数数据类型的不同,当实际参数向形式参数传递值时,有着不同的传递方式。对于初学者而言,由于不能深入理解参数传递在内存中是如何分配的,容易导致参数传递错误。本文从实例出发,讲述参数传递的两种方式,为开发者提供借鉴。
关键词形式参数 实际参数 值传递 引用传递
中图分类号:TP312文献标识码:A
Parameter Values Transfer and Pass by Reference Comparison in Jave
PENG Jian, TANG Ying
(Jiangxi Financial and Economics Vocational School, Jiujiang, Jiangxi 332000)
AbstractParameter of method have two forms of formal parameters and actual parameters. According to different types of parameters data, when the actual parameters transfer value to formal parameters, it has different transfer mode. For beginners, they unable to deeply understand how parameters transfer allocate in memory, it is easy to cause the parameters transfer errors. This paper, starting from examples to talk about the two passing ways of parameter passing.
Key wordsformal parameters; actual parameters; value transfer; pass by reference
0 引言
在Java語言中,成员方法可以有多个不同数据类型的参数,也可以一个参数都没有。对于参数我们需要区分形式参数和实际参数的概念。形式参数是指定义成员方法时,括号里面的参数名字。实际参数是指在程序代码中调用成员方法时,传递给方法的参数。而对于参数值传递和引用传递的区分是令初学者头疼不已的一个问题。
1 基本数据类型形式参数的值传递
Java语言中基本类型包括:int,double等。当形式参数为基本类型时,程序采用单向值传递的形式,即将实际参数的值复制一份给形式参数,形式参数值的变化不影响原来的实际参数。示例如下:
public class First{
static int test(int x,int y){
System.out.println("运算前形参:x="+x+" y="+y);
x=x*2;//改变形参x的值
y=y-1;//改变形参y的值
System.out.println("运算后形参:x="+x+" y="+y);
return x+y;
}
public static void main(String[] args){
int a=4,b=5,c;
System.out.println("运算前实参:a="+a+" b="+b);
c=test(a,b);
System.out.println("运算后实参:a="+a+" b="+b);
}
}
运行结果如下:
运算前实参:a=4 b=5;运算前形参:x=4 y=5
运算后形参:x=8 y=4;运算后实参:a=4 b=5
从结果可以看出,两个实际参数在运算前后都没有发生变化,而形式参数的值则发生了改变,说明基本类型参数是单向值传递。
2 引用类型形式参数的引用传递
程序中经常需要把一个对象作为实际参数进行传递,这和基本类型数据的值传递情况是不同的,因为此时传递的是对象的引用(地址)。当实参对象的引用(地址)被复制给形参时,对形参对象内容进行改变也就是对实参对象内容进行改变。例如:
class Second{int v=0;}
public class Third{
static void test(Second x,int y){
x.v=1;//改变形式参数对象x的成员变量值
y=5;//改变形式参数基本类型(int)变量y的值
}
public static void main(String[] args){
Second a=new Second();
int b=4;
System.out.println("运算前实参:a.v="+ a.v + " b="+b);
test(a,b);
System.out.println("运算后实参:a.v="+ a.v + " b="+b);
}
}
运行结果如下:
运算前实参:a.v=0 b=4;运算后实参:a.v=1 b=4
从结果可以看出,当把对象作为方法的参数时,由于它传递的是对象的引用(地址),因此形式参数对象内容的改变会影响到实际参数,而基本类型没有影响。
3 数组参数传递比较
数组属于引用类型,它既可用来存放基本类型数据,又可以用来存放引用类型数据。从本质上说把数组作为参数传递,与引用类型参数传递是一致的。例如:
public class Four{
public static void test(int[] x,Second[] y){
for(int i=0;i<3;i++)
{x[i]++;y[i].v++;}
}
public static void main(String[] args){
int[] a={1,2,3};
Second[] b={new Second(),new Second(),new Second()};
System.out.print("基本类型数组传递前元素的值:");
for(int i=0;i<3;i++)
System.out.print(a[i]+" ");
System.out.println();
System.out.print("引用类型数组传递前元素对象属性v的值:");
for(int i=0;i<3;i++)
System.out.print(b[i].v+" ");
System.out.println();
test(a,b);
System.out.printl("基本类型数组传递后元素的值:");
for(int i=0;i<3;i++)
System.out.print(a[i]+" ");
System.out.println();
System.out.print("引用类型数组传递后元素对象属性v的值:");
for(int i=0;i<3;i++)
System.out.print(b[i].v+" ");
System.out.println();
}
}
运行结果如下:
基本类型数组传递前元素的值:1 2 3。
引用类型数组传递前元素对象属性v的值:0 0 0。
基本类型数组传递后元素的值:2 3 4。
引用类型数组传递后元素对象属性v的值:1 1 1。
从结果我们可以看出,用数组作为参数传递可以改变实际参数的值。说明数组实现的是引用传递。
4 总结
通过比较可以看出:基本类型形参采用的是值传递,即复制实参数据,形参的改变不影响实参;而引用类型形参采用的是引用传递,即复制实参的引用地址,形参的改变实质上就是改变实参。开发者只有深入理解参数传递的本质,才能在程序开发中运用自如,提高代码质量。
参考文献
[1]张白一,崔尚森.面向对象程序设计——Java.西安电子科技大学出版社,2006.
[2]王克宏.Java技术及其应用.高等教育出版社,1999.
关键词形式参数 实际参数 值传递 引用传递
中图分类号:TP312文献标识码:A
Parameter Values Transfer and Pass by Reference Comparison in Jave
PENG Jian, TANG Ying
(Jiangxi Financial and Economics Vocational School, Jiujiang, Jiangxi 332000)
AbstractParameter of method have two forms of formal parameters and actual parameters. According to different types of parameters data, when the actual parameters transfer value to formal parameters, it has different transfer mode. For beginners, they unable to deeply understand how parameters transfer allocate in memory, it is easy to cause the parameters transfer errors. This paper, starting from examples to talk about the two passing ways of parameter passing.
Key wordsformal parameters; actual parameters; value transfer; pass by reference
0 引言
在Java語言中,成员方法可以有多个不同数据类型的参数,也可以一个参数都没有。对于参数我们需要区分形式参数和实际参数的概念。形式参数是指定义成员方法时,括号里面的参数名字。实际参数是指在程序代码中调用成员方法时,传递给方法的参数。而对于参数值传递和引用传递的区分是令初学者头疼不已的一个问题。
1 基本数据类型形式参数的值传递
Java语言中基本类型包括:int,double等。当形式参数为基本类型时,程序采用单向值传递的形式,即将实际参数的值复制一份给形式参数,形式参数值的变化不影响原来的实际参数。示例如下:
public class First{
static int test(int x,int y){
System.out.println("运算前形参:x="+x+" y="+y);
x=x*2;//改变形参x的值
y=y-1;//改变形参y的值
System.out.println("运算后形参:x="+x+" y="+y);
return x+y;
}
public static void main(String[] args){
int a=4,b=5,c;
System.out.println("运算前实参:a="+a+" b="+b);
c=test(a,b);
System.out.println("运算后实参:a="+a+" b="+b);
}
}
运行结果如下:
运算前实参:a=4 b=5;运算前形参:x=4 y=5
运算后形参:x=8 y=4;运算后实参:a=4 b=5
从结果可以看出,两个实际参数在运算前后都没有发生变化,而形式参数的值则发生了改变,说明基本类型参数是单向值传递。
2 引用类型形式参数的引用传递
程序中经常需要把一个对象作为实际参数进行传递,这和基本类型数据的值传递情况是不同的,因为此时传递的是对象的引用(地址)。当实参对象的引用(地址)被复制给形参时,对形参对象内容进行改变也就是对实参对象内容进行改变。例如:
class Second{int v=0;}
public class Third{
static void test(Second x,int y){
x.v=1;//改变形式参数对象x的成员变量值
y=5;//改变形式参数基本类型(int)变量y的值
}
public static void main(String[] args){
Second a=new Second();
int b=4;
System.out.println("运算前实参:a.v="+ a.v + " b="+b);
test(a,b);
System.out.println("运算后实参:a.v="+ a.v + " b="+b);
}
}
运行结果如下:
运算前实参:a.v=0 b=4;运算后实参:a.v=1 b=4
从结果可以看出,当把对象作为方法的参数时,由于它传递的是对象的引用(地址),因此形式参数对象内容的改变会影响到实际参数,而基本类型没有影响。
3 数组参数传递比较
数组属于引用类型,它既可用来存放基本类型数据,又可以用来存放引用类型数据。从本质上说把数组作为参数传递,与引用类型参数传递是一致的。例如:
public class Four{
public static void test(int[] x,Second[] y){
for(int i=0;i<3;i++)
{x[i]++;y[i].v++;}
}
public static void main(String[] args){
int[] a={1,2,3};
Second[] b={new Second(),new Second(),new Second()};
System.out.print("基本类型数组传递前元素的值:");
for(int i=0;i<3;i++)
System.out.print(a[i]+" ");
System.out.println();
System.out.print("引用类型数组传递前元素对象属性v的值:");
for(int i=0;i<3;i++)
System.out.print(b[i].v+" ");
System.out.println();
test(a,b);
System.out.printl("基本类型数组传递后元素的值:");
for(int i=0;i<3;i++)
System.out.print(a[i]+" ");
System.out.println();
System.out.print("引用类型数组传递后元素对象属性v的值:");
for(int i=0;i<3;i++)
System.out.print(b[i].v+" ");
System.out.println();
}
}
运行结果如下:
基本类型数组传递前元素的值:1 2 3。
引用类型数组传递前元素对象属性v的值:0 0 0。
基本类型数组传递后元素的值:2 3 4。
引用类型数组传递后元素对象属性v的值:1 1 1。
从结果我们可以看出,用数组作为参数传递可以改变实际参数的值。说明数组实现的是引用传递。
4 总结
通过比较可以看出:基本类型形参采用的是值传递,即复制实参数据,形参的改变不影响实参;而引用类型形参采用的是引用传递,即复制实参的引用地址,形参的改变实质上就是改变实参。开发者只有深入理解参数传递的本质,才能在程序开发中运用自如,提高代码质量。
参考文献
[1]张白一,崔尚森.面向对象程序设计——Java.西安电子科技大学出版社,2006.
[2]王克宏.Java技术及其应用.高等教育出版社,1999.