Java中的方法(method)

1. 什么是方法(method)

  • 方法就是一个代码片段. 类似于 C 语言中的 “函数”

2. 方法定义语法

// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
    
    
 方法体代码;
 [return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参...);

返回值的重要性:

  • 避免在方法内直接输出,在调用时定义一个变量接收返回值;
  • 为了支持链式表达式:可以将当前函数的返回值 作为另一个函数的参数 ,或者在另一个函数中进行运算。(一个很好的例子 计算 1! + 2! + 3! + 4! + 5!,见另一博客)。
  1. 代码示例: 实现一个方法实现两个整数相加。
class Test {
    
    
 public static void main(String[] args) {
    
    
 int a = 10;
 int b = 20;      
 // 方法的调用
 int ret = add(a, b);
 System.out.println("ret = " + ret);
 }
 // 方法的定义
 public static int add(int x, int y) {
    
    
 return x + y;
 }
}
// 执行结果
ret = 30

注:

  1. 方法定义时, 参数可以没有,每个参数要指定类型。
  2. 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void。
  3. 方法的定义必须在类之中, 代码书写在调用位置的上下均可。
  4. Java 中没有 “函数声明” 这样的概念。

3.方法调用的执行过程

基本规则:

  1. 定义方法的时候, 不执行只有调用的时候才执行。
  2. 当方法被调用的时候, 会将实参赋值给形参。
  3. 参数传递完毕后, 就会到方法体中执行代码。
  4. 当方法执行完毕之后(遇到 return 语句), 回到方法调用位置继续往下执行。
  5. 一个方法可被多次调用。

4. 实参和形参的关系

方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”。

例:交换两个变量的值。

public class TestDemo {
    
    
    public static void main(String[] args) {
    
    
        int a=10;
        int b=20;
        swap(a,b);//a,b 为实参
        System.out.println("a="+a+", b="+b);
    }
    public static void swap(int x,int y){
    
    // x,y为形参
        int t=x;
        x=y;
        y=t;
    }
}
//运行结果:
a=10, b=20
  • 方法swap()用来交换两个变量的值,但是通过运行发现交换未成功。

原因分析

  • 对于基础类型来说, 形参相当于实参的拷贝。即 传值调用, 对 x 和 y 的修改, 不影响 a 和 b的值。
  • 在java中栈上的地址是拿不到的,只有将数据放到堆上才能完成这项工作。

解决方法:传引用类型参数 (例如数组来解决这个问题)

public class TestDemo {
    
    
    public static void main(String[] args) {
    
    
        int[] arr ={
    
    10,20};
        //java当中的数组是引用类型,可想象成是一个指针
        //引用实际上就是一个变量  用来存储地址
        //{10,20}这种数组本身就是一个对象,它在堆上
        System.out.println("交换前a,b的值分别为:"+arr[0]+" "+arr[1]);
        swap(arr);
        System.out.println("交换后a,b的值分别为:"+arr[0]+" "+arr[1]);

    }
    public  static  void swap(int[] arr1){
    
    
        int t=arr1[0];
        arr1[0]=arr1[1];
        arr1[1]=t;
    }

}
//运行结果:
交换前a,b的值分别为:10 20
交换后a,b的值分别为:20 10

注:

  • swap(arr):arr是实参;
  • swap(int[] arr1):arr1 是形参:
  • 调用swap方法时,将arr的内容拷贝到arr1上,此时相当于arr与arr1同时指向堆上的{10,20},这个数组,所以通过 改动 arr1 能直接影响 arr, 通过arr去访问0 ,1 下标会发现内容的变化。

5.方法的重载

  • 众所周知,方法调用时类型要匹配,并且不能有两个同名的方法
  • sum(int x,int y) 是实现两个int类型的加法,若要实现1.0 +1.5,是不允许的,此时需写两个方法实现不同类型的加法:sumInt(int x,int y) ,sumDouble(double x,double y),这样一个个起名过于麻烦,此时我们可以用到方法的 重载

如下:

public class TestDemo {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("1+2="+sum(1,2));
        System.out.println("1.0+2.0="+sum(1.0,2.0));
    }
    public static int sum(int x,int y){
    
    
        return x+y;
    }
    public static double sum(double x,double y){
    
    
        return x+y;
    }
}
运行结果:
1+2=3
1.0+2.0=3.0

什么是重载?
用一个函数同时兼容多种参数的情况。
需满足三种要求(针对同一个类):

  1. 方法名相同
  2. 方法的参数不同(参数个数或者参数类型)
  3. 方法的返回值类型不影响重载

例:可变参数编程:

    public static void main(String[] args) {
    
    
        System.out.println(sum(1,2));
        System.out.println(sum(1,2,3,4));
    }
    //可变参数编程,传过来的数据可以看成是一个数组
    //局限性:int... arr传过来的数据一定都是相同的类型
    public static int sum(int... arr){
    
    
        int ret=0;
        for (int x:arr){
    
    
            ret +=x;
        }
        return ret;
    }
}
//运行结果:
3
10

猜你喜欢

转载自blog.csdn.net/Aug_IK/article/details/112255884