假如我们需要分别求出从1到10,从20到30,从35到45的整数和,我们需要分别列出3个循环求和,不过这3个循环,除了开始的数和结尾的数不同之外,其他都是非常类似的,我们下面通过调用方法来一次性编写,程序清单如下:
public ststic int sum(int i1, int i2){
int sum=0;
for(int i=i1,i<=i2;i++)
sum=sum+i;
return sume;
}
public ststic void main(String args[]){
System.out.println("Sum from 1 to 10 is "+sum(1,10));
System.out.println("Sum from 20 to 30 is "+sum(20,30));
System.out.println("Sum from 35 to 45 is "+sum(35,45));
}
我们首先定义一个名为sum的方法,该方法带有两个参数i1和i2,main方法中的语句调用sum(1,10)计算从一到十的整数和,以此类推。
方法是为完成一个操作而组合在一起的语句组,在前面的文章中,我们已经使用过预定义的方法,例如:System.out.println、JOptionPane,showMessageDialog、JOptionPane.showInputDialog、Integer.parseInt、Double.parseDouble、Math.pow和Math.ranodm等等,这些方法都在java库中定义,在本片文章里,我们将学会如何定义自己的方法以及应用方法抽象来解决复杂问题。
1.定义方法
定义方法的语法如下:
修饰符 返回值类型 方法名(参数列表){
方法体;
}
就上面的例子而言,public static为修饰符,int 为返回值类型,sum为方法名,int i1,int i2为参数列表,方法体为下面的循环以及求和,return sum为返回值,方法可以不包含参数,例如Math.random()就没有参数。
方法体中包含一个定义方法做什么的语句集合,例如max方法的方法体使用一个if语句来判断哪个数比较大,然后返回该数的值,为使带返回值的方法能返回一个结果,必须要使用关键字return的返回语句,执行return语句就意味着方法停止。注意,在方法头中,需要对每一个参数进行独立的数据类型声明,例如:max(int n1, int n2)是正确的,而max(int n1, n2)是错误的。
2.调用方法
创建方法时,定义方法要做什么,为了使用方法,必须调用它,根据方法是否有返回值,调用方法有两种途径。如果方法返回一个值,那么对方法的调用就当作一个值来处理,例如: int larger=max(3,4);如果方法返回void,对方法的调用必须时一条语句,例如println返回void:System.out.println("welcome to java");每当调用一个方法时,系统都会将参数,局部变量存储在一个称为堆栈的内存区域中,它用后进先出的方式存储数据,当一个方法调用另一个方法时,调用者的堆栈空间保持不动,新开辟的空间处理新方法的调用,一个方法结束返回到调用者时,其相应的空间也被释放。
3.参数的值传递
方法的威力在于它处理参数的能力,当调用带参数的方法时,实参的值传递给形参,这个过程称为通过值船体,如果实参时变量而不是直接量,则将该变量的值传递给形参,无论形参在方法中是否改变,该变量都不受影响,我们下面写出一个演示值传递效果的程序。
程序创建了一个能实现两个变量互换的swap方法,调用swap方法时传递两个实参,调用方法后,这两个实参并未改变,程序清单如下:
package testpassbyvalue;
/**
*
* @author mjd
*/
public class TestPassByValue {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int num1 =1;
int num2 =2;
System.out.println("Before invoking the swap method,num1 is"+num1+"num2 is"+num2);
swap(num1,num2);
System.out.println("After invoking the swap method,num1 is"+num1+"num2 is"+num2);
}
public static void swap(int n1,int n2){
System.out.println("\tInside the swap method");
System.out.println("\t\tBefore swapping n1 is"+n1+"n2 is"+n2);
int temp=n1;
n1=n2;
n2=temp;
System.out.println("\t\tAfer swapping n1 is"+n1+"n2 is"+n2);
}
}
在这个方法中,因为最后返回的是语句,所以使用的是public static void swap(int n1,int n2),而不是public static void int(int n1,int n2),这是本篇文章之前就提到过的。在调用swap方法前,num1为,num2为2,在调用方法后没有变化,它们的值没有因为调用swap方法而交换,那是因为实参num1和num2的值传递给n1和n2,但是n1和n2有自己独立于num1和num2的存储空间,所以,n1和n2的改变不影响num1和num2的内容。另一个转变是把swap中形参的名称改为num1,这样做也没有效果,因为当方法返回到调用者后就消失了,java只有值传递(没有引用传递),所以其实调用swap()时是把值赋给a、b,赋完后与c、d就没什么关系,c、d还是原来的值,其实就是值传递。
如果一定要用方法swap交换,用数组改写后就可以实现交换功能了:
public class Swap5
{
public static void main(String[] args)
{
int[] i = {3, 5};
swap(i);
System.out.println(i[0]);
System.out.println(i[1]);
}
public static void swap(int[] a)
{
int temp = a[0];
a[0] = a[1];
a[1] = temp;
}
}
从这里我们可以看出,只有用类型才可以交换。因为原生数据类型是直接赋值,而引用类型直接赋的是地址,地址指向的是同一个对象,所以能改变。
4.问题:将十进制数转换为十六进制数
计算机系统的程序设计经常会用到十六进制数,本篇文章介绍将十进制数转换为十六进制数的程序,首先我们要弄清算法,十六进制数就是16的0次幂乘h1+16的1次幂乘h2加到16的n次幂乘hn,这些数可以通过不断用十进制数除以16直到商为0结束,依次得到的余数是hn,....h1,h0。举个例子,比如十进制数123,123除以16商为7,余数为11,11就是h0,即为十六进制中的B,商7继续除以16,余数为7,商为0,结束,所以十六进制的123就是7B,程序清单如下:
package decimal2hexconversion;
import java.util.Scanner;
/**
*
* @author mjd
*/
public class Decimal2HexConversion {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Scanner input =new Scanner(System.in);
System.out.print("Enter a decimal number:");
int decimal = input.nextInt();
System.out.println("The hex number for decimal"+decimal+"is"+decimalToHex(decimal));
}
public static String decimalToHex(int decimal){
String hex = "";
while(decimal!=0){
int hexValue = decimal%16;
decimal = decimal/16;
hex = toHexChar(hexValue)+hex;
}
return hex;
}
public static char toHexChar(int hexValue){
if(hexValue<=9&&hexValue>=0)
return(char)(hexValue+'0');
else
return(char)(hexValue-10+'A');
}
}
程序正确运行,构建成功,如果要将十六进制转换为十进制,就按照上卖弄的公式,例如7B,B先转换为11,11*16的0次幂,加上7*16的1次幂,倒推即可,同理,二进制,八进制都是一样的。
下一篇文章我们会讲述方法中的剩余部分和数组,希望我们大家共同学习,一起进步,谢谢。