Java语言程序设计(十一)方法的调用以及进制转换的具体实现

      假如我们需要分别求出从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次幂,倒推即可,同理,二进制,八进制都是一样的。

      下一篇文章我们会讲述方法中的剩余部分和数组,希望我们大家共同学习,一起进步,谢谢。

发表评论

登录后才能评论
服务中心
服务中心
联系客服
联系客服
返回顶部