java语言 百分网手机站

Java语言中方法之间数据传递的探讨

时间:2020-09-03 17:02:06 java语言 我要投稿

Java语言中方法之间数据传递的探讨

  导语:在面向对象的Java语言中,方法是处理数据的基本模块,方法之间的数据传递是掌握编程方法的关键。下面就由小编为大家介绍一下Java语言中方法之间数据传递的探讨,欢迎大家阅读!

  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;i<6;i++)

  System.out.print(“ ” +a[i]+“ ”);

  System.out.println(“ ”);

  SelectSort(a,n);

  System.out.print(“选择排序后的情况:”);

  for(int i=0;i<6;i++)

  System.out.print(“ ” +a[i]+“ ”);

  }

  static voidSelectSort(int arr[],int n)

  {int temp,p;

  for(int i=0;i  { p=i;

  for(int j=i+1;j  if(arr[p]>arr[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  return sum/n;

  }

  }

  例3的输出结果如下所示:

  aver=248.18

  本例中“static double aver(double a[],int n)”是方法头。double是该方法的返值类型,即基本数据类型;参数double a[]是引用传递,参数intn是数值传递。语句“return sum/n;”是将sum/n的值返回给方法的调用者。

  3.2方法的返值为对象的引用

  另一种返值类型是对象引用。这种情况一般是:主调方法传递的是对象的地址,被调方法的形式参数是对应类型的引用,该方法的返值类型是同一类型的引用。返值为引用的方法见例4。

  [例4]返值为引用的方法举例:

  // ReturnReference.java 参考源代码如下:

  import java.io.*;

  publicclassReturnReference

  {public static void main(String args[])

  {example x=new example(),y;

  x.setdata(123,“ABCD”);

  System.out.println( x.getx()+“,”+x.gety());

  y=tranobjct(x);

  System.out.print(x.getx()+“,”+y.gety());

  }

  static exampletranobjct(examplew)

  {System.out.println( w.getx()+“,”+w.gety());

  w.setdata(456,“efhi”);

  System.out.println( w.getx()+“,”+w.gety());

  example z=new example();

  z.setdata(567,“MNIJ”);

  returnz;

  }

  }

  classexample

  {int x; Stringy;

  public void setdata(int a,Stringb)

  {x=a;y= new String(b); }

  public int getx(){return x; }

  public String gety(){return y; }

  }

  例4程序的运行结果如下所示:

  123,ABCD

  123,ABCD

  456,efhi

  456,MNIJ

  例4的具体情况如图2所示:

  图2可知:x和w引用所指的是同一个无名对象,所以,以w引用对对象的操作实质就是对x引用所指对象的操作。而 “example z=new example();”语句也创建一个无名对象,设置数据成员后,通过“returnz; ”将此引用返给方法的调用者,使得引用y指向该对象,故有以上输出。

  “tranobjct(x)”语句是将example类对象的引用(地址)x传递给tranobjct方法,而在tranobjct()方法中形式参数是example 类的对象的引用w。经过语句“w.setdata(456,”efhi“);”修改参数后,数据显示结果说明对象的数据成员修改正确。

  又有“example z=new example();”语句创建一个新的对象z,通过“z.setdata(567, “MNIJ”);”语句将其数据成员分别设置为“567”和“MNIJ”,并由“returnz;”语句将example类型的引用返回给方法的调用者,即将example对象的引用z返值给同类的引用y。由“System.out.println(x.getx()+”,“+y.gety());”语句看出, “x.getx()”返回的是原对象经过“w.setdata(456,”efhi“);”语句修改后的数据成员x 的值;而“y.gety()”返回的是“z.setdata(567,”MNIJ“);”语句操作后数据成员y的值。

  4结语

  有些资料将“static exampletranobjct(examplew)”方法称之为返值为对象的方法,笔者不能苟同。上述方法的返值类型貌似example类型的对象,其实质还是“example”类型对象的引用。何以见得?Java语言创建对象的一般格式是:类名 引用名=new 类名([初始化参数]);语句的“new 类名([初始化参数])”部分是创建一个无名对象,再通过赋值操作将无名对象的首地址赋值给一个引用名,今后将以该引用来操作这个无名的对象。故不能将上述方法称为返值是对象的方法。

【Java语言中方法之间数据传递的探讨】相关文章:

Java的jar文件中读取数据的方法11-27

从Java的jar文件中读取数据的方法09-28

Java中的数据结构09-26

从Java的jar文件中如何读取数据的方法11-27

C语言中函数之间地址传递方式09-27

java语言super使用方法11-12

Java中String类的方法10-03

java输入数据流的方法有哪些12-07

Java语言中SDK/JDK/JRE和JVM之间的关系10-01

JAVA语言常用的算法和数据结构有哪些09-27